Assembly 汇编:有人能解释一下leaq指令行的作用吗?

Assembly 汇编:有人能解释一下leaq指令行的作用吗?,assembly,64-bit,Assembly,64 Bit,我正在运行一些汇编代码,但我不知道一行代码是做什么的。代码是: leaq 0(,%rax,4), %rdx 我知道lea基本上是一种mov指令,但它只移动地址。因此,我们将某物的地址移动到%rdx(使%rdx指向堆栈上的某物)。我知道%rax在堆栈上指向什么(比如,-28(%rbp)),但我对如何将其乘以4来得到答案感到困惑。%rdx是否指向4*(-28)=-112(%rbp) 谢谢 编辑: 对于上下文,此指令前面有以下代码: pushq %rbp movq %rsp, %r

我正在运行一些汇编代码,但我不知道一行代码是做什么的。代码是:

 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

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

您的等效C代码类似于:

extern int32 arr[];
int my_func(int32 n, ...) {
   int32 a=n;
   ...
   arr[a];
   ...
}
n作为单个32位寄存器esi传递,该寄存器存储到本地堆栈帧。 然后,该参数用于计算64位表达式4*a。如果应该由链接器将“0”重新定位到地址“arr”,则可以对其进行解释

那么我猜汇编代码不是由
gcc-sfoo.c
,但由
gcc-cfoo.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

有时
lea
也用于计算。在您的情况下很难说,因为您没有提供足够的代码来查看。另外,外部的0似乎没有必要,因为它只是不向地址添加任何内容。除非您需要它来间接访问内存。@Fermat2357我在指令之前添加了代码摘要。希望这足够了,我同意;我认为
0
也毫无意义;它一定是由您可以看到的编译器生成的,
%esi
中的任何内容都将复制到堆栈上,然后复制到
%eax
。下一步
%eax
通过机器命令
cltq
扩展到64位
rax
。最后,
leaq
命令将
%rax
乘以4,并将其存储到
%rdx
中。为了确定这到底是怎么回事,我们需要看看
%rdx
以后会发生什么。您可能会认为表达式的计算结果是&arr[4*n]。(在反汇编中,我使用了arr[4*a],因此它使用mov而不是lea。)