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