annotate doc/disas_examples/x86.fastcall_ms.disas @ 530:585dcb68f55d

- more doc and disas examples for x86 fastcall and non-trivial aggregates
author Tassilo Philipp
date Sat, 16 Apr 2022 12:10:02 +0200
parents 79e76734bb5c
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
469
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
1 ; #include <stdlib.h>
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
2 ;
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
3 ; void leaf_call(int b, int c, int d, int e, int f, int g, int h)
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
4 ; {
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
5 ; }
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
6 ;
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
7 ; void nonleaf_call(int a, int b, int c, int d, int e, int f, int g, int h)
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
8 ; {
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
9 ; /* use some local data */
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
10 ; *(char*)alloca(220) = 'L';
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
11 ; leaf_call(b, c, d, e, f, g, h);
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
12 ; }
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
13 ;
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
14 ; int main()
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
15 ; {
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
16 ; nonleaf_call(0, 1, 2, 3, 4, 5, 6, 7);
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
17 ; return 0;
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
18 ; }
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
19
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
20
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
21
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
22 ; output from godbolt compiler explorer w/ msvc 19.0 (/Gr for fastcall)
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
23
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
24 _b$ = -8
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
25 _c$ = -4
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
26 @leaf_call@28 PROC
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
27 push ebp
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
28 mov ebp, esp
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
29 sub esp, 8
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
30 mov DWORD PTR _c$[ebp], edx
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
31 mov DWORD PTR _b$[ebp], ecx
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
32 mov esp, ebp
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
33 pop ebp
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
34 ret 20
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
35 @leaf_call@28 ENDP
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
36
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
37 _a$ = -8
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
38 _b$ = -4
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
39 _c$ = 8
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
40 _d$ = 12
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
41 _e$ = 16
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
42 _f$ = 20
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
43 _g$ = 24
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
44 _h$ = 28
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
45 @nonleaf_call@32 PROC
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
46 push ebp ; |
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
47 mov ebp, esp ; | prolog
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
48 sub esp, 8 ; |
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
49 mov DWORD PTR _b$[ebp], edx ; in arg 1 -> local area on stack
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
50 mov DWORD PTR _a$[ebp], ecx ; in arg 0 -> local area on stack
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
51 mov ecx, 220 ; |
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
52 call @alloca@4 ; | call alloca(220) (ecx = arg)
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
53 mov BYTE PTR [eax], 76 ; 'L' -> alloca()'d space (pointed to by alloca's retval in eax)
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
54 mov eax, DWORD PTR _h$[ebp] ; |
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
55 push eax ; |
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
56 mov ecx, DWORD PTR _g$[ebp] ; |
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
57 push ecx ; |
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
58 mov edx, DWORD PTR _f$[ebp] ; | read in args 3-7 from prev frame's param area, and ...
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
59 push edx ; | ... "push" onto stack as arg 2-6
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
60 mov eax, DWORD PTR _e$[ebp] ; |
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
61 push eax ; |
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
62 mov ecx, DWORD PTR _d$[ebp] ; |
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
63 push ecx ; |
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
64 mov edx, DWORD PTR _c$[ebp] ; arg 1 | read from prev frame's param
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
65 mov ecx, DWORD PTR _b$[ebp] ; arg 0 | area and put in regs
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
66 call @leaf_call@28 ; push return address and call
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
67 mov esp, ebp ; |
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
68 pop ebp ; | epilog
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
69 ret 24 ; |
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
70 @nonleaf_call@32 ENDP
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
71
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
72 _main PROC
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
73 push ebp ; | prolog
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
74 mov ebp, esp ; |
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
75 push 7 ; arg 7
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
76 push 6 ; arg 6
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
77 push 5 ; arg 5
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
78 push 4 ; arg 4
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
79 push 3 ; arg 3
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
80 push 2 ; arg 2
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
81 mov edx, 1 ; arg 1 (via reg)
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
82 xor ecx, ecx ; arg 0 (via reg)
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
83 call @nonleaf_call@32 ; push return address and call
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
84 xor eax, eax ; return value
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
85 pop ebp ; |
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
86 ret 0 ; | epilog
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
87 _main ENDP
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
88
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
89
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
90
470
Tassilo Philipp
parents: 469
diff changeset
91 ; ---------- structs by value (arg and return value), struct arg not fitting in regs ---------->
469
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
92 ;
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
93 ; struct A { int x; short y; char z; long long t; };
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
94 ;
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
95 ; struct A leaf_call(struct A a, short b, long long c, char d, int e, int f, int g, long long h)
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
96 ; {
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
97 ; a.x += 1;
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
98 ; return a;
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
99 ; }
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
100 ;
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
101 ; int main()
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
102 ; {
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
103 ; struct A a ={9, 99, 23, 12LL};
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
104 ; leaf_call(a, 1, 2, 3, 4, 5, 6, 7LL);
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
105 ; return 0;
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
106 ; }
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
107
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
108
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
109
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
110 ; output from godbolt compiler explorer w/ msvc 19.0 (/Gr for fastcall)
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
111
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
112 _b$ = -8
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
113 _d$ = -4
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
114 $T1 = 8
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
115 _a$ = 12
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
116 _c$ = 28
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
117 _e$ = 36
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
118 _f$ = 40
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
119 _g$ = 44
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
120 _h$ = 48
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
121 @leaf_call@52 PROC
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
122 push ebp ; |
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
123 mov ebp, esp ; | prolog
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
124 sub esp, 8 ; |
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
125 mov BYTE PTR _d$[ebp], dl ; in arg 3 -> local area on stack
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
126 mov WORD PTR _b$[ebp], cx ; in arg 1 -> local area on stack
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
127 mov eax, DWORD PTR _a$[ebp] ; \
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
128 add eax, 1 ; | get struct's x (from stack args), add 1 and write back
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
129 mov DWORD PTR _a$[ebp], eax ; /
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
130 mov ecx, DWORD PTR $T1[ebp] ; get ptr to retval struct passed as hidden arg (+8 to skip retval and saved ebp)
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
131 mov edx, DWORD PTR _a$[ebp] ; |
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
132 mov DWORD PTR [ecx], edx ; |
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
133 mov eax, DWORD PTR _a$[ebp+4] ; |
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
134 mov DWORD PTR [ecx+4], eax ; | copy modified (b/c of x+=1) struct arg to space of retval
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
135 mov edx, DWORD PTR _a$[ebp+8] ; |
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
136 mov DWORD PTR [ecx+8], edx ; |
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
137 mov eax, DWORD PTR _a$[ebp+12] ; |
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
138 mov DWORD PTR [ecx+12], eax ; |
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
139 mov eax, DWORD PTR $T1[ebp] ; return value (= ptr to struct that was passed-in as hidden arg)
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
140 mov esp, ebp ; |
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
141 pop ebp ; | epilog
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
142 ret 48 ; |
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
143 @leaf_call@52 ENDP
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
144
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
145 $T1 = -32
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
146 _a$ = -16
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
147 _main PROC
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
148 push ebp ; |
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
149 mov ebp, esp ; | prolog
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
150 sub esp, 32 ; / 32 = 16b local area for struct + 16b space used for retval struct
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
151 mov DWORD PTR _a$[ebp], 9 ; \ int x
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
152 mov eax, 99 ; | |
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
153 mov WORD PTR _a$[ebp+4], ax ; | struct values (local area) | short y
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
154 mov BYTE PTR _a$[ebp+6], 23 ; | char z
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
155 mov DWORD PTR _a$[ebp+8], 12 ; | |
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
156 mov DWORD PTR _a$[ebp+12], 0 ; / | long long t
470
Tassilo Philipp
parents: 469
diff changeset
157 push 0 ; \
469
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
158 push 7 ; | arg 7
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
159 push 6 ; arg 6
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
160 push 5 ; arg 5
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
161 push 4 ; arg 4
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
162 push 0 ; |
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
163 push 2 ; / arg 2 (via stack b/c not first arg and > 32 bits)
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
164 sub esp, 16 ; \
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
165 mov ecx, esp ; |
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
166 mov edx, DWORD PTR _a$[ebp] ; |
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
167 mov DWORD PTR [ecx], edx ; |
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
168 mov eax, DWORD PTR _a$[ebp+4] ; |
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
169 mov DWORD PTR [ecx+4], eax ; | arg 0 (struct), "pushed" onto stack (fetched from local area)
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
170 mov edx, DWORD PTR _a$[ebp+8] ; |
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
171 mov DWORD PTR [ecx+8], edx ; |
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
172 mov eax, DWORD PTR _a$[ebp+12] ; |
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
173 mov DWORD PTR [ecx+12], eax ; /
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
174 lea ecx, DWORD PTR $T1[ebp] ; \ ptr to space used for struct retval (pushed as hidden first arg)
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
175 push ecx ; |
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
176 mov dl, 3 ; arg 3 (via reg)
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
177 mov ecx, 1 ; arg 1 (via reg)
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
178 call @leaf_call@52 ; push return address and call
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
179 xor eax, eax ; return value
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
180 mov esp, ebp ; |
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
181 pop ebp ; | epilog
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
182 ret 0 ; |
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
183 _main ENDP
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
184
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
185
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
186
530
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
187 ; ---------- C++ trivial and non-trivial aggrs passed to C funcs ---------->
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
188 ;
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
189 ; struct Trivial { int a; };
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
190 ; struct NonTrivial {
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
191 ; int a;
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
192 ; NonTrivial() : a(0) {}
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
193 ; NonTrivial(const NonTrivial& rhs) : a(rhs.a) { }
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
194 ; };
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
195 ;
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
196 ; extern "C" {
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
197 ;
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
198 ; void f1(struct Trivial s) { }
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
199 ; void f2(struct NonTrivial s) { }
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
200 ;
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
201 ; void f()
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
202 ; {
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
203 ; struct Trivial t;
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
204 ; struct NonTrivial n;
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
205 ; int a=1;
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
206 ; a += 123;
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
207 ; f1(t);
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
208 ; a -= 123;
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
209 ; f2(n);
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
210 ; a -= 12;
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
211 ; }
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
212 ; }
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
213
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
214
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
215
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
216 ; output from godbolt compiler explorer w/ msvc 19.31 (/Gr for fastcall)
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
217
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
218 _this$ = -4
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
219 NonTrivial::NonTrivial(void) PROC
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
220 push ebp
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
221 mov ebp, esp
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
222 push ecx
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
223 mov DWORD PTR _this$[ebp], ecx
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
224 mov eax, DWORD PTR _this$[ebp]
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
225 mov DWORD PTR [eax], 0
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
226 mov eax, DWORD PTR _this$[ebp]
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
227 mov esp, ebp
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
228 pop ebp
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
229 ret 0
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
230 NonTrivial::NonTrivial(void) ENDP
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
231
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
232 _this$ = -4
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
233 _rhs$ = 8
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
234 NonTrivial::NonTrivial(NonTrivial const &) PROC
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
235 push ebp
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
236 mov ebp, esp
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
237 push ecx
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
238 mov DWORD PTR _this$[ebp], ecx
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
239 mov eax, DWORD PTR _this$[ebp]
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
240 mov ecx, DWORD PTR _rhs$[ebp]
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
241 mov edx, DWORD PTR [ecx]
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
242 mov DWORD PTR [eax], edx
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
243 mov eax, DWORD PTR _this$[ebp]
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
244 mov esp, ebp
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
245 pop ebp
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
246 ret 4
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
247 NonTrivial::NonTrivial(NonTrivial const &) ENDP
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
248
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
249 _s$ = 8
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
250 @f1@4 PROC
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
251 push ebp
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
252 mov ebp, esp
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
253 pop ebp
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
254 ret 4
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
255 @f1@4 ENDP
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
256
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
257 _s$ = 8
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
258 @f2@4 PROC
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
259 push ebp
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
260 mov ebp, esp
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
261 pop ebp
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
262 ret 4
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
263 @f2@4 ENDP
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
264
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
265 _t$ = -12
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
266 _n$ = -8
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
267 _a$ = -4
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
268 @f@0 PROC
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
269 push ebp ;
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
270 mov ebp, esp ;
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
271 sub esp, 12 ;
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
272 lea ecx, DWORD PTR _n$[ebp] ;
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
273 call NonTrivial::NonTrivial(void) ;
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
274 mov DWORD PTR _a$[ebp], 1 ;
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
275 mov eax, DWORD PTR _a$[ebp] ;
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
276 add eax, 123 ;
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
277 mov DWORD PTR _a$[ebp], eax ;
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
278 mov ecx, DWORD PTR _t$[ebp] ;
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
279 push ecx ;
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
280 call @f1@4 ;
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
281 mov edx, DWORD PTR _a$[ebp] ;
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
282 sub edx, 123 ;
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
283 mov DWORD PTR _a$[ebp], edx ;
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
284 push ecx ;
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
285 mov ecx, esp ;
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
286 lea eax, DWORD PTR _n$[ebp] ;
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
287 push eax ;
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
288 call NonTrivial::NonTrivial(NonTrivial const &) ;
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
289 call @f2@4 ;
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
290 mov ecx, DWORD PTR _a$[ebp] ;
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
291 sub ecx, 12 ;
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
292 mov DWORD PTR _a$[ebp], ecx ;
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
293 mov esp, ebp ;
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
294 pop ebp ;
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
295 ret 0 ;
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
296 @f@0 ENDP
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
297
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
298
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
299
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
300 ; ---------- C++ trivial and non-trivial aggrs as return values ---------->
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
301 ;
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
302 ; struct Trivial { int a; };
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
303 ; struct NonTrivial {
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
304 ; int a;
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
305 ; NonTrivial() : a(0) {}
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
306 ; NonTrivial(const NonTrivial& rhs) : a(rhs.a) { }
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
307 ; };
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
308 ;
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
309 ; extern "C" {
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
310 ; struct Trivial f1() { return Trivial(); }
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
311 ; }
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
312 ;
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
313 ; struct NonTrivial f2() { return NonTrivial(); }
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
314 ;
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
315 ; extern "C" {
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
316 ; void f()
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
317 ; {
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
318 ; int a=1;
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
319 ; a += 123;
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
320 ; struct Trivial t = f1();
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
321 ; a -= 123;
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
322 ; struct NonTrivial n = f2();
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
323 ; a -= 12;
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
324 ; }
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
325 ; }
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
326
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
327
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
328
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
329 ; output from godbolt compiler explorer w/ msvc 19.31 (/Gr for fastcall)
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
330
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
331 _this$ = -4
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
332 NonTrivial::NonTrivial(void) PROC
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
333 push ebp
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
334 mov ebp, esp
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
335 push ecx
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
336 mov DWORD PTR _this$[ebp], ecx
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
337 mov eax, DWORD PTR _this$[ebp]
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
338 mov DWORD PTR [eax], 0
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
339 mov eax, DWORD PTR _this$[ebp]
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
340 mov esp, ebp
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
341 pop ebp
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
342 ret 0
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
343 NonTrivial::NonTrivial(void) ENDP
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
344
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
345 $T1 = -4
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
346 @f1@0 PROC
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
347 push ebp
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
348 mov ebp, esp
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
349 push ecx
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
350 xor eax, eax
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
351 mov DWORD PTR $T1[ebp], eax
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
352 mov eax, DWORD PTR $T1[ebp]
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
353 mov esp, ebp
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
354 pop ebp
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
355 ret 0
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
356 @f1@0 ENDP
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
357
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
358 ___$ReturnUdt$ = -4
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
359 NonTrivial f2(void) PROC
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
360 push ebp ;
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
361 mov ebp, esp ;
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
362 push ecx ; ptr to hidden retval space as first arg (fastcall, in ecx)
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
363 mov DWORD PTR ___$ReturnUdt$[ebp], ecx ; |
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
364 mov ecx, DWORD PTR ___$ReturnUdt$[ebp] ; | a bit pointless
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
365 call NonTrivial::NonTrivial(void) ;
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
366 mov eax, DWORD PTR ___$ReturnUdt$[ebp] ; return passed-in ptr ptr to hidden retval space in eax
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
367 mov esp, ebp ;
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
368 pop ebp ;
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
369 ret 0 ;
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
370 NonTrivial f2(void) ENDP
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
371
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
372 _n$ = -16
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
373 _t$ = -12
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
374 $T1 = -8
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
375 _a$ = -4
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
376 @f@0 PROC
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
377 push ebp ;
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
378 mov ebp, esp ;
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
379 sub esp, 16 ;
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
380 mov DWORD PTR _a$[ebp], 1 ; a = 1
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
381 mov eax, DWORD PTR _a$[ebp] ; |
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
382 add eax, 123 ; | a += 123
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
383 mov DWORD PTR _a$[ebp], eax ; |
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
384 call @f1@0 ; call f1()
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
385 mov DWORD PTR $T1[ebp], eax ; retval (trivial struct <= 32bits, returned via eax)
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
386 mov ecx, DWORD PTR $T1[ebp] ; | copy of retval from stack to stack
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
387 mov DWORD PTR _t$[ebp], ecx ; /
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
388 mov edx, DWORD PTR _a$[ebp] ; \
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
389 sub edx, 123 ; | a -= 123
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
390 mov DWORD PTR _a$[ebp], edx ; |
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
391 lea ecx, DWORD PTR _n$[ebp] ; hidden first arg: ptr to space for (non-trivial) retval
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
392 call NonTrivial f2(void) ; call f2()
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
393 mov eax, DWORD PTR _a$[ebp] ; |
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
394 sub eax, 12 ; | a -= 12
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
395 mov DWORD PTR _a$[ebp], eax ; |
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
396 mov esp, ebp ;
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
397 pop ebp ;
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
398 ret 0 ;
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
399 @f@0 ENDP
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
400
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
401
585dcb68f55d - more doc and disas examples for x86 fastcall and non-trivial aggregates
Tassilo Philipp
parents: 470
diff changeset
402
469
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
403 ; vim: ft=asm
984e6652b975 some x86 disas examples, for completion but also while researching struct by val passing on non-x64
Tassilo Philipp
parents:
diff changeset
404