gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 00:13:33 25 4
gpt4 key购买 nike

我试图找出 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

最佳答案

16 位寻址模式只允许单个 ModRM 字节 对寄存器(3 位)、模式(2 位)和寄存器/内存操作数(3 位)进行编码,因此没有空间对比例因子进行编码,甚至无法让任意寄存器成为基数或索引。 NASM x86 16-bit addressing modes把它们都列出来,这不是一个很长的 list !只是 (BP|BX) + (DI|SI) + disp0/8/16 的子集.请记住,在像 add cx, [bx+si] 这样的指令中, 寄存器目的地需要 3 位 /r ModRM 中的字段来编码 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或英特尔手册中的 ModRM/SIB 表以了解更多详细信息。

关于assembly - 为什么 x86 16 位寻址模式没有比例因子,而 32 位版本有?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55657904/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com