diff doc/disas_examples/x86.fastcall_borland.disas @ 327:c0390dc85a07

- doc: added disassembly examples for many platforms and calling conventions, for reference
author Tassilo Philipp
date Fri, 22 Nov 2019 23:08:59 +0100
parents
children b74d7a249642
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/disas_examples/x86.fastcall_borland.disas	Fri Nov 22 23:08:59 2019 +0100
@@ -0,0 +1,41 @@
+; #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
+