cod*_*art 5 x86 assembly addressing-mode x86-16
我试图找出 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],寄存器目标需要/rModRM 中的 3 位字段来编码 8 个 GP 寄存器中的哪一个。
(2 位“模式”表示它是寄存器还是内存,例如add bx, cxvs. add [bx], cx,以及有多少立即位移字节:disp8 / disp16 或无位移。)
在 32/64 位寻址模式中,ModRM 中的 r/m 字段可以是转义码,表示存在 SIB 字节(缩放/索引/基址),这为使用 2 编码缩放索引寻址模式提供了空间。 -位移位计数。
还有足够的编码空间让我们可以使用任何寄存器作为基址,以及任何寄存器(ESP 除外)作为索引。因此32位寻址模式使寄存器更加正交。看到rbp 不允许作为 SIB 基础吗?有关转义序列的详细信息,例如,[esp]始终需要 SIB 字节,因为意味着 base=ESP 的编码是 SIB 字节存在的转义代码。
有关更多详细信息,请参阅https://wiki.osdev.org/X86-64_Instruction_Encoding#32.2F64-bit_addressing_2或 Intel 手册中的 ModRM/SIB 表。