具有32位寄存器和常量的指令如何只占用三个字节?

时间:2015-02-10 10:43:32

标签: assembly x86 disassembly

我正在审核Visual Studio 2012中某些程序的反汇编,并看到以下内容:

65F920F3  or          eax, 0FFFFFFFFh  
65F920F6  jmp         65F92157  

请注意or。它占用地址F3-F5,这意味着它只占用三个字节。 eax寄存器是四个字节,因此我假设常量0FFFFFFFFh也是四个字节。

该指令如何适合三个字节?

1 个答案:

答案 0 :(得分:8)

因为常量0xFFFFFFFF aka -1适合有符号字节,所以它可以使用带有有符号字节的编码作为直接操作数。

那就是

83 C8 FF

83aluop rm32, imm8的一般操作码,ModRM字节C8具有组件11_001_000,其中11表示rm部分是寄存器, 001是/ r字段并将指令转换为or000表示rm操作数为eaxFF是imm8。