Search code examples
memoryassemblyx86calling-convention

Understanding calling convention and stack pointer


I want to understand how should I use local variables and how to pass arguments to function in x86. I read a lot of guides, and they all wrote that the first parameter should be at [ebp+8], but it isn't here :/ WHat am I missing? What am I not understanding correctly?

number byte "724.5289",0

.code
main PROC

mov ebx,offset number ;making so that [ebp] = '7' atm
push ebx ;I push it on stack so I can access it inside the function
call rewrite

main ENDP

rewrite PROC
push ebp     ; push ebp so we can retrieve later
mov ebp, esp ; use esp memory to retrieve parameters and 
sub esp, 8   ; allocate data for local variable 

lea ebx, [ebp-8]
lea eax, [ebp+8]  ; i think here ebp+8 should point to the same now to which ebx did 
                  ;before function, but it does not, writechar prints some garbage ascii character
call writechar
call crlf     

rewrite ENDP

END main

Solution

  • You pass a pointer as argument to rewrite, and then pass its address on to writechar. That is you take the address twice. That is one too many :)

    You want mov eax, [ebp+8] instead of lea eax, [ebp+8]

    Also, you need to clean up the stack after yourself, which you don't do. Furthermore, make sure your assembler automatically emits a RET for the ENDP directive, otherwise you will be in trouble. You might want to write it out explicitly.