4

我正在运行一些汇编代码,但我无法弄清楚一行代码的作用。代码是:

 leaq   0(,%rax,4), %rdx

我知道lea基本上是一种mov指令,但它只移动地址。所以我们将某物的地址移动到%rdx(使%rdx“指向”堆栈上的某物)。我知道%rax堆栈上的指向(例如-28(%rbp)),但我很困惑如何将它与 4 相乘来得到我的答案。会%rdx指向4*(-28) = -112(%rbp)?

谢谢!

编辑:对于上下文,以下代码在此指令之前:

pushq   %rbp 
movq    %rsp, %rbp 
movl    %esi, -28(%rbp)
movl    -28(%rbp), %eax 
cltq 
leaq    0(,%rax,4), %rdx
4

2 回答 2

4

您的等效 C 代码类似于:

extern int32 arr[];
int my_func(int32 n, ...) {
   int32 a=n;
   ...
   arr[a];
   ...
}

n 作为单个 32 位寄存器 esi 传递,存储到本地堆栈帧。该参数随后用于评估 64 位表达式 4*a。如果链接器应该将它重定位到地址“arr”,则可以解释“0”。

那么我的猜测是汇编代码不是由 生成的 gcc -S foo.c,而是由gcc -c foo.c; objdump -d foo.o

   // Similar code from a 32-bit machine
   0:   55                      push   %ebp
   1:   89 e5                   mov    %esp,%ebp
   3:   8b 45 08                mov    0x8(%ebp),%eax
   6:   8b 04 85 00 00 00 00    mov    0x0(,%eax,4),%eax
   d:   5d                      pop    %ebp
   e:   c3                      ret
   f:   90                      nop
于 2012-11-13T05:24:45.917 回答
1

我相信代码正在将地址中的任何内容%rbp-28移入%eax. 这可能是一个整数。然后它只是将其value*4移入%rdx%eax类似于方式的64位版本%ah是 的高位字节%eax)。这个问题似乎讨论了一个类似的问题。

于 2012-11-13T02:50:16.663 回答