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