【问题标题】:effective address in assembly [duplicate]大会中的有效地址[重复]
【发布时间】:2021-12-25 05:22:45
【问题描述】:

我正在查看 x86-64 ISA,leaq 指令用于将地址加载到指定寄存器,我正在查看以下示例:

long m12(long x){
    return x *12;
}

相当于

leaq (%rdi, %rdi, 2), %rax
salq $2, %rax

我隐约明白这里的意思是leaq 没有引用计算出的“地址”给出的内存位置,而是直接重新定位计算出的“地址”。但是,%rdi 只保存一个整数。从某种意义上说,这是一个地址吗?

【问题讨论】:

  • 地址只是一个整数。计算机不知道整数是否是地址,它也不关心。它只是执行计算。

标签: c assembly x86 x86-64


【解决方案1】:

LEA 实际上与地址没有任何关系。虽然它是designed 以方便地址的计算,但数字实际上不必是地址和偏移量。请记住,LEA 不访问计算的“地址”,因此它通常也用于有效地计算不是地址的值。

leaq (%rdi, %rdi, 2), %rax   // rax = rdi + rdi*2 = 3*rdi

【讨论】:

  • 我们实际上还有另一个关于非指针 LEA 的规范问答,关于它如何只是编译器和人类以这种方式的移位和加法指令。 Using LEA on values that aren't addresses / pointers? 有趣地在问题中有完全相同的 C 源代码和 asm,所以它可能来自同一本书,所以它是一个完美的副本。
  • @Peter Cordes 酷酷。与您的相比,我的回答对细节有点轻描淡写,因为自 .com 时代以来我就没有使用过 x86 汇编程序。 :) 我升级了你的。
猜你喜欢
  • 2021-08-13
  • 2015-11-19
  • 1970-01-01
  • 1970-01-01
  • 2021-11-27
  • 2019-09-24
  • 2018-01-18
  • 1970-01-01
  • 2011-02-02
相关资源
最近更新 更多