为什么x86 16位寻址模式没有比例因子,而32位版本却具有比例因子?

时间:2019-04-12 18:51:40

标签: assembly x86 x86-16 addressing-mode

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

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

Image of all possible ways different components can be combined to create an effective address

16位和32位寻址模式之间的差异

Differences between 16- and 32-bit addressing modes

1 个答案:

答案 0 :(得分:4)

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字节(标度/索引/基数)的存在用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或Intel手册中的ModRM / SIB表。