【发布时间】:2020-12-09 23:28:46
【问题描述】:
哪些寄存器被认为是汇编中的“地址寄存器”?我认为答案类似于:所有段寄存器,加上EBP、ESP 和EIP,因为它们包含“地址”,如果我可以这么说的话。但令我惊讶的是,正确的答案实际上是:段寄存器和EIP。我找不到任何类型的解释,很难。为什么段寄存器和EIP被称为“地址寄存器”?为什么这些寄存器专门而不是其他一些寄存器? (P.S. 如果有任何区别,我使用的是 x86 NASM)
【问题讨论】:
-
一些架构(如 M68k)有专用的地址寄存器。 X86 只有通用寄存器,虽然在 16 位模式下,只有
bx、si、di和bp可用于显式内存操作数(sp用于一堆隐式内存操作数)。然而,“地址寄存器”这个词并不常用来描述 x86 上的任何东西。段寄存器ebp、esp、eip是“地址寄存器”的说法从何而来? -
这只是一个定义问题。无论如何,我认为没有人考虑段寄存器地址寄存器。
EIP甚至不是可直接访问的寄存器,但它被 cpu 用作地址。类似地,某些指令隐式使用ESP、ESI、EDI和EBP作为地址,但您可以显式使用其中任何一个和其余 GPR,例如[EAX]. -
“地址寄存器”没有适用于 ISA 的特定技术含义。没有广泛同意的规则可以使这种分类选择正确但其他分类不正确。 m68k 意义上的“地址寄存器”意味着它主要用于保存指针,但您不能将程序计数器用作数据指针。 (而且 32 位 x86 甚至没有 RIP 相对寻址。)因此,在这里进行分类的人使用了不同的解释。
-
段寄存器显然不是普通的地址寄存器。在保护模式下,他们选择一个 GDT 条目。不过,内部/隐藏段 base 拥有一个实际的线性地址。 (对于 FS 和 GS,可通过
wrmsr到MSR_FS_BASE/MSR_GS_BASE访问。对于其他人,只能通过修改选择器来触发加载新描述符。) -
基本上我不认为这是一个非常有用的概念,如果你这样做的话。一个有趣的问题是您可以在寄存器中保留多少数据指针,以便可以使用其中的任何一个,例如您可以一次循环多少个数组而不会用完寄存器。 “m68k 有多少个地址寄存器?包括堆栈指针在内的 8 个”。但这对于将 x86 与其他 ISA 进行比较并不是一个有用的定义。特别是考虑到 x86 几乎普遍与 ss.base = cs.base = ds.base = es.base 平面内存模型一起使用。
标签: assembly x86 cpu-architecture terminology cpu-registers