pauliwago
pauliwago

Reputation: 6695

ASSEMBLY: Could someone explain what this line with the leaq instruction does?

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

Answers (2)

Aki Suihkonen
Aki Suihkonen

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

emschorsch
emschorsch

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

Related Questions