; #pragma pack(push, 1)
; struct TTest
; {
;     __int32 i1;
;     __int32 i2;
; };
; #pragma pack(pop)
; 
; TTest __fastcall DoTest()
; {
;     TTest t;
;     t.i1 = 1;
;     t.i2 = 2;
;     return t;
; }
; 
; ...
; TTest t = DoTest();

; from http://codeverge.com/embarcadero.cppbuilder.cpp/does-fastcall-have-any-bearing-on/1043767


DoTest():
  push ebp                     ; |
  mov ebp,esp                  ; | prolog
  add esp,-0x0c                ; |
  mov [ebp-0x04],eax           ; pointer to hidden param in eax -> local area
  mov [ebp-0x0c],0x00000001    ; val 1 -> local area
  mov [ebp-0x08],0x00000002    ; val 2 -> local area
  mov eax,[ebp-0x04]           ; refetch eax (pointlessly)
  mov edx,[ebp-0x0c]           ; get val 1 in edx and ...
  mov [eax],edx                ; ... store at *eax
  mov edx,[ebp-0x08]           ; get val 2 in edx and ...
  mov [eax+0x04],edx           ; ... store at *(eax + 4)
  mov eax, [ebp-0x04]          ; return value
  mov esp,ebp                  ; |
  pop ebp                      ; | epilog
  ret                          ; |

; vim: ft=asm

