首页 > 解决方案 > 为什么 x86 16 位寻址模式没有比例因子,而 32 位版本有呢?

问题描述

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

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

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

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

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

标签: assemblyx86x86-16addressing-mode

解决方案


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 字节(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 表。


推荐阅读