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

sha*_*oth 2 x86 assembly disassembly

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

65F920F3  or          eax, 0FFFFFFFFh  
65F920F6  jmp         65F92157  
Run Code Online (Sandbox Code Playgroud)

请注意or.它占用地址F3-F5,这意味着它只占用三个字节.该eax寄存器是四个字节,所以我假定不变0FFFFFFFFh也是四个字节.

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

har*_*old 8

因为常量0xFFFFFFFF aka -1适合有符号字节,所以它可以使用具有有符号字节的编码作为立即操作数.

所以那是

83 C8 FF
Run Code Online (Sandbox Code Playgroud)

83是一般操作码aluop rm32, imm8,ModRM字节C8有组件11_001_000,其中11rm部分是寄存器,001是/ r字段并将指令转换为a or,000表示rm操作数是eax.FF是imm8.