编码 8 位操作数大小?是否有类似 16 位的前缀?
Encoding 8-bit operand size? Is there a prefix for that like for 16-bit?
在指令编码中默认大小为:
operand size is 32 bit
address size is 64 bit
我们可以使用旧前缀:
0x66 – Operand-size override prefix
使操作数大小为 16。如果我想让它成为 8 位而不是 16 位怎么办?
What if I want to make it 8 bits not 16?
你不能用前缀来做到这一点。支持 8 位操作数大小的指令使用完全独立的操作码,而不是使用覆盖前缀。
例如:
0: 01 d9 addl %ebx,%ecx
2: 66 01 d9 addw %bx,%cx
5: 00 d9 addb %bl,%cl
32 位 add
是操作码 01
,mod/rm 字节为 d9
。 16 位加法相同,但具有 66
操作数大小前缀。但是,8 位加法是操作码 00
。
对此的解释是历史性的。 16 位 8086 CPU 支持 8 位和 16 位操作数,并为两者使用单独的操作码:00
用于 addb
和 01
用于 addw
. (当你 运行 现代芯片处于实模式时,这仍然是你得到的,比如在引导扇区中。)32 位 80386 想要添加 32 位操作数,同时仍然支持 8 位和 16 位操作数,但是没有空间容纳更多的操作码,因此对于 32 位保护模式,他们将所有以前的 16 位指令改为 32 位指令,并提供一个覆盖以返回到 16 位,他们保留了 8 位单独的说明。 (在实模式下,操作数大小覆盖具有相反的效果:01
是 addw
而 66 01
是 addl
。)
在指令编码中默认大小为:
operand size is 32 bit
address size is 64 bit
我们可以使用旧前缀:
0x66 – Operand-size override prefix
使操作数大小为 16。如果我想让它成为 8 位而不是 16 位怎么办?
What if I want to make it 8 bits not 16?
你不能用前缀来做到这一点。支持 8 位操作数大小的指令使用完全独立的操作码,而不是使用覆盖前缀。
例如:
0: 01 d9 addl %ebx,%ecx
2: 66 01 d9 addw %bx,%cx
5: 00 d9 addb %bl,%cl
32 位 add
是操作码 01
,mod/rm 字节为 d9
。 16 位加法相同,但具有 66
操作数大小前缀。但是,8 位加法是操作码 00
。
对此的解释是历史性的。 16 位 8086 CPU 支持 8 位和 16 位操作数,并为两者使用单独的操作码:00
用于 addb
和 01
用于 addw
. (当你 运行 现代芯片处于实模式时,这仍然是你得到的,比如在引导扇区中。)32 位 80386 想要添加 32 位操作数,同时仍然支持 8 位和 16 位操作数,但是没有空间容纳更多的操作码,因此对于 32 位保护模式,他们将所有以前的 16 位指令改为 32 位指令,并提供一个覆盖以返回到 16 位,他们保留了 8 位单独的说明。 (在实模式下,操作数大小覆盖具有相反的效果:01
是 addw
而 66 01
是 addl
。)