指令编码中默认大小为:
operand size is 32 bit
address size is 64 bit
我们可以使用遗留前缀:
0x66 – Operand-size override prefix
使操作数的大小为16。如果我想把它变成8位而不是16位呢?
如果我想让它8位而不是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位的add是操作码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
。)