【问题标题】:Why don't x86 16-bit addressing modes have a scale factor, while the 32-bit version has it?为什么 x86 16 位寻址模式没有比例因子,而 32 位版本有呢?
【发布时间】:2019-09-03 14:08:38
【问题描述】:

我试图找出 x86 16 位寻址模式(MASM 程序集)中不存在比例因子的原因。而 32 位和 64 位寻址模式具有比例因子。这背后是否有实际原因或不需要它?如果您能解释一下,我将不胜感激。

可以组合不同组件以创建有效地址的所有可能方式:

16 位和 32 位寻址模式的区别

【问题讨论】:

  • 我认为这个解释不是严格的技术性的。 X86-16 ISA 是 40 年前为处理器设计的,其晶体管数量比现在的奔腾处理器少 100000 倍。当技术改进允许更丰富的指令集时,英特尔可能对设计 x86-32 比升级 x86-16 ISA 更感兴趣。
  • 我知道您只能有 5 个标签,但放置“x86”标签可能比您选择的其他标签更好。
  • 顺便说一句,您的图表是错误的。 32 位寻址模式永远不能使用 16 位位移,只能使用 0/8/32。也许这就是为什么它在你的第二个中用红色加粗? 32 位模式下的代码可以使用 16 位寻址模式,但这也限制了您使用 16 位寄存器(并且仅限于BX|BP + SI|DI

标签: assembly x86 x86-16 addressing-mode


【解决方案1】:

16 位寻址模式只允许单个 ModRM 字节对寄存器(3 位)、模式(2 位)和寄存器/内存操作数(3 位)进行编码,因此没有空间编码比例因子,甚至让任意寄存器成为基数或索引。 NASM x86 16-bit addressing modes 列出了所有这些,这不是一个长列表!只是(BP|BX) + (DI|SI) + disp0/8/16 的子集。请记住,在像 add cx, [bx+si] 这样的指令中,寄存器目标需要 ModRM 中的 3 位 /r 字段来编码 8 个 GP 寄存器中的哪一个。

(2位“模式”表示它是寄存器还是内存,例如add bx, cxadd [bx], cx,以及有多少立即位移字节:disp8 / disp16或没有位移。)

在 32/64 位寻址模式中,ModRM 中的 r/m 字段可以是一个转义码,表示存在 SIB 字节(Scale/Index/Base),这为空间提供了空间使用 2 位移位计数对缩放索引寻址模式进行编码。

还有足够的编码空间让我们可以使用任何寄存器作为基数,以及任何寄存器(ESP 除外)作为索引。因此 32 位寻址模式使寄存器更加正交。有关转义序列的详细信息,请参阅rbp not allowed as SIB base?,例如[esp] 总是需要一个 SIB 字节,因为意味着 base=ESP 的编码是 SIB 字节存在的转义码。

有关详细信息,请参阅https://wiki.osdev.org/X86-64_Instruction_Encoding#32.2F64-bit_addressing_2 或英特尔手册中的 ModRM/SIB 表。

【讨论】:

    猜你喜欢
    • 2020-06-18
    • 1970-01-01
    • 2022-10-24
    • 1970-01-01
    • 1970-01-01
    • 2018-03-31
    相关资源
    最近更新 更多