假设以下 x86-32 指令:
add ebx,1
(至少)有两种方法来组装此操作码:
81 c3 01 00 00 00
或
83 c3 01
第一个将 1 保留为 4 字节双字 第二个保留 1 作为一个字节
是否有一条指令将1保留为2个字节? 如果没有为什么?
最佳答案
您偶然发现了 x86 指令集的一个怪癖。 Intel 在词干 83
下包含了一组指令,其第一个操作数的类型为 Ev
,第二个操作数是立即数字节,其大小被解释为与Ev
操作数。因此,对于 83 c3 01
,01
被解释为 32 位值;对于 66 83 c3 01
,01 被解释为 16 位值(目标是 16 位 ax
寄存器)。在词干 6A
下编码的 push
助记符在其单个操作数的大小方面具有相同的行为方式。
您的问题的更广泛的答案是否定的,不存在将 16 位常量解释为 32 位常量的编码。
来源:我写了一个反汇编程序。
关于assembly - 有没有办法在 32 位寄存器指令中保留字大小的立即数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17379499/