Mercurial > pub > dyncall > dyncall
diff doc/disas_examples/x86.thiscall_ms.disas @ 615:516d72e98253
- more thiscall disas examples
author | Tassilo Philipp |
---|---|
date | Sat, 01 Oct 2022 16:14:00 +0200 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doc/disas_examples/x86.thiscall_ms.disas Sat Oct 01 16:14:00 2022 +0200 @@ -0,0 +1,84 @@ +; class C { +; public: +; float m(int i) const { return float(i + 123); } +; }; +; +; extern "C" { +; float f() +; { +; C c; +; return c.m(27); +; } +; } + + + +; output from godbolt compiler explorer w/ msvc 19.0 + +_this$ = -12 +tv68 = -8 +tv67 = -4 +_i$ = 8 +float C::m(int)const PROC + push ebp ; + mov ebp, esp ; + sub esp, 12 ; + mov DWORD PTR _this$[ebp], ecx ; + mov eax, DWORD PTR _i$[ebp] ; + add eax, 123 ; | + mov DWORD PTR tv67[ebp], eax ; / in arg + 123, pushed onto stack + fild DWORD PTR tv67[ebp] ; \ + fstp DWORD PTR tv68[ebp] ; | float cast and put return value in fp0 + fld DWORD PTR tv68[ebp] ; | + mov esp, ebp ; + pop ebp ; + ret 4 ; +float C::m(int)const ENDP + +_c$ = -1 +_f PROC + push ebp ; + mov ebp, esp ; + push ecx ; + push 27 ; arg 1 + lea ecx, DWORD PTR _c$[ebp] ; arg 0 (this ptr) via ecx + call float C::m(int)const ; call C::m() + mov esp, ebp ; + pop ebp ; + ret 0 ; +_f ENDP + + + +; output from reactos-0.3.15-x86 w/ mingw gcc 4.7.2 (uses MS thiscalls; according to +; https://www.angelcode.com/dev/callconv/callconv.html MinGW has own thiscalls, +; so maybe ROSBE's MinGW has different behaviour or the web page sources are wong) + +00000000 <_f>: + 0: 55 push %ebp ; + 1: 89 e5 mov %esp,%ebp ; + 3: 83 ec 14 sub $0x14,%esp ; + 6: 8d 45 ff lea -0x1(%ebp),%eax ; this ptr -> eax + 9: c7 04 24 1b 00 00 00 movl $0x1b,(%esp) ; arg 1 via stack + 10: 89 c1 mov %eax,%ecx ; arg 0 (this ptr) via ecx + 12: e8 00 00 00 00 call 17 <_f+0x17> ; call C::m() + 17: 83 ec 04 sub $0x4,%esp ; + 1a: c9 leave ; + 1b: c3 ret ; + +00000000 <__ZNK1C1mEi>: + 0: 55 push %ebp ; + 1: 89 e5 mov %esp,%ebp ; + 3: 83 ec 08 sub $0x8,%esp ; + 6: 89 4d fc mov %ecx,-0x4(%ebp) ; + 9: 8b 45 08 mov 0x8(%ebp),%eax ; + c: 83 c0 7b add $0x7b,%eax ; | in arg + 123, pushed onto stack + f: 89 45 f8 mov %eax,-0x8(%ebp) ; | + 12: db 45 f8 fildl -0x8(%ebp) ; float cast and put return value in fp0 + 15: c9 leave ; + 16: c2 04 00 ret $0x4 ; + + + +; vim: ft=asm +