Assembly 一个32位寄存器和一个常量的指令怎么能只占用三个字节?
我正在回顾Visual Studio 2012中一些程序的反汇编,并看到以下内容: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
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
作为第二个操作数)。单字节toAL
如何使eAX
成为ffffff
?@AdrianoRepetti这不是它的工作原理,16位和32位(以及64位)版本的指令也有imm8(符号扩展)形式(顺便说一句,64位版本没有imm64形式,只有imm8和imm32)您是对的,如果正确理解或EAX,FFFFFFFFh编译为或EAX,FFh设置了x位,FF有符号8位,CPU符号将此值扩展到适当的大小,然后再将其添加到操作数中。。我的+1高亮显示,tnx@Jester83/1
要完成这是将寄存器设置为所有寄存器的快捷方法