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