我正在审查 Visual Studio 2012 中某些程序的反汇编,并看到以下内容:
65F920F3 or eax, 0FFFFFFFFh
65F920F6 jmp 65F92157
注意或
。它占用地址 F3-F5,这意味着它只占用三个字节。 eax
寄存器是四个字节,所以我假设常量 0FFFFFFFFh
也是四个字节。
这条指令如何放入三个字节?
最佳答案
因为常量 0xFFFFFFFF aka -1 适合带符号字节,所以它可以使用带符号字节的编码作为立即操作数。
原来如此
83 C8 FF
83
是 aluop rm32, imm8
的通用操作码,ModRM 字节 C8
具有组件 11_001_000
其中 11
表示 rm 部分是寄存器,001
是/r 字段并将指令转换为 或
, 000
表示 rm 操作数是 eax
。 FF
是 imm8。
关于assembly - 一个32位寄存器和一个常量的指令怎么可能只占用三个字节呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28429655/