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。)