Search code examples
functionassemblyparametersx86fasm

Function Parameters in ASM x86 FASM


How do I pass parameters to a function in Assembly? I did push Last Param, push Second Param, push First Param..

But I cannot access the parameters within Meh Function.. What I'm doing crashes the program..

format PE console                                ;Format PE OUT GUI 4.0
entry main

include 'macro/import32.inc'

section '.idata' import data readable           ;Import Section.
library msvcrt,'msvcrt.dll'
import msvcrt, printf, 'printf',\
exit,'exit', getchar, 'getchar'

section '.data' data readable writeable         ;Constants/Static Section.
InitialValue dd 0

section '.code' code readable executable
main:    
   push 67
   push 66
   push 65
   call MEH

   call [getchar]
   mov eax, 0
   ret 0

MEH:
   push ebx
   mov ebp, esp
   sub esp, 0

   mov eax, [ebp + 8]   ; Trying to print first parameter..
   push eax
   call [printf]
   add esp, eax

   mov esp, ebp
   pop ebx
ret

Solution

  • Let's see...

    Say your ESP is 0x00180078 on the outset, then after the three pushes you have

    00180078: 67
    00180074: 66
    00180070: 65
    

    then you call MEH, which immediately pushes ebx so now you have the stack as

    00180078: 67
    00180074: 66
    00180070: 65
    0018006C: return address
    00180068: ebx value
    

    you now load EBP with ESP = 00180068

    sub esp,0 does nothing
    
    mov eax, [ebp+8] ~ 00180068 + 8 = 00180070 = 65 
    

    so not the first but rather the last argument

       call [printf]
    

    Here comes your problem, though:

       add esp, eax
    

    What good was this supposed to do? Assuming printf preserves this argument passed in (which it is incidentally not required to do), why would you add the argument to the stack pointer? That is sure to mess up your return. What you want to do is restore esp to the value of ebp and pop back the saved ebx value.