我正在审核Visual Studio 2012中某些程序的反汇编,并看到以下内容:
65F920F3 or eax, 0FFFFFFFFh
65F920F6 jmp 65F92157
请注意or
。它占用地址F3-F5,这意味着它只占用三个字节。 eax
寄存器是四个字节,因此我假设常量0FFFFFFFFh
也是四个字节。
该指令如何适合三个字节?
答案 0 :(得分:8)
因为常量0xFFFFFFFF aka -1适合有符号字节,所以它可以使用带有有符号字节的编码作为直接操作数。
那就是
83 C8 FF
83
是aluop rm32, imm8
的一般操作码,ModRM字节C8
具有组件11_001_000
,其中11
表示rm部分是寄存器, 001
是/ r字段并将指令转换为or
,000
表示rm操作数为eax
。 FF
是imm8。