assembly - 为什么 x86 16 位寻址模式没有比例因子,而 32 位版本有呢?
问题描述
我试图找出 x86 16 位寻址模式(MASM 程序集)中不存在比例因子的原因。而 32 位和 64 位寻址模式具有比例因子。这背后是否有实际原因或不需要它?如果您能解释一下,我将不胜感激。
可以组合不同组件以创建有效地址的所有可能方式:
16 位和 32 位寻址模式之间的差异
解决方案
16 位寻址模式只允许单个 ModRM 字节编码寄存器(3 位)、模式(2 位)和寄存器/内存操作数(3 位),因此没有空间编码比例因子,甚至让任意寄存器是基数或索引。 NASM x86 16 位寻址模式将它们全部列出,这不是一个长列表!只是 的子集(BP|BX) + (DI|SI) + disp0/8/16
。请记住,在类似的指令add cx, [bx+si]
中,寄存器目标需要/r
ModRM 中的 3 位字段来编码 8 个 GP 寄存器中的哪一个。
(2位“模式”表示它是寄存器还是内存,例如add bx, cx
vs. add [bx], cx
,以及有多少立即位移字节:disp8 / disp16 或没有位移。)
在 32/64 位寻址模式中,ModRM 中的 r/m 字段可以是一个转义码,表示存在 SIB 字节(Scale/Index/Base),这为使用 2 编码缩放索引寻址模式提供了空间-位移计数。
并且还有足够的编码空间让我们可以使用任何寄存器作为基数,以及任何寄存器(ESP 除外)作为索引。因此 32 位寻址模式使寄存器更加正交。看到rbp 不允许作为 SIB 基础?有关转义序列的详细信息,例如[esp]
总是需要一个 SIB 字节,因为意味着 base=ESP 的编码是存在 SIB 字节的转义码。
有关更多详细信息,请参阅https://wiki.osdev.org/X86-64_Instruction_Encoding#32.2F64-bit_addressing_2或英特尔手册中的 ModRM/SIB 表。