微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

编码 8 位操作数大小?是否有类似 16 位的前缀?

如何解决编码 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,具有 d9 的 mod/rm 字节。 16 位加法是相同的,但带有 66 操作数大小前缀。然而,8 位加法是操作码 00

对此的解释是历史性的。 16 位 8086 CPU 支持 8 位和 16 位操作数,并为两者使用单独的操作码:00 用于 addb01 用于 addw。 (这仍然是您在实模式下运行现代芯片时得到的结果,例如在引导扇区中。)32 位 80386 希望添加 32 位操作数,同时仍支持 8 和 16,但没有空间如此多的操作码,因此对于 32 位保护模式,他们将所有以前的 16 位指令改为充当 32 位,并且可以覆盖以返回到 16 位,并且他们单独保留了 8 位指令。 (在实模式下,操作数大小覆盖具有相反的效果:01addw,而 66 01addl。)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。