Reputation: 6695
I'm running through some assembly code and I can't figure out what a line of code does. The code is:
leaq 0(,%rax,4), %rdx
I know lea
is basically a type of mov
instruction, but it only moves the address. So we are moving the address of something to %rdx
(making %rdx
"point" to something on the stack). I know what %rax
points to on the stack (say, -28(%rbp)
), but I'm confused by how to multiply that with 4 to get my answer. Would %rdx
point to 4*(-28) = -112(%rbp)
?
Thanks!
EDIT: For context, the following code precedes this instruction:
pushq %rbp
movq %rsp, %rbp
movl %esi, -28(%rbp)
movl -28(%rbp), %eax
cltq
leaq 0(,%rax,4), %rdx
Upvotes: 4
Views: 11744
Reputation: 20057
Your equivalent C code is something like:
extern int32 arr[];
int my_func(int32 n, ...) {
int32 a=n;
...
arr[a];
...
}
n is passed as a single 32-bit register esi, which is stored to local stack frame. The parameter is then used in evaluation the 64-bit expression 4*a. The '0' can be explained if it's supposed to be relocated by the linker to the address 'arr'.
Then my guess is that the assembly code is not generated by
gcc -S foo.c
, but by 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
Upvotes: 3
Reputation: 1669
I believe the code is moving whatever is at the address in %rbp-28
into %eax
. This will probably be an integer. Then it is just moving that value*4
into %rdx
(The 64 bit version of %eax
similar to the way %ah
is the high order bytes of %eax
). This question seems to discuss a similar issue.
Upvotes: 1