Mercurial > pub > dyncall > dyncall
annotate 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 |
rev | line source |
---|---|
468
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
1 ; void leaf_call(int b, int c, int d, int e, int f, int g, int h) |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
2 ; { |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
3 ; } |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
4 ; |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
5 ; void nonleaf_call(int a, int b, int c, int d, int e, int f, int g, int h) |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
6 ; { |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
7 ; /* use some local data */ |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
8 ; char x[10] = { 'L' }; |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
9 ; leaf_call(b, c, d, e, f, g, h); |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
10 ; } |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
11 ; |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
12 ; int main() |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
13 ; { |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
14 ; nonleaf_call(0, 1, 2, 3, 4, 5, 6, 7); |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
15 ; return 0; |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
16 ; } |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
17 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
18 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
19 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
20 ; output from godbolt compiler explorer w/ msvc 19.0 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
21 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
22 leaf_call PROC |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
23 mov DWORD PTR [rsp+32], r9d |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
24 mov DWORD PTR [rsp+24], r8d |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
25 mov DWORD PTR [rsp+16], edx |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
26 mov DWORD PTR [rsp+8], ecx |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
27 ret 0 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
28 leaf_call ENDP |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
29 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
30 x$ = 64 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
31 b$ = 104 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
32 c$ = 112 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
33 d$ = 120 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
34 e$ = 128 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
35 f$ = 136 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
36 g$ = 144 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
37 h$ = 152 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
38 nonleaf_call PROC |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
39 mov DWORD PTR [rsp+32], r9d ; | | |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
40 mov DWORD PTR [rsp+24], r8d ; | | |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
41 mov DWORD PTR [rsp+16], edx ; | | spill |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
42 mov DWORD PTR [rsp+8], ecx ; | | |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
43 push rdi ; | |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
44 sub rsp, 80 ; | prolog |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
45 mov BYTE PTR x$[rsp], 76 ; 'L' -> local area (of local array's space) |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
46 lea rax, QWORD PTR x$[rsp+1] ; | |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
47 mov rdi, rax ; | |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
48 xor eax, eax ; | zero-init rest of local array's space |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
49 mov ecx, 9 ; | |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
50 rep stosb ; | |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
51 mov eax, DWORD PTR h$[rsp] ; arg 6 (fetched from caller's frame param area), and ... |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
52 mov DWORD PTR [rsp+48], eax ; ... "pushed" onto stack |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
53 mov eax, DWORD PTR g$[rsp] ; arg 5 (fetched from caller's frame param area), and ... |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
54 mov DWORD PTR [rsp+40], eax ; ... "pushed" onto stack |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
55 mov eax, DWORD PTR f$[rsp] ; arg 4 (fetched from caller's frame param area), and ... |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
56 mov DWORD PTR [rsp+32], eax ; ... "pushed" onto stack |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
57 mov r9d, DWORD PTR e$[rsp] ; arg 3 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
58 mov r8d, DWORD PTR d$[rsp] ; arg 2 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
59 mov edx, DWORD PTR c$[rsp] ; arg 1 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
60 mov ecx, DWORD PTR b$[rsp] ; arg 0 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
61 call leaf_call ; push return addr and call |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
62 add rsp, 80 ; | |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
63 pop rdi ; | epilog |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
64 ret 0 ; | |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
65 nonleaf_call ENDP |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
66 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
67 main PROC |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
68 sub rsp, 72 ; prolog |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
69 mov DWORD PTR [rsp+56], 7 ; "push" arg 7 onto stack |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
70 mov DWORD PTR [rsp+48], 6 ; "push" arg 6 onto stack |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
71 mov DWORD PTR [rsp+40], 5 ; "push" arg 5 onto stack |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
72 mov DWORD PTR [rsp+32], 4 ; "push" arg 4 onto stack |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
73 mov r9d, 3 ; arg 3 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
74 mov r8d, 2 ; arg 2 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
75 mov edx, 1 ; arg 1 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
76 xor ecx, ecx ; arg 0 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
77 call nonleaf_call ; push return addr and call |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
78 xor eax, eax ; return value |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
79 add rsp, 72 ; | |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
80 ret 0 ; | epilog |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
81 main ENDP |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
82 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
83 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
84 |
619 | 85 ; ---------- structs by value, struct never in reg or on reg arg boundary ----------> |
468
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
86 ; |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
87 ; struct A { int i, j; long long l; }; |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
88 ; |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
89 ; void leaf_call(int b, int c, int d, int e, struct A f, int g, int h) |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
90 ; { |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
91 ; } |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
92 ; |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
93 ; void nonleaf_call(int a, int b, int c, int d, int e, struct A f, int g, int h) |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
94 ; { |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
95 ; /* use some local data */ |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
96 ; char x[220] = { 'L' }; |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
97 ; leaf_call(b, c, d, e, f, g, h); |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
98 ; } |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
99 ; |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
100 ; int main() |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
101 ; { |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
102 ; struct A a = {5, 6, 7ll}; |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
103 ; nonleaf_call(0, 1, 2, 3, 4, a, 8, 9); |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
104 ; return 0; |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
105 ; } |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
106 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
107 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
108 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
109 ; output from godbolt compiler explorer w/ msvc 19.0 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
110 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
111 leaf_call PROC |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
112 mov DWORD PTR [rsp+32], r9d |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
113 mov DWORD PTR [rsp+24], r8d |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
114 mov DWORD PTR [rsp+16], edx |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
115 mov DWORD PTR [rsp+8], ecx |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
116 ret 0 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
117 leaf_call ENDP |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
118 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
119 $T1 = 64 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
120 x$ = 80 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
121 b$ = 344 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
122 c$ = 352 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
123 d$ = 360 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
124 e$ = 368 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
125 f$ = 376 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
126 g$ = 384 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
127 h$ = 392 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
128 nonleaf_call PROC |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
129 mov DWORD PTR [rsp+32], r9d |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
130 mov DWORD PTR [rsp+24], r8d |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
131 mov DWORD PTR [rsp+16], edx |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
132 mov DWORD PTR [rsp+8], ecx |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
133 push rsi |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
134 push rdi |
619 | 135 sub rsp, 312 |
136 mov BYTE PTR x$[rsp], 76 | |
468
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
137 lea rax, QWORD PTR x$[rsp+1] |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
138 mov rdi, rax |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
139 xor eax, eax |
619 | 140 mov ecx, 219 |
468
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
141 rep stosb |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
142 lea rax, QWORD PTR $T1[rsp] |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
143 mov rdi, rax |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
144 mov rsi, QWORD PTR f$[rsp] |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
145 mov ecx, 16 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
146 rep movsb |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
147 mov eax, DWORD PTR h$[rsp] |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
148 mov DWORD PTR [rsp+48], eax |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
149 mov eax, DWORD PTR g$[rsp] |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
150 mov DWORD PTR [rsp+40], eax |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
151 lea rax, QWORD PTR $T1[rsp] |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
152 mov QWORD PTR [rsp+32], rax |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
153 mov r9d, DWORD PTR e$[rsp] |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
154 mov r8d, DWORD PTR d$[rsp] |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
155 mov edx, DWORD PTR c$[rsp] |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
156 mov ecx, DWORD PTR b$[rsp] |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
157 call leaf_call |
619 | 158 add rsp, 312 |
468
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
159 pop rdi |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
160 pop rsi |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
161 ret 0 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
162 nonleaf_call ENDP |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
163 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
164 a$ = 64 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
165 $T1 = 80 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
166 main PROC |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
167 push rsi |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
168 push rdi |
619 | 169 sub rsp, 104 |
468
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
170 mov DWORD PTR a$[rsp], 5 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
171 mov DWORD PTR a$[rsp+4], 6 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
172 mov QWORD PTR a$[rsp+8], 7 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
173 lea rax, QWORD PTR $T1[rsp] |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
174 lea rcx, QWORD PTR a$[rsp] |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
175 mov rdi, rax |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
176 mov rsi, rcx |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
177 mov ecx, 16 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
178 rep movsb |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
179 mov DWORD PTR [rsp+56], 9 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
180 mov DWORD PTR [rsp+48], 8 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
181 lea rax, QWORD PTR $T1[rsp] |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
182 mov QWORD PTR [rsp+40], rax |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
183 mov DWORD PTR [rsp+32], 4 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
184 mov r9d, 3 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
185 mov r8d, 2 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
186 mov edx, 1 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
187 xor ecx, ecx |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
188 call nonleaf_call |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
189 xor eax, eax |
619 | 190 add rsp, 104 |
468
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
191 pop rdi |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
192 pop rsi |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
193 ret 0 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
194 main ENDP |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
195 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
196 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
197 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
198 ; ---------- structs by value, complex example (multiple structs, partly passed via regs) ----------> |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
199 ; |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
200 ; struct A { int i, j; float f; }; |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
201 ; struct B { double d; long long l; }; |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
202 ; |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
203 ; void leaf_call(int b, struct A c, struct B d, int e, int f, struct A g, struct B h, int i, int j) |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
204 ; { |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
205 ; } |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
206 ; |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
207 ; void nonleaf_call(int a, int b, struct A c, struct B d, int e, int f, struct A g, struct B h, int i, int j) |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
208 ; { |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
209 ; /* use some local data */ |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
210 ; char x[220] = { 'L' }; |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
211 ; leaf_call(b, c, d, e, f, g, h, i, j); |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
212 ; } |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
213 ; |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
214 ; int main() |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
215 ; { |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
216 ; struct A a = {2, 3, 4.f}; |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
217 ; struct B b = {5., 6ll}; |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
218 ; struct A c = {9, 10, 11.f}; |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
219 ; struct B d = {12., 13ll}; |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
220 ; nonleaf_call(0, 1, a, b, 7, 8, c, d, 14, 15); |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
221 ; return 0; |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
222 ; } |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
223 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
224 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
225 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
226 ; output from godbolt compiler explorer w/ msvc 19.0 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
227 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
228 __real@41300000 DD 041300000r ; | |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
229 __real@40800000 DD 040800000r ; | |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
230 __real@4028000000000000 DQ 04028000000000000r ; | fp data |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
231 __real@4014000000000000 DQ 04014000000000000r ; | |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
232 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
233 leaf_call PROC |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
234 mov DWORD PTR [rsp+32], r9d |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
235 mov QWORD PTR [rsp+24], r8 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
236 mov QWORD PTR [rsp+16], rdx |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
237 mov DWORD PTR [rsp+8], ecx |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
238 ret 0 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
239 leaf_call ENDP |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
240 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
241 $T1 = 80 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
242 $T2 = 96 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
243 $T3 = 112 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
244 $T4 = 128 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
245 x$ = 144 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
246 b$ = 408 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
247 c$ = 416 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
248 d$ = 424 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
249 e$ = 432 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
250 f$ = 440 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
251 g$ = 448 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
252 h$ = 456 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
253 i$ = 464 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
254 j$ = 472 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
255 nonleaf_call PROC |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
256 mov QWORD PTR [rsp+32], r9 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
257 mov QWORD PTR [rsp+24], r8 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
258 mov DWORD PTR [rsp+16], edx |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
259 mov DWORD PTR [rsp+8], ecx |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
260 push rsi |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
261 push rdi |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
262 sub rsp, 376 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
263 mov BYTE PTR x$[rsp], 76 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
264 lea rax, QWORD PTR x$[rsp+1] |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
265 mov rdi, rax |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
266 xor eax, eax |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
267 mov ecx, 219 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
268 rep stosb |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
269 lea rax, QWORD PTR $T3[rsp] |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
270 mov rdi, rax |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
271 mov rsi, QWORD PTR h$[rsp] |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
272 mov ecx, 16 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
273 rep movsb |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
274 lea rax, QWORD PTR $T1[rsp] |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
275 mov rdi, rax |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
276 mov rsi, QWORD PTR g$[rsp] |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
277 mov ecx, 12 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
278 rep movsb |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
279 lea rax, QWORD PTR $T4[rsp] |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
280 mov rdi, rax |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
281 mov rsi, QWORD PTR d$[rsp] |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
282 mov ecx, 16 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
283 rep movsb |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
284 lea rax, QWORD PTR $T2[rsp] |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
285 mov rdi, rax |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
286 mov rsi, QWORD PTR c$[rsp] |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
287 mov ecx, 12 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
288 rep movsb |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
289 mov eax, DWORD PTR j$[rsp] |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
290 mov DWORD PTR [rsp+64], eax |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
291 mov eax, DWORD PTR i$[rsp] |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
292 mov DWORD PTR [rsp+56], eax |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
293 lea rax, QWORD PTR $T3[rsp] |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
294 mov QWORD PTR [rsp+48], rax |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
295 lea rax, QWORD PTR $T1[rsp] |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
296 mov QWORD PTR [rsp+40], rax |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
297 mov eax, DWORD PTR f$[rsp] |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
298 mov DWORD PTR [rsp+32], eax |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
299 mov r9d, DWORD PTR e$[rsp] |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
300 lea r8, QWORD PTR $T4[rsp] |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
301 lea rdx, QWORD PTR $T2[rsp] |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
302 mov ecx, DWORD PTR b$[rsp] |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
303 call leaf_call |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
304 add rsp, 376 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
305 pop rdi |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
306 pop rsi |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
307 ret 0 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
308 nonleaf_call ENDP |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
309 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
310 c$ = 80 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
311 a$ = 96 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
312 $T1 = 112 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
313 $T2 = 128 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
314 d$ = 144 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
315 b$ = 160 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
316 $T3 = 176 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
317 $T4 = 192 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
318 main PROC |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
319 push rsi |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
320 push rdi |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
321 sub rsp, 216 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
322 mov DWORD PTR a$[rsp], 2 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
323 mov DWORD PTR a$[rsp+4], 3 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
324 movss xmm0, DWORD PTR __real@40800000 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
325 movss DWORD PTR a$[rsp+8], xmm0 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
326 movsd xmm0, QWORD PTR __real@4014000000000000 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
327 movsd QWORD PTR b$[rsp], xmm0 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
328 mov QWORD PTR b$[rsp+8], 6 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
329 mov DWORD PTR c$[rsp], 9 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
330 mov DWORD PTR c$[rsp+4], 10 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
331 movss xmm0, DWORD PTR __real@41300000 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
332 movss DWORD PTR c$[rsp+8], xmm0 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
333 movsd xmm0, QWORD PTR __real@4028000000000000 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
334 movsd QWORD PTR d$[rsp], xmm0 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
335 mov QWORD PTR d$[rsp+8], 13 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
336 lea rax, QWORD PTR $T3[rsp] |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
337 lea rcx, QWORD PTR d$[rsp] |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
338 mov rdi, rax |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
339 mov rsi, rcx |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
340 mov ecx, 16 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
341 rep movsb |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
342 lea rax, QWORD PTR $T1[rsp] |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
343 lea rcx, QWORD PTR c$[rsp] |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
344 mov rdi, rax |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
345 mov rsi, rcx |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
346 mov ecx, 12 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
347 rep movsb |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
348 lea rax, QWORD PTR $T4[rsp] |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
349 lea rcx, QWORD PTR b$[rsp] |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
350 mov rdi, rax |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
351 mov rsi, rcx |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
352 mov ecx, 16 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
353 rep movsb |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
354 lea rax, QWORD PTR $T2[rsp] |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
355 lea rcx, QWORD PTR a$[rsp] |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
356 mov rdi, rax |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
357 mov rsi, rcx |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
358 mov ecx, 12 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
359 rep movsb |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
360 mov DWORD PTR [rsp+72], 15 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
361 mov DWORD PTR [rsp+64], 14 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
362 lea rax, QWORD PTR $T3[rsp] |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
363 mov QWORD PTR [rsp+56], rax |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
364 lea rax, QWORD PTR $T1[rsp] |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
365 mov QWORD PTR [rsp+48], rax |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
366 mov DWORD PTR [rsp+40], 8 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
367 mov DWORD PTR [rsp+32], 7 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
368 lea r9, QWORD PTR $T4[rsp] |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
369 lea r8, QWORD PTR $T2[rsp] |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
370 mov edx, 1 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
371 xor ecx, ecx |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
372 call nonleaf_call |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
373 xor eax, eax |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
374 add rsp, 216 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
375 pop rdi |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
376 pop rsi |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
377 ret 0 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
378 main ENDP |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
379 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
380 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
381 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
382 ; ---------- returning tiny struct by value (passes via regs) ----------> |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
383 ; |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
384 ; struct A { unsigned char a; }; |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
385 ; |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
386 ; struct A call(unsigned char c) |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
387 ; { |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
388 ; struct A r = {c}; |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
389 ; return r; |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
390 ; } |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
391 ; |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
392 ; int main() |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
393 ; { |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
394 ; struct A a = call(123); |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
395 ; return 0; |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
396 ; } |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
397 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
398 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
399 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
400 ; output from godbolt compiler explorer w/ msvc 19.0 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
401 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
402 r$ = 0 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
403 c$ = 32 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
404 call PROC |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
405 mov BYTE PTR [rsp+8], cl ; | spill |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
406 sub rsp, 24 ; | prolog |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
407 movzx eax, BYTE PTR c$[rsp] ; in arg 0 (fetched from spill area) -> eax, then ... |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
408 mov BYTE PTR r$[rsp], al ; ... -> struct in local area (top of stack, as leaf call and thus no reserved spill area) |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
409 movzx eax, BYTE PTR r$[rsp] ; reget same value into eax to return (small) struct via reg (a bit pointless to refetch) |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
410 add rsp, 24 ; | |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
411 ret 0 ; | epilog |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
412 call ENDP |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
413 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
414 a$ = 32 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
415 main PROC |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
416 sub rsp, 56 ; prolog |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
417 mov cl, 123 ; arg 0 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
418 call call ; push return addr and call |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
419 mov BYTE PTR a$[rsp], al ; write struct data to local area (123) |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
420 xor eax, eax ; return value |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
421 add rsp, 56 ; | |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
422 ret 0 ; | epilog |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
423 main ENDP |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
424 |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
425 |
493
75cb8f79d725
- doc and disas examples update about C++ non-trivial aggregates
Tassilo Philipp
parents:
468
diff
changeset
|
426 |
75cb8f79d725
- doc and disas examples update about C++ non-trivial aggregates
Tassilo Philipp
parents:
468
diff
changeset
|
427 ; ---------- C++ trivial and non-trivial aggrs passed to C funcs ----------> |
75cb8f79d725
- doc and disas examples update about C++ non-trivial aggregates
Tassilo Philipp
parents:
468
diff
changeset
|
428 ; |
75cb8f79d725
- doc and disas examples update about C++ non-trivial aggregates
Tassilo Philipp
parents:
468
diff
changeset
|
429 ; struct Trivial { int a; }; |
75cb8f79d725
- doc and disas examples update about C++ non-trivial aggregates
Tassilo Philipp
parents:
468
diff
changeset
|
430 ; struct NonTrivial { int a; NonTrivial() : a(0) {} NonTrivial(const NonTrivial& rhs) : a(rhs.a) { } }; |
75cb8f79d725
- doc and disas examples update about C++ non-trivial aggregates
Tassilo Philipp
parents:
468
diff
changeset
|
431 ; |
75cb8f79d725
- doc and disas examples update about C++ non-trivial aggregates
Tassilo Philipp
parents:
468
diff
changeset
|
432 ; extern "C" { |
75cb8f79d725
- doc and disas examples update about C++ non-trivial aggregates
Tassilo Philipp
parents:
468
diff
changeset
|
433 ; |
75cb8f79d725
- doc and disas examples update about C++ non-trivial aggregates
Tassilo Philipp
parents:
468
diff
changeset
|
434 ; void f1(struct Trivial s) { } |
75cb8f79d725
- doc and disas examples update about C++ non-trivial aggregates
Tassilo Philipp
parents:
468
diff
changeset
|
435 ; void f2(struct NonTrivial s) { } |
75cb8f79d725
- doc and disas examples update about C++ non-trivial aggregates
Tassilo Philipp
parents:
468
diff
changeset
|
436 ; |
75cb8f79d725
- doc and disas examples update about C++ non-trivial aggregates
Tassilo Philipp
parents:
468
diff
changeset
|
437 ; void f() |
75cb8f79d725
- doc and disas examples update about C++ non-trivial aggregates
Tassilo Philipp
parents:
468
diff
changeset
|
438 ; { |
75cb8f79d725
- doc and disas examples update about C++ non-trivial aggregates
Tassilo Philipp
parents:
468
diff
changeset
|
439 ; struct Trivial t; |
75cb8f79d725
- doc and disas examples update about C++ non-trivial aggregates
Tassilo Philipp
parents:
468
diff
changeset
|
440 ; struct NonTrivial n; |
75cb8f79d725
- doc and disas examples update about C++ non-trivial aggregates
Tassilo Philipp
parents:
468
diff
changeset
|
441 ; int a=1; |
75cb8f79d725
- doc and disas examples update about C++ non-trivial aggregates
Tassilo Philipp
parents:
468
diff
changeset
|
442 ; a += 123; |
75cb8f79d725
- doc and disas examples update about C++ non-trivial aggregates
Tassilo Philipp
parents:
468
diff
changeset
|
443 ; f1(t); |
75cb8f79d725
- doc and disas examples update about C++ non-trivial aggregates
Tassilo Philipp
parents:
468
diff
changeset
|
444 ; a -= 123; |
75cb8f79d725
- doc and disas examples update about C++ non-trivial aggregates
Tassilo Philipp
parents:
468
diff
changeset
|
445 ; f2(n); |
75cb8f79d725
- doc and disas examples update about C++ non-trivial aggregates
Tassilo Philipp
parents:
468
diff
changeset
|
446 ; a -= 12; |
75cb8f79d725
- doc and disas examples update about C++ non-trivial aggregates
Tassilo Philipp
parents:
468
diff
changeset
|
447 ; } |
75cb8f79d725
- doc and disas examples update about C++ non-trivial aggregates
Tassilo Philipp
parents:
468
diff
changeset
|
448 ; } |
75cb8f79d725
- doc and disas examples update about C++ non-trivial aggregates
Tassilo Philipp
parents:
468
diff
changeset
|
449 |
75cb8f79d725
- doc and disas examples update about C++ non-trivial aggregates
Tassilo Philipp
parents:
468
diff
changeset
|
450 |
75cb8f79d725
- doc and disas examples update about C++ non-trivial aggregates
Tassilo Philipp
parents:
468
diff
changeset
|
451 |
75cb8f79d725
- doc and disas examples update about C++ non-trivial aggregates
Tassilo Philipp
parents:
468
diff
changeset
|
452 ; output from godbolt compiler explorer w/ msvc 19.0 |
75cb8f79d725
- doc and disas examples update about C++ non-trivial aggregates
Tassilo Philipp
parents:
468
diff
changeset
|
453 |
75cb8f79d725
- doc and disas examples update about C++ non-trivial aggregates
Tassilo Philipp
parents:
468
diff
changeset
|
454 ; ... snip, removed code of ctor and copy ctor ... |
75cb8f79d725
- doc and disas examples update about C++ non-trivial aggregates
Tassilo Philipp
parents:
468
diff
changeset
|
455 |
75cb8f79d725
- doc and disas examples update about C++ non-trivial aggregates
Tassilo Philipp
parents:
468
diff
changeset
|
456 f1 PROC |
75cb8f79d725
- doc and disas examples update about C++ non-trivial aggregates
Tassilo Philipp
parents:
468
diff
changeset
|
457 mov DWORD PTR [rsp+8], ecx |
75cb8f79d725
- doc and disas examples update about C++ non-trivial aggregates
Tassilo Philipp
parents:
468
diff
changeset
|
458 ret 0 |
75cb8f79d725
- doc and disas examples update about C++ non-trivial aggregates
Tassilo Philipp
parents:
468
diff
changeset
|
459 f1 ENDP |
75cb8f79d725
- doc and disas examples update about C++ non-trivial aggregates
Tassilo Philipp
parents:
468
diff
changeset
|
460 |
75cb8f79d725
- doc and disas examples update about C++ non-trivial aggregates
Tassilo Philipp
parents:
468
diff
changeset
|
461 f2 PROC |
75cb8f79d725
- doc and disas examples update about C++ non-trivial aggregates
Tassilo Philipp
parents:
468
diff
changeset
|
462 mov QWORD PTR [rsp+8], rcx |
75cb8f79d725
- doc and disas examples update about C++ non-trivial aggregates
Tassilo Philipp
parents:
468
diff
changeset
|
463 ret 0 |
75cb8f79d725
- doc and disas examples update about C++ non-trivial aggregates
Tassilo Philipp
parents:
468
diff
changeset
|
464 f2 ENDP |
75cb8f79d725
- doc and disas examples update about C++ non-trivial aggregates
Tassilo Philipp
parents:
468
diff
changeset
|
465 |
75cb8f79d725
- doc and disas examples update about C++ non-trivial aggregates
Tassilo Philipp
parents:
468
diff
changeset
|
466 a$ = 32 |
75cb8f79d725
- doc and disas examples update about C++ non-trivial aggregates
Tassilo Philipp
parents:
468
diff
changeset
|
467 n$ = 36 |
75cb8f79d725
- doc and disas examples update about C++ non-trivial aggregates
Tassilo Philipp
parents:
468
diff
changeset
|
468 t$ = 40 |
75cb8f79d725
- doc and disas examples update about C++ non-trivial aggregates
Tassilo Philipp
parents:
468
diff
changeset
|
469 $T1 = 44 |
75cb8f79d725
- doc and disas examples update about C++ non-trivial aggregates
Tassilo Philipp
parents:
468
diff
changeset
|
470 $T2 = 48 |
75cb8f79d725
- doc and disas examples update about C++ non-trivial aggregates
Tassilo Philipp
parents:
468
diff
changeset
|
471 f PROC |
75cb8f79d725
- doc and disas examples update about C++ non-trivial aggregates
Tassilo Philipp
parents:
468
diff
changeset
|
472 $LN3: |
75cb8f79d725
- doc and disas examples update about C++ non-trivial aggregates
Tassilo Philipp
parents:
468
diff
changeset
|
473 sub rsp, 72 ; prolog |
75cb8f79d725
- doc and disas examples update about C++ non-trivial aggregates
Tassilo Philipp
parents:
468
diff
changeset
|
474 lea rcx, QWORD PTR n$[rsp] ; \ this ptr (NULL) |
75cb8f79d725
- doc and disas examples update about C++ non-trivial aggregates
Tassilo Philipp
parents:
468
diff
changeset
|
475 call NonTrivial::NonTrivial(void) ; | NonTrivial::NonTrivial() / ctor |
75cb8f79d725
- doc and disas examples update about C++ non-trivial aggregates
Tassilo Philipp
parents:
468
diff
changeset
|
476 mov DWORD PTR a$[rsp], 1 ; a = 1 |
75cb8f79d725
- doc and disas examples update about C++ non-trivial aggregates
Tassilo Philipp
parents:
468
diff
changeset
|
477 mov eax, DWORD PTR a$[rsp] ; | |
75cb8f79d725
- doc and disas examples update about C++ non-trivial aggregates
Tassilo Philipp
parents:
468
diff
changeset
|
478 add eax, 123 ; | a += 123 |
75cb8f79d725
- doc and disas examples update about C++ non-trivial aggregates
Tassilo Philipp
parents:
468
diff
changeset
|
479 mov DWORD PTR a$[rsp], eax ; / |
75cb8f79d725
- doc and disas examples update about C++ non-trivial aggregates
Tassilo Philipp
parents:
468
diff
changeset
|
480 mov ecx, DWORD PTR t$[rsp] ; f1 arg 0 (struct Trivial), via reg as small struct |
75cb8f79d725
- doc and disas examples update about C++ non-trivial aggregates
Tassilo Philipp
parents:
468
diff
changeset
|
481 call f1 ; call f1(struct Trivial) |
75cb8f79d725
- doc and disas examples update about C++ non-trivial aggregates
Tassilo Philipp
parents:
468
diff
changeset
|
482 mov eax, DWORD PTR a$[rsp] ; | |
75cb8f79d725
- doc and disas examples update about C++ non-trivial aggregates
Tassilo Philipp
parents:
468
diff
changeset
|
483 sub eax, 123 ; | a -= 123 |
75cb8f79d725
- doc and disas examples update about C++ non-trivial aggregates
Tassilo Philipp
parents:
468
diff
changeset
|
484 mov DWORD PTR a$[rsp], eax ; / |
75cb8f79d725
- doc and disas examples update about C++ non-trivial aggregates
Tassilo Philipp
parents:
468
diff
changeset
|
485 lea rax, QWORD PTR $T1[rsp] ; @@@ unsure |
75cb8f79d725
- doc and disas examples update about C++ non-trivial aggregates
Tassilo Philipp
parents:
468
diff
changeset
|
486 mov QWORD PTR $T2[rsp], rax ; ... @@@ |
75cb8f79d725
- doc and disas examples update about C++ non-trivial aggregates
Tassilo Philipp
parents:
468
diff
changeset
|
487 lea rdx, QWORD PTR n$[rsp] ; \ ptr to dest of copy of n |
75cb8f79d725
- doc and disas examples update about C++ non-trivial aggregates
Tassilo Philipp
parents:
468
diff
changeset
|
488 mov rcx, QWORD PTR $T2[rsp] ; | copy n ptr to n |
75cb8f79d725
- doc and disas examples update about C++ non-trivial aggregates
Tassilo Philipp
parents:
468
diff
changeset
|
489 call NonTrivial::NonTrivial(NonTrivial const &) ; / NonTrivial::NonTrivial(const NonTrivial&) / copy ctor |
75cb8f79d725
- doc and disas examples update about C++ non-trivial aggregates
Tassilo Philipp
parents:
468
diff
changeset
|
490 mov rcx, rax ; f2 arg 0 (ptr to copy of struct NonTrivial), via ptr as non-trivial |
75cb8f79d725
- doc and disas examples update about C++ non-trivial aggregates
Tassilo Philipp
parents:
468
diff
changeset
|
491 call f2 ; call f2(struct NonTrivial) |
75cb8f79d725
- doc and disas examples update about C++ non-trivial aggregates
Tassilo Philipp
parents:
468
diff
changeset
|
492 mov eax, DWORD PTR a$[rsp] ; | |
75cb8f79d725
- doc and disas examples update about C++ non-trivial aggregates
Tassilo Philipp
parents:
468
diff
changeset
|
493 sub eax, 12 ; | a -= 12 |
75cb8f79d725
- doc and disas examples update about C++ non-trivial aggregates
Tassilo Philipp
parents:
468
diff
changeset
|
494 mov DWORD PTR a$[rsp], eax ; / |
75cb8f79d725
- doc and disas examples update about C++ non-trivial aggregates
Tassilo Philipp
parents:
468
diff
changeset
|
495 add rsp, 72 ; \ |
75cb8f79d725
- doc and disas examples update about C++ non-trivial aggregates
Tassilo Philipp
parents:
468
diff
changeset
|
496 ret 0 ; | epilog |
75cb8f79d725
- doc and disas examples update about C++ non-trivial aggregates
Tassilo Philipp
parents:
468
diff
changeset
|
497 f ENDP |
75cb8f79d725
- doc and disas examples update about C++ non-trivial aggregates
Tassilo Philipp
parents:
468
diff
changeset
|
498 |
75cb8f79d725
- doc and disas examples update about C++ non-trivial aggregates
Tassilo Philipp
parents:
468
diff
changeset
|
499 |
75cb8f79d725
- doc and disas examples update about C++ non-trivial aggregates
Tassilo Philipp
parents:
468
diff
changeset
|
500 |
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)
Tassilo Philipp
parents:
493
diff
changeset
|
501 ; ---------- C++ trivial and non-trivial aggrs as return values ----------> |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
502 ; |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
503 ; struct Trivial { int a; }; |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
504 ; struct NonTrivial { int a; NonTrivial() : a(0) {} NonTrivial(const NonTrivial& rhs) : a(rhs.a) { } }; |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
505 ; |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
506 ; extern "C" { |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
507 ; struct Trivial f1() { return Trivial(); } |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
508 ; } |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
509 ; |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
510 ; struct NonTrivial f2() { return NonTrivial(); } |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
511 ; |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
512 ; extern "C" { |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
513 ; void f() |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
514 ; { |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
515 ; int a=1; |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
516 ; a += 123; |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
517 ; struct Trivial t = f1(); |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
518 ; a -= 123; |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
519 ; struct NonTrivial n = f2(); |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
520 ; a -= 12; |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
521 ; } |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
522 ; } |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
523 |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
524 |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
525 |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
526 ; output from godbolt compiler explorer w/ msvc 19.0 |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
527 |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
528 ; ... snip, removed code of ctor and copy ctor ... |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
529 |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
530 $T1 = 0 |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
531 f1 PROC |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
532 $LN3: |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
533 push rdi |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
534 sub rsp, 16 |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
535 lea rax, QWORD PTR $T1[rsp] |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
536 mov rdi, rax |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
537 xor eax, eax |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
538 mov ecx, 4 |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
539 rep stosb |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
540 mov eax, DWORD PTR $T1[rsp] |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
541 add rsp, 16 |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
542 pop rdi |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
543 ret 0 |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
544 f1 ENDP |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
545 |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
546 __$ReturnUdt$ = 48 |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
547 NonTrivial f2(void) PROC |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
548 $LN3: |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
549 mov QWORD PTR [rsp+8], rcx |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
550 sub rsp, 40 |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
551 mov rcx, QWORD PTR __$ReturnUdt$[rsp] |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
552 call NonTrivial::NonTrivial(void) |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
553 mov rax, QWORD PTR __$ReturnUdt$[rsp] |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
554 add rsp, 40 |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
555 ret 0 |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
556 NonTrivial f2(void) ENDP |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
557 |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
558 a$ = 32 |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
559 $T1 = 36 |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
560 t$ = 40 |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
561 n$ = 44 |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
562 f PROC |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
563 $LN3: |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
564 sub rsp, 56 ; prolog |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
565 mov DWORD PTR a$[rsp], 1 ; a = 1 |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
566 mov eax, DWORD PTR a$[rsp] ; | |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
567 add eax, 123 ; | a += 123 |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
568 mov DWORD PTR a$[rsp], eax ; | |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
569 call f1 ; call f1() |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
570 mov DWORD PTR $T1[rsp], eax ; |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
571 mov eax, DWORD PTR $T1[rsp] ; |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
572 mov DWORD PTR t$[rsp], eax ; |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
573 mov eax, DWORD PTR a$[rsp] ; | |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
574 sub eax, 123 ; | a -= 123 |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
575 mov DWORD PTR a$[rsp], eax ; | |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
576 lea rcx, QWORD PTR n$[rsp] ; ptr to space to hold non-triv retval |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
577 call NonTrivial f2(void) ; call f2() |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
578 mov eax, DWORD PTR a$[rsp] ; | |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
579 sub eax, 12 ; | a -= 12 |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
580 mov DWORD PTR a$[rsp], eax ; / |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
581 add rsp, 56 ; \ epilog |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
582 ret 0 ; | |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
583 f ENDP |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
584 |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
585 |
fc614cb865c6
- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
Tassilo Philipp
parents:
493
diff
changeset
|
586 |
619 | 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 | |
468
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
764 ; vim: ft=asm |
79b95db3d68f
- added (only partly annotated) x64/win64 disas examples
Tassilo Philipp
parents:
327
diff
changeset
|
765 |