编码8位操作数大小?有16位的前缀吗?



指令编码中默认大小为:

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位指令。(在实模式下,操作数的大小覆盖有相反的效果:01addw,66 01addl。)

最新更新