Assembly 一个32位寄存器和一个常量的指令怎么能只占用三个字节?

Assembly 一个32位寄存器和一个常量的指令怎么能只占用三个字节?,assembly,x86,disassembly,Assembly,X86,Disassembly,我正在回顾Visual Studio 2012中一些程序的反汇编,并看到以下内容: 65F920F3 or eax, 0FFFFFFFFh 65F920F6 jmp 65F92157 注意或。它占用地址F3-F5,这意味着它只占用三个字节。eax寄存器是四个字节,因此我假设常量0ffffffh也是四个字节 此指令如何适合三个字节?因为常量0xFFFFFFFF aka-1适合有符号字节,所以它可以使用有符号字节的编码作为立即操作数 那就是 83 C8

我正在回顾Visual Studio 2012中一些程序的反汇编,并看到以下内容:

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


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

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

那就是

83 C8 FF

83
ALOUP rm32、imm8
的通用操作码,ModRM字节
C8
具有组件
11\u 001\u 000
,其中
11
表示rm部分是寄存器,
001
是/r字段,并将指令转换为
000
表示rm操作数是
eax
<代码>FF
是imm8。

我不明白。src可以是imm8(到
AL
)或imm16/32到
(e)AX
。假设
或eAX
是单字节操作码,那么它至少需要两个字节(
FF FF
AH
作为第二个操作数)。单字节to
AL
如何使
eAX
成为
ffffff
?@AdrianoRepetti这不是它的工作原理,16位和32位(以及64位)版本的指令也有imm8(符号扩展)形式(顺便说一句,64位版本没有imm64形式,只有imm8和imm32)您是对的,如果正确理解或EAX,FFFFFFFFh编译为或EAX,FFh设置了x位,FF有符号8位,CPU符号将此值扩展到适当的大小,然后再将其添加到操作数中。。我的+1高亮显示,tnx@Jester
83/1
要完成这是将寄存器设置为所有寄存器的快捷方法