I am trying to find the meaning of assembly code generated from a c program. Here is the program in C:
int* a = &argc;
int b = 8;
a = &b;
Here is the assembly code generated with explanations. There is one part that I do not understand:
Prologue of the main:
leal    4(%esp), %ecx
andl    $-16, %esp
pushl   -4(%ecx)
pushl   %ebp
movl    %esp, %ebp
pushl   %ecx
subl    $36, %esp
Load the address of argc in %eax:
movl    %ecx, %eax
The part I do not get:
movl    4(%eax), %edx
movl    %edx, -28(%ebp)
Stack-Smashing Protector code (setup):
movl    %gs:20, %ecx
movl    %ecx, -12(%ebp)
xorl    %ecx, %ecx
Load values in a and b (see in main.c):
movl    %eax, -16(%ebp)
movl    $8, -20(%ebp)
Modify the value of a (a = &b):
leal    -20(%ebp), %eax
movl    %eax, -16(%ebp)
Stack-Smashing Protector code (verify the stack is ok):
movl    $0, %eax
movl    -12(%ebp), %edx
xorl    %gs:20, %edx
je  .L7
call    __stack_chk_fail
If the stack is Ok:
.L7:
    addl    $36, %esp
    popl    %ecx
    popl    %ebp
    leal    -4(%ecx), %esp
    ret
So the part I do not uinderstand is modifying the value in -28(%ebp), an address never used. Does someone knows why is this part generated?
 
    