comparison doc/disas_examples/x64.win.disas @ 619:c754150fe87f

- x64 win disas example fix and addition
author Tassilo Philipp
date Mon, 03 Oct 2022 13:49:19 +0200
parents fc614cb865c6
children
comparison
equal deleted inserted replaced
618:f1810b5dbb3b 619:c754150fe87f
80 ret 0 ; | epilog 80 ret 0 ; | epilog
81 main ENDP 81 main ENDP
82 82
83 83
84 84
85 ; ---------- structs by value, struct in first call on reg arg boundary ----------> 85 ; ---------- structs by value, struct never in reg or on reg arg boundary ---------->
86 ; 86 ;
87 ; struct A { int i, j; long long l; }; 87 ; struct A { int i, j; long long l; };
88 ; 88 ;
89 ; void leaf_call(int b, int c, int d, int e, struct A f, int g, int h) 89 ; void leaf_call(int b, int c, int d, int e, struct A f, int g, int h)
90 ; { 90 ; {
130 mov DWORD PTR [rsp+24], r8d 130 mov DWORD PTR [rsp+24], r8d
131 mov DWORD PTR [rsp+16], edx 131 mov DWORD PTR [rsp+16], edx
132 mov DWORD PTR [rsp+8], ecx 132 mov DWORD PTR [rsp+8], ecx
133 push rsi 133 push rsi
134 push rdi 134 push rdi
135 sub rsp, 312 ; 00000138H 135 sub rsp, 312
136 mov BYTE PTR x$[rsp], 76 ; 0000004cH 136 mov BYTE PTR x$[rsp], 76
137 lea rax, QWORD PTR x$[rsp+1] 137 lea rax, QWORD PTR x$[rsp+1]
138 mov rdi, rax 138 mov rdi, rax
139 xor eax, eax 139 xor eax, eax
140 mov ecx, 219 ; 000000dbH 140 mov ecx, 219
141 rep stosb 141 rep stosb
142 lea rax, QWORD PTR $T1[rsp] 142 lea rax, QWORD PTR $T1[rsp]
143 mov rdi, rax 143 mov rdi, rax
144 mov rsi, QWORD PTR f$[rsp] 144 mov rsi, QWORD PTR f$[rsp]
145 mov ecx, 16 145 mov ecx, 16
153 mov r9d, DWORD PTR e$[rsp] 153 mov r9d, DWORD PTR e$[rsp]
154 mov r8d, DWORD PTR d$[rsp] 154 mov r8d, DWORD PTR d$[rsp]
155 mov edx, DWORD PTR c$[rsp] 155 mov edx, DWORD PTR c$[rsp]
156 mov ecx, DWORD PTR b$[rsp] 156 mov ecx, DWORD PTR b$[rsp]
157 call leaf_call 157 call leaf_call
158 add rsp, 312 ; 00000138H 158 add rsp, 312
159 pop rdi 159 pop rdi
160 pop rsi 160 pop rsi
161 ret 0 161 ret 0
162 nonleaf_call ENDP 162 nonleaf_call ENDP
163 163
164 a$ = 64 164 a$ = 64
165 $T1 = 80 165 $T1 = 80
166 main PROC 166 main PROC
167 push rsi 167 push rsi
168 push rdi 168 push rdi
169 sub rsp, 104 ; 00000068H 169 sub rsp, 104
170 mov DWORD PTR a$[rsp], 5 170 mov DWORD PTR a$[rsp], 5
171 mov DWORD PTR a$[rsp+4], 6 171 mov DWORD PTR a$[rsp+4], 6
172 mov QWORD PTR a$[rsp+8], 7 172 mov QWORD PTR a$[rsp+8], 7
173 lea rax, QWORD PTR $T1[rsp] 173 lea rax, QWORD PTR $T1[rsp]
174 lea rcx, QWORD PTR a$[rsp] 174 lea rcx, QWORD PTR a$[rsp]
185 mov r8d, 2 185 mov r8d, 2
186 mov edx, 1 186 mov edx, 1
187 xor ecx, ecx 187 xor ecx, ecx
188 call nonleaf_call 188 call nonleaf_call
189 xor eax, eax 189 xor eax, eax
190 add rsp, 104 ; 00000068H 190 add rsp, 104
191 pop rdi 191 pop rdi
192 pop rsi 192 pop rsi
193 ret 0 193 ret 0
194 main ENDP 194 main ENDP
195 195
582 ret 0 ; | 582 ret 0 ; |
583 f ENDP 583 f ENDP
584 584
585 585
586 586
587 ; ---------- structs by value, struct passed as vararg ---------->
588 ;
589 ; #include <stdlib.h>
590 ; #include <stdarg.h>
591 ;
592 ; struct A { int i, j; long long l; };
593 ;
594 ; void leaf_call(int b, int c, int d, int e, ...)
595 ; {
596 ; }
597 ;
598 ; void nonleaf_call(int a, int b, int c, ...)
599 ; {
600 ; int d, e, g, h;
601 ; struct A f;
602 ; va_list ap;
603 ; va_start(ap, c);
604 ; d = va_arg(ap, int);
605 ; e = va_arg(ap, int);
606 ; f = va_arg(ap, struct A);
607 ; g = va_arg(ap, int);
608 ; h = va_arg(ap, int);
609 ; /* use some local data */
610 ; *(char*)alloca(220) = 'L';
611 ; leaf_call(b, c, d, e, f, g, h);
612 ; va_end(ap);
613 ; }
614 ;
615 ; int main()
616 ; {
617 ; nonleaf_call(0, 1, 2, 3, 4, (struct A){5, 6, 7ll}, 8, 9);
618 ; return 0;
619 ; }
620
621
622
623 ; output from godbolt compiler explorer w/ msvc 19.0
624
625 leaf_call PROC
626 mov DWORD PTR [rsp+32], r9d ;
627 mov DWORD PTR [rsp+24], r8d ;
628 mov DWORD PTR [rsp+16], edx ;
629 mov DWORD PTR [rsp+8], ecx ;
630 ret 0 ;
631 leaf_call ENDP
632
633 ap$ = 64
634 h$ = 72
635 g$ = 76
636 e$ = 80
637 d$ = 84
638 $T1 = 96
639 f$ = 112
640 __$ArrayPad$ = 128
641 b$ = 184
642 c$ = 192
643 nonleaf_call PROC
644 $LN3:
645 mov DWORD PTR [rsp+24], r8d ;
646 mov DWORD PTR [rsp+16], edx ;
647 mov DWORD PTR [rsp+8], ecx ;
648 mov QWORD PTR [rsp+32], r9 ;
649 push rsi ;
650 push rdi ;
651 sub rsp, 152 ;
652 mov rax, QWORD PTR __security_cookie ;
653 xor rax, rsp ;
654 mov QWORD PTR __$ArrayPad$[rsp], rax ;
655 lea rax, QWORD PTR c$[rsp+8] ;
656 mov QWORD PTR ap$[rsp], rax ;
657 mov rax, QWORD PTR ap$[rsp] ;
658 add rax, 8 ;
659 mov QWORD PTR ap$[rsp], rax ;
660 mov rax, QWORD PTR ap$[rsp] ;
661 mov eax, DWORD PTR [rax-8] ;
662 mov DWORD PTR d$[rsp], eax ;
663 mov rax, QWORD PTR ap$[rsp] ;
664 add rax, 8 ;
665 mov QWORD PTR ap$[rsp], rax ;
666 mov rax, QWORD PTR ap$[rsp] ;
667 mov eax, DWORD PTR [rax-8] ;
668 mov DWORD PTR e$[rsp], eax ;
669 mov rax, QWORD PTR ap$[rsp] ;
670 add rax, 8 ;
671 mov QWORD PTR ap$[rsp], rax ;
672 mov rax, QWORD PTR ap$[rsp] ;
673 mov rax, QWORD PTR [rax-8] ;
674 lea rcx, QWORD PTR f$[rsp] ;
675 mov rdi, rcx ;
676 mov rsi, rax ;
677 mov ecx, 16 ;
678 rep movsb ;
679 mov rax, QWORD PTR ap$[rsp] ;
680 add rax, 8 ;
681 mov QWORD PTR ap$[rsp], rax ;
682 mov rax, QWORD PTR ap$[rsp] ;
683 mov eax, DWORD PTR [rax-8] ;
684 mov DWORD PTR g$[rsp], eax ;
685 mov rax, QWORD PTR ap$[rsp] ;
686 add rax, 8 ;
687 mov QWORD PTR ap$[rsp], rax ;
688 mov rax, QWORD PTR ap$[rsp] ;
689 mov eax, DWORD PTR [rax-8] ;
690 mov DWORD PTR h$[rsp], eax ;
691 mov ecx, 220 ;
692 call alloca ;
693 cdqe ;
694 mov BYTE PTR [rax], 76 ;
695 lea rax, QWORD PTR $T1[rsp] ;
696 lea rcx, QWORD PTR f$[rsp] ;
697 mov rdi, rax ;
698 mov rsi, rcx ;
699 mov ecx, 16 ;
700 rep movsb ;
701 mov eax, DWORD PTR h$[rsp] ;
702 mov DWORD PTR [rsp+48], eax ;
703 mov eax, DWORD PTR g$[rsp] ;
704 mov DWORD PTR [rsp+40], eax ;
705 lea rax, QWORD PTR $T1[rsp] ;
706 mov QWORD PTR [rsp+32], rax ;
707 mov r9d, DWORD PTR e$[rsp] ;
708 mov r8d, DWORD PTR d$[rsp] ;
709 mov edx, DWORD PTR c$[rsp] ;
710 mov ecx, DWORD PTR b$[rsp] ;
711 call leaf_call ;
712 mov QWORD PTR ap$[rsp], 0 ;
713 mov rcx, QWORD PTR __$ArrayPad$[rsp] ;
714 xor rcx, rsp ;
715 call __security_check_cookie ;
716 add rsp, 152 ;
717 pop rdi ;
718 pop rsi ;
719 ret 0 ;
720 nonleaf_call ENDP
721
722 $T1 = 64
723 $S1$ = 80
724 __$ArrayPad$ = 96
725 main PROC
726 $LN3:
727 push rsi ;
728 push rdi ;
729 sub rsp, 120 ;
730 mov rax, QWORD PTR __security_cookie ;
731 xor rax, rsp ;
732 mov QWORD PTR __$ArrayPad$[rsp], rax ;
733 mov DWORD PTR $S1$[rsp], 5 ;
734 mov DWORD PTR $S1$[rsp+4], 6 ;
735 mov QWORD PTR $S1$[rsp+8], 7 ;
736 lea rax, QWORD PTR $T1[rsp] ;
737 lea rcx, QWORD PTR $S1$[rsp] ;
738 mov rdi, rax ;
739 mov rsi, rcx ;
740 mov ecx, 16 ;
741 rep movsb ;
742 mov DWORD PTR [rsp+56], 9 ;
743 mov DWORD PTR [rsp+48], 8 ;
744 lea rax, QWORD PTR $T1[rsp] ;
745 mov QWORD PTR [rsp+40], rax ;
746 mov DWORD PTR [rsp+32], 4 ;
747 mov r9d, 3 ;
748 mov r8d, 2 ;
749 mov edx, 1 ;
750 xor ecx, ecx ;
751 call nonleaf_call ;
752 xor eax, eax ;
753 mov rcx, QWORD PTR __$ArrayPad$[rsp] ;
754 xor rcx, rsp ;
755 call __security_check_cookie ;
756 add rsp, 120 ;
757 pop rdi ;
758 pop rsi ;
759 ret 0 ;
760 main ENDP
761
762
763
587 ; vim: ft=asm 764 ; vim: ft=asm
588 765