Mercurial > pub > dyncall > dyncall
comparison doc/disas_examples/x86.cdecl.disas @ 499:fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
author | Tassilo Philipp |
---|---|
date | Mon, 04 Apr 2022 15:50:52 +0200 |
parents | cb19b2fe2422 |
children | 585dcb68f55d |
comparison
equal
deleted
inserted
replaced
498:fd9ba3a6d348 | 499:fc614cb865c6 |
---|---|
713 | 713 |
714 ; ... snip, removed code of ctor and copy ctor ... | 714 ; ... snip, removed code of ctor and copy ctor ... |
715 | 715 |
716 | 716 |
717 | 717 |
718 ; ---------- C++ trivial and non-trivial aggrs as return values ----------> | |
719 ; | |
720 ; struct Trivial { int a; }; | |
721 ; struct NonTrivial { int a; NonTrivial() : a(0) {} NonTrivial(const NonTrivial& rhs) : a(rhs.a) { } }; | |
722 ; | |
723 ; extern "C" { | |
724 ; struct Trivial f1() { return Trivial(); } | |
725 ; } | |
726 ; | |
727 ; struct NonTrivial f2() { return NonTrivial(); } | |
728 ; | |
729 ; extern "C" { | |
730 ; void f() | |
731 ; { | |
732 ; int a=1; | |
733 ; a += 123; | |
734 ; struct Trivial t = f1(); | |
735 ; a -= 123; | |
736 ; struct NonTrivial n = f2(); | |
737 ; a -= 12; | |
738 ; } | |
739 ; } | |
740 | |
741 | |
742 | |
743 ; output from openbsd-4.0-x86 w/ gcc 3.3.5 (propolice) | |
744 | |
745 1c000920 <f1>: | |
746 1c000920: 55 push %ebp | |
747 1c000921: 89 e5 mov %esp,%ebp | |
748 1c000923: 83 ec 04 sub $0x4,%esp | |
749 1c000926: c7 45 fc 00 00 00 00 movl $0x0,0xfffffffc(%ebp) | |
750 1c00092d: 8b 45 fc mov 0xfffffffc(%ebp),%eax | |
751 1c000930: c9 leave | |
752 1c000931: c3 ret | |
753 | |
754 1c000932 <_Z2f2v>: | |
755 1c000932: 55 push %ebp | |
756 1c000933: 89 e5 mov %esp,%ebp | |
757 1c000935: 53 push %ebx | |
758 1c000936: 83 ec 04 sub $0x4,%esp | |
759 1c000939: 8b 5d 08 mov 0x8(%ebp),%ebx | |
760 1c00093c: 83 ec 0c sub $0xc,%esp | |
761 1c00093f: 53 push %ebx | |
762 1c000940: e8 87 00 00 00 call 1c0009cc <_ZN10NonTrivialC1Ev> | |
763 1c000945: 83 c4 10 add $0x10,%esp | |
764 1c000948: 89 d8 mov %ebx,%eax | |
765 1c00094a: 8b 5d fc mov 0xfffffffc(%ebp),%ebx | |
766 1c00094d: c9 leave | |
767 1c00094e: c2 04 00 ret $0x4 | |
768 1c000951: 90 nop | |
769 | |
770 1c000952 <f>: | |
771 1c000952: 55 push %ebp ; | |
772 1c000953: 89 e5 mov %esp,%ebp ; | |
773 1c000955: 83 ec 28 sub $0x28,%esp ; | |
774 1c000958: c7 45 f4 01 00 00 00 movl $0x1,0xfffffff4(%ebp) ; a = 1 | |
775 1c00095f: 8d 45 f4 lea 0xfffffff4(%ebp),%eax ; | | |
776 1c000962: 83 00 7b addl $0x7b,(%eax) ; | a += 12 | |
777 1c000965: e8 b6 ff ff ff call 1c000920 <f1> ; call f1() | |
778 1c00096a: 89 45 f0 mov %eax,0xfffffff0(%ebp) ; | |
779 1c00096d: 8d 45 f4 lea 0xfffffff4(%ebp),%eax ; | | |
780 1c000970: 83 28 7b subl $0x7b,(%eax) ; | a -= 123 | |
781 1c000973: 8d 45 d8 lea 0xffffffd8(%ebp),%eax ; space (at top of stack) to hold non-triv retval -> eax | |
782 1c000976: 83 ec 0c sub $0xc,%esp ; grow stack by 12 | |
783 1c000979: 50 push %eax ; hidden first arg: ptr to space for retval | |
784 1c00097a: e8 b3 ff ff ff call 1c000932 <_Z2f2v> ; call f2() | |
785 1c00097f: 83 c4 0c add $0xc,%esp ; shrink stack back by 12 | |
786 1c000982: 8d 45 f4 lea 0xfffffff4(%ebp),%eax ; | | |
787 1c000985: 83 28 0c subl $0xc,(%eax) ; | a -= 12 | |
788 1c000988: c9 leave ; | |
789 1c000989: c3 ret ; | |
790 | |
791 | |
792 | |
718 ; vim: ft=asm | 793 ; vim: ft=asm |
719 | 794 |