home *** CD-ROM | disk | FTP | other *** search
/ Reverse Code Engineering RCE CD +sandman 2000 / ReverseCodeEngineeringRceCdsandman2000.iso / RCE / LordLucifer / win32asm / tutorials / r_tut1.txt < prev    next >
Text File  |  2000-05-25  |  3KB  |  90 lines

  1. Parameter Passing Conventions in Assembly 
  2.  
  3. By Lord Lucifer 
  4. September 2, 1998 
  5.  
  6.  
  7. Parameter Passing Conventions:  
  8. -----------------------------------------------------------------------------
  9.  
  10. C calling convention:
  11.   - Parameters are pushed in reverse order.
  12.   - The function caller adjusts the stack.
  13.  
  14. Stdcall calling convention:
  15.   - Most 32-bit Windows programs use this form.
  16.   - Parameters are pushed in reverse order.
  17.   - The called function takes care of stack adjustment.
  18.  
  19. Pascal calling convention:
  20.   - The 16-bit Windows API uses this form.
  21.   - Parameters are pushed in foward order.
  22.   - The called function takes care of stack adjustment.
  23.  
  24.  
  25. Accessing Parameters and Local Variables:  
  26. -----------------------------------------------------------------------------
  27.  
  28.   The stack frame allows parameters and local variables to be
  29.   easily accessed as offsets of register BP (or EBP).
  30.   Take this example function (which uses the stdcall convention):
  31.  
  32.       void _stdcall Function(long var1, long var2)
  33.       {
  34.         int local1;
  35.         int local2;
  36.  
  37.         local1 = var1;
  38.         local2 = var2;
  39.       }
  40.  
  41.   This is the memory map for the function call.
  42.             ____ ____
  43.       ...  |____|____|
  44.       A104 |____|____| - ESP
  45.       A108 |____|____| - local2    
  46.       A10C |____|____| - local1
  47.       A110 |____|____| - EBP
  48.       A114 |____|____| - Function return address
  49.       A118 |____|____| - var1  
  50.       A11C |____|____| - var2
  51.       ...  |____|____| 
  52.       F000 |____|____| - Bottom of stack
  53.  
  54.   To access in assembly the parameters or the locals, all
  55.   that is needed is the offset from EBP. Therefore:
  56.  
  57.       [ebp-4] would be the variable local1
  58.       [ebp-8] would be the variable local2
  59.       [ebp+08] would be the parameter var1
  60.       [ebp+0C] would be the parameter var2
  61.  
  62.   The (unoptimized) disassembly of this simple function is:
  63.  
  64.       Function    proc
  65.         push    ebp                     ; save ebp
  66.         mov     ebp,esp                 ; set ebp to current esp
  67.         add     esp,-8                  ; adjust esp to point beyond
  68.                                         ; the two local variables
  69.         
  70.         mov     eax,dword ptr [ebp+08]  ; copy var1 into temp eax
  71.         mov     dword ptr [ebp-4], eax  ; copy temp eax into local1
  72.  
  73.         mov     ebx,dword ptr [ebp+0C]  ; copy var2 into temp ebx
  74.         mov     dword ptr [ebp-8], ebx  ; copy temp ebx into local2
  75.  
  76.         add     eax,ebx                 ; add local1 and local2 into eax
  77.                                         ; eax is return value
  78.  
  79.         add     esp,8                   ; adjust esp to boint before the
  80.                                         ; two local variables
  81.                                         ; (point it to saved ebp)
  82.         pop     ebp                     ; restore ebp        
  83.         ret     8                       ; return from function call and
  84.                                         ; adjust stack past the 2 parameters
  85.       Function    endp    
  86.  
  87.  
  88. -----------------------------------------------------------------------------
  89. Copyright (C) 1998 
  90. Lord Lucifer (lord-lucifer@usa.net)