我试图找出x86 16位寻址模式(MASM组件)中不存在比例因子的原因。而32位和64位寻址模式具有比例因子。这背后有实际的推理还是不需要?如果您能解释,我将不胜感激。
将不同组件组合在一起以创建有效地址的所有可能方式:
16位和32位寻址模式之间的差异
答案 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, cx
与add [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表。