hi I have disassembled some programs (linux) I wrote to understand better how it works, and I noticed that the main function always begins with:
lea ecx,[esp+0x4] ; I assume this is for getting the adress of the first argument of the main...why ? and esp,0xfffffff0 ; ??? is the compiler trying to align the stack pointer on 16 bytes ??? push DWORD PTR [ecx-0x4] ; I understand the assembler is pushing the return adress....why ? push ebp mov ebp,esp push ecx ;why is ecx pushed too ??
so my question is: why all this work is done ?? I only understand the use of:
push ebp mov ebp,esp
the rest seems useless to me…
Advertisement
Answer
I’ve had a go at it:
;# As you have already noticed, the compiler wants to align the stack ;# pointer on a 16 byte boundary before it pushes anything. That's ;# because certain instructions' memory access needs to be aligned ;# that way. ;# So in order to first save the original offset of esp (+4), it ;# executes the first instruction: lea ecx,[esp+0x4] ;# Now alignment can happen. Without the previous insn the next one ;# would have made the original esp unrecoverable: and esp,0xfffffff0 ;# Next it pushes the return addresss and creates a stack frame. I ;# assume it now wants to make the stack look like a normal ;# subroutine call: push DWORD PTR [ecx-0x4] push ebp mov ebp,esp ;# Remember that ecx is still the only value that can restore the ;# original esp. Since ecx may be garbled by any subroutine calls, ;# it has to save it somewhere: push ecx