Mercurial > pub > dyncall > dyncall
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 +