汇编指针,绝对地址

Assembly pointer, absolute address

我是新手,我的爱好是独自练习计算机科学。 在汇编中,使用了一个基指针,它允许我通过从基指针减去某个偏移量来引用特定的内存位置。 得到的是绝对地址。 EBP - 偏移量 = 绝对地址。但是这个减法是在哪里进行的呢?

绝对地址是在哪个寄存器中计算的?

我举个我困惑的例子

如果我有 MOV dword ptr[EBP], 10 在这种情况下 EBP 寄存器的值代表绝对地址。

但如果我有 MOV dword ptr[EBP - 4], 10 在这种情况下,必须从 ebp 地址中减去 4 个字节。

这个操作在哪个寄存器中完成,这个计算的结果写在哪里?

如果你想把地址计算结果放在一个寄存器中,使用 LEA 代替 加载或存储,或者兼而有之。

当用于实际内存访问时,地址计算发生在加载或存储地址执行单元中的 AGU 内部,并且不会写回架构寄存器。它仅传递给 TLB 进行物理转换,然后写入存储缓冲区。 (或用于加载,用于探测 L1d 缓存)。这种内部添加有一些延迟,Intel CPU 在某些情况下甚至会尝试跳过它,导致如果他们猜错了就必须重播 uop。 ()

与 ARM 或其他一些 ISA 不同,x86 没有任何寻址模式将最终地址写回基址寄存器。

CPU 由很多 个晶体管组成。其中一些用于与命名寄存器分开的内部缓冲区和加法器。 [reg] 之外的寻址模式的要点是您可以使用它们 而无需 修改您当前在寄存器中的任何值。

正如 Jester 所说,它不是用户可见的。

大多数处理器都有多个寄存器,称为寄存器阵列,用于保存在应用程序执行期间必须快速访问的数据和指令。 其中之一是 Memory address register (MAR)

CPU 使用 MAR 来存储这些数据将被放置在系统 RAM 上的地址,或者它们将从哪里被访问。

PS:因为我的母语不是英语,所以我不能 100% 确定它能回答你的问题