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

64-bit, assembly

Solution

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

Problem

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 ```

Original source

Related problems