Mercurial > pub > dyncall > dyncall
comparison dyncall/dyncall_call_x86.S @ 610:fea865cd1305
- whitespace cosmetics
author | Tassilo Philipp |
---|---|
date | Thu, 29 Sep 2022 10:51:24 +0200 |
parents | ab2d78e48ca2 |
children | e5ad8cf0aa72 |
comparison
equal
deleted
inserted
replaced
609:f2f0e53d8b02 | 610:fea865cd1305 |
---|---|
55 | 55 |
56 */ | 56 */ |
57 | 57 |
58 GLOBAL(dcCall_x86_cdecl) | 58 GLOBAL(dcCall_x86_cdecl) |
59 BEGIN_PROC(dcCall_x86_cdecl) | 59 BEGIN_PROC(dcCall_x86_cdecl) |
60 PUSH(EBP) /* prolog. */ | 60 PUSH(EBP) /* prolog. */ |
61 MOVL(ESP,EBP) | 61 MOVL(ESP,EBP) |
62 PUSH(ESI) /* save preserved registers. */ | 62 PUSH(ESI) /* save preserved registers. */ |
63 PUSH(EDI) | 63 PUSH(EDI) |
64 MOVL(DWORD(EBP,12),ESI) /* ESI = arg buffer ptr */ | 64 MOVL(DWORD(EBP,12),ESI) /* ESI = arg buffer ptr */ |
65 MOVL(DWORD(EBP,16),ECX) /* ECX = arg buffer size */ | 65 MOVL(DWORD(EBP,16),ECX) /* ECX = arg buffer size */ |
66 ADDL(LIT(15),ECX) /* ECX = align(ECX,16) */ | 66 ADDL(LIT(15),ECX) /* ECX = align(ECX,16) */ |
67 ANDL(LIT(-16),ECX) | 67 ANDL(LIT(-16),ECX) |
68 MOVL(ECX,DWORD(EBP,16)) /* save ECX. */ | 68 MOVL(ECX,DWORD(EBP,16)) /* save ECX. */ |
69 SUBL(ECX,ESP) /* allocate stack size */ | 69 SUBL(ECX,ESP) /* allocate stack size */ |
70 MOVL(ESP,EDI) /* EDI = stack ptr */ | 70 MOVL(ESP,EDI) /* EDI = stack ptr */ |
71 | 71 |
72 /* | 72 /* |
73 work around for rep movsd (not supported by SunPro) | 73 work around for rep movsd (not supported by SunPro) |
74 | 74 |
75 SHRL(LIT(2),ECX) | 75 SHRL(LIT(2),ECX) |
84 POP(ESI) | 84 POP(ESI) |
85 MOVL(EBP,ESP) | 85 MOVL(EBP,ESP) |
86 POP(EBP) | 86 POP(EBP) |
87 RET() | 87 RET() |
88 END_PROC(dcCall_x86_cdecl) | 88 END_PROC(dcCall_x86_cdecl) |
89 | |
90 | |
89 /* ---- C++ this calls (microsoft) ------------------------------------------ | 91 /* ---- C++ this calls (microsoft) ------------------------------------------ |
90 | 92 |
91 Details: | 93 Details: |
92 - this pointer is in ECX | 94 - this pointer is in ECX |
93 | 95 |
94 */ | 96 */ |
95 | 97 |
96 GLOBAL(dcCall_x86_win32_msthis) | 98 GLOBAL(dcCall_x86_win32_msthis) |
97 BEGIN_PROC(dcCall_x86_win32_msthis) | 99 BEGIN_PROC(dcCall_x86_win32_msthis) |
98 PUSH(EBP) /* prolog. */ | 100 PUSH(EBP) /* prolog. */ |
99 MOVL(ESP,EBP) | 101 MOVL(ESP,EBP) |
100 PUSH(ESI) /* save preserved. */ | 102 PUSH(ESI) /* save preserved. */ |
101 PUSH(EDI) | 103 PUSH(EDI) |
102 MOVL(DWORD(EBP,12),ESI) /* ESI = pointer on args. */ | 104 MOVL(DWORD(EBP,12),ESI) /* ESI = pointer on args. */ |
103 MOVL(DWORD(EBP,16),ECX) /* ECX = size. */ | 105 MOVL(DWORD(EBP,16),ECX) /* ECX = size. */ |
104 MOVL(DWORD(ESI,0),EAX) /* EAX = this pointer. */ | 106 MOVL(DWORD(ESI,0),EAX) /* EAX = this pointer. */ |
105 ADDL(LIT(4),ESI) /* increment args pointer by thisptr. */ | 107 ADDL(LIT(4),ESI) /* increment args pointer by thisptr. */ |
106 SUBL(LIT(4),ECX) /* decrement size by sizeof(thisptr). */ | 108 SUBL(LIT(4),ECX) /* decrement size by sizeof(thisptr). */ |
107 SUBL(ECX,ESP) /* allocate argument-block on stack. */ | 109 SUBL(ECX,ESP) /* allocate argument-block on stack. */ |
108 MOVL(ESP,EDI) /* EDI = stack args. */ | 110 MOVL(ESP,EDI) /* EDI = stack args. */ |
109 REP(MOVSB) /* copy arguments. */ | 111 REP(MOVSB) /* copy arguments. */ |
110 MOVL(EAX,ECX) /* ECX = this pointer. */ | 112 MOVL(EAX,ECX) /* ECX = this pointer. */ |
111 CALL_DWORD(EBP,8) /* call function. */ | 113 CALL_DWORD(EBP,8) /* call function. */ |
112 POP(EDI) /* restore preserved. */ | 114 POP(EDI) /* restore preserved. */ |
113 POP(ESI) | 115 POP(ESI) |
114 MOVL(EBP,ESP) /* epilog. */ | 116 MOVL(EBP,ESP) /* epilog. */ |
115 POP(EBP) | 117 POP(EBP) |
116 RET() | 118 RET() |
117 END_PROC(dcCall_x86_win32_msthis) | 119 END_PROC(dcCall_x86_win32_msthis) |
120 | |
118 | 121 |
119 /*---- win32 stdcall --------------------------------------------------------- | 122 /*---- win32 stdcall --------------------------------------------------------- |
120 | 123 |
121 Details: | 124 Details: |
122 - callee cleans up stack | 125 - callee cleans up stack |
123 | 126 |
124 */ | 127 */ |
125 | 128 |
126 GLOBAL(dcCall_x86_win32_std) | 129 GLOBAL(dcCall_x86_win32_std) |
127 BEGIN_PROC(dcCall_x86_win32_std) | 130 BEGIN_PROC(dcCall_x86_win32_std) |
128 PUSH(EBP) /* prolog. */ | 131 PUSH(EBP) /* prolog. */ |
129 MOVL(ESP,EBP) | 132 MOVL(ESP,EBP) |
130 PUSH(ESI) /* save ESI, EDI. */ | 133 PUSH(ESI) /* save ESI, EDI. */ |
131 PUSH(EDI) | 134 PUSH(EDI) |
132 MOVL(DWORD(EBP,12),ESI) /* ESI = args. */ | 135 MOVL(DWORD(EBP,12),ESI) /* ESI = args. */ |
133 MOVL(DWORD(EBP,16),ECX) /* ECX = size. */ | 136 MOVL(DWORD(EBP,16),ECX) /* ECX = size. */ |
134 SUBL(ECX,ESP) /* allocate size bytes on stack. */ | 137 SUBL(ECX,ESP) /* allocate size bytes on stack. */ |
135 MOVL(ESP,EDI) /* EDI = copy destination stack. */ | 138 MOVL(ESP,EDI) /* EDI = copy destination stack. */ |
136 REP(MOVSB) /* copy BYTEs. */ | 139 REP(MOVSB) /* copy BYTEs. */ |
137 CALL_DWORD(EBP,8) /* call target. */ | 140 CALL_DWORD(EBP,8) /* call target. */ |
138 POP(EDI) /* restore EDI, ESI. */ | 141 POP(EDI) /* restore EDI, ESI. */ |
139 POP(ESI) | 142 POP(ESI) |
140 MOVL(EBP,ESP) /* epilog. */ | 143 MOVL(EBP,ESP) /* epilog. */ |
141 POP(EBP) | 144 POP(EBP) |
142 RET() | 145 RET() |
143 END_PROC(dcCall_x86_win32_std) | 146 END_PROC(dcCall_x86_win32_std) |
147 | |
144 | 148 |
145 /*---- win32 fastcall (GNU/Microsoft) ---------------------------------------- | 149 /*---- win32 fastcall (GNU/Microsoft) ---------------------------------------- |
146 | 150 |
147 Details: | 151 Details: |
148 - callee cleans up stack | 152 - callee cleans up stack |
150 | 154 |
151 */ | 155 */ |
152 | 156 |
153 GLOBAL(dcCall_x86_win32_fast) | 157 GLOBAL(dcCall_x86_win32_fast) |
154 BEGIN_PROC(dcCall_x86_win32_fast) | 158 BEGIN_PROC(dcCall_x86_win32_fast) |
155 PUSH(EBP) /* prolog. */ | 159 PUSH(EBP) /* prolog. */ |
156 MOVL(ESP,EBP) | 160 MOVL(ESP,EBP) |
157 PUSH(ESI) /* save preserved. */ | 161 PUSH(ESI) /* save preserved. */ |
158 PUSH(EDI) | 162 PUSH(EDI) |
159 MOVL(DWORD(EBP,12),ESI) /* ESI = copy source args. */ | 163 MOVL(DWORD(EBP,12),ESI) /* ESI = copy source args. */ |
160 MOVL(DWORD(EBP,16),ECX) /* ECX = size. */ | 164 MOVL(DWORD(EBP,16),ECX) /* ECX = size. */ |
161 MOVL(DWORD(ESI,0),EAX) /* EAX = first argument. */ | 165 MOVL(DWORD(ESI,0),EAX) /* EAX = first argument. */ |
162 MOVL(DWORD(ESI,4),EDX) /* EDX = second argument. */ | 166 MOVL(DWORD(ESI,4),EDX) /* EDX = second argument. */ |
163 ADDL(LIT(8),ESI) /* skip registers. */ | 167 ADDL(LIT(8),ESI) /* skip registers. */ |
164 SUBL(LIT(8),ECX) | 168 SUBL(LIT(8),ECX) |
165 MOVL(ECX,DWORD(EBP,16)) /* save stack alloc size. */ | 169 MOVL(ECX,DWORD(EBP,16)) /* save stack alloc size. */ |
166 SUBL(ECX,ESP) /* allocate stack. */ | 170 SUBL(ECX,ESP) /* allocate stack. */ |
167 MOVL(ESP,EDI) /* EDI = stack args. */ | 171 MOVL(ESP,EDI) /* EDI = stack args. */ |
168 REP(MOVSB) /* copy BYTEs. */ | 172 REP(MOVSB) /* copy BYTEs. */ |
169 MOVL(EAX,ECX) /* ECX = first argument. */ | 173 MOVL(EAX,ECX) /* ECX = first argument. */ |
170 CALL_DWORD(EBP,8) /* call target. */ | 174 CALL_DWORD(EBP,8) /* call target. */ |
171 POP(EDI) /* restore preserved. */ | 175 POP(EDI) /* restore preserved. */ |
172 POP(ESI) | 176 POP(ESI) |
173 MOVL(EBP,ESP) /* epilog. */ | 177 MOVL(EBP,ESP) /* epilog. */ |
174 POP(EBP) | 178 POP(EBP) |
175 RET() | 179 RET() |
176 END_PROC(dcCall_x86_win32_fast) | 180 END_PROC(dcCall_x86_win32_fast) |
181 | |
177 | 182 |
178 /*--- syscall int80 linux --------------------------------------------------- | 183 /*--- syscall int80 linux --------------------------------------------------- |
179 | 184 |
180 Details: | 185 Details: |
181 - all arguments are passed via registers | 186 - all arguments are passed via registers |
182 | 187 |
183 */ | 188 */ |
184 | 189 |
185 GLOBAL(dcCall_x86_syscall_int80h_linux) | 190 GLOBAL(dcCall_x86_syscall_int80h_linux) |
186 BEGIN_PROC(dcCall_x86_syscall_int80h_linux) | 191 BEGIN_PROC(dcCall_x86_syscall_int80h_linux) |
187 PUSH(EBP) /* prolog. */ | 192 PUSH(EBP) /* prolog. */ |
188 MOVL(ESP,EBP) | 193 MOVL(ESP,EBP) |
189 PUSH(EBX) /* save preserved. */ | 194 PUSH(EBX) /* save preserved. */ |
190 PUSH(ESI) | 195 PUSH(ESI) |
191 PUSH(EDI) | 196 PUSH(EDI) |
192 MOVL(DWORD(EBP,12),EAX) /* EAX = argument buffer. */ | 197 MOVL(DWORD(EBP,12),EAX) /* EAX = argument buffer. */ |
193 MOVL(DWORD(EAX,0),EBX) /* move first five arguments. */ | 198 MOVL(DWORD(EAX,0),EBX) /* move first five arguments. */ |
194 MOVL(DWORD(EAX,4),ECX) | 199 MOVL(DWORD(EAX,4),ECX) |
195 MOVL(DWORD(EAX,8),EDX) | 200 MOVL(DWORD(EAX,8),EDX) |
196 MOVL(DWORD(EAX,12),ESI) | 201 MOVL(DWORD(EAX,12),ESI) |
197 MOVL(DWORD(EAX,16),EDI) | 202 MOVL(DWORD(EAX,16),EDI) |
198 MOVL(DWORD(EBP,8),EAX) /* EAX = syscall id. */ | 203 MOVL(DWORD(EBP,8),EAX) /* EAX = syscall id. */ |
199 INT(LIT(HEX(80))) | 204 INT(LIT(HEX(80))) |
200 POP(EDI) /* restore preserved. */ | 205 POP(EDI) /* restore preserved. */ |
201 POP(ESI) | 206 POP(ESI) |
202 POP(EBX) | 207 POP(EBX) |
203 MOVL(EBP,ESP) /* epilog. */ | 208 MOVL(EBP,ESP) /* epilog. */ |
204 POP(EBP) | 209 POP(EBP) |
205 RET() | 210 RET() |
206 END_PROC(dcCall_x86_syscall_int80h_linux) | 211 END_PROC(dcCall_x86_syscall_int80h_linux) |
212 | |
207 | 213 |
208 /*--- syscall int80 bsd ----------------------------------------------------- | 214 /*--- syscall int80 bsd ----------------------------------------------------- |
209 | 215 |
210 Details: | 216 Details: |
211 - all arguments are passed via stack | 217 - all arguments are passed via stack |
212 | 218 |
213 */ | 219 */ |
214 | 220 |
215 GLOBAL(dcCall_x86_syscall_int80h_bsd) | 221 GLOBAL(dcCall_x86_syscall_int80h_bsd) |
216 BEGIN_PROC(dcCall_x86_syscall_int80h_bsd) | 222 BEGIN_PROC(dcCall_x86_syscall_int80h_bsd) |
217 PUSH(EBP) /* prolog. */ | 223 PUSH(EBP) /* prolog. */ |
218 MOVL(ESP,EBP) | 224 MOVL(ESP,EBP) |
219 PUSH(ESI) /* save preserved. */ | 225 PUSH(ESI) /* save preserved. */ |
220 PUSH(EDI) | 226 PUSH(EDI) |
221 MOVL(DWORD(EBP,12),ESI) /* ESI = pointer on args. */ | 227 MOVL(DWORD(EBP,12),ESI) /* ESI = pointer on args. */ |
222 MOVL(DWORD(EBP,16),ECX) /* ECX = size. */ | 228 MOVL(DWORD(EBP,16),ECX) /* ECX = size. */ |
223 SUBL(ECX,ESP) /* allocate stack space. */ | 229 SUBL(ECX,ESP) /* allocate stack space. */ |
224 MOVL(ESP,EDI) /* EDI = stack args. */ | 230 MOVL(ESP,EDI) /* EDI = stack args. */ |
225 REP(MOVSB) | 231 REP(MOVSB) |
226 MOVL(DWORD(EBP,8),EAX) /* load system call id. */ | 232 MOVL(DWORD(EBP,8),EAX) /* load system call id. */ |
227 CALL(_do_int) | 233 CALL(_do_int) |
228 POP(EDI) /* restore preserved. */ | 234 POP(EDI) /* restore preserved. */ |
229 POP(ESI) | 235 POP(ESI) |
230 MOVL(EBP,ESP) /* epilog. */ | 236 MOVL(EBP,ESP) /* epilog. */ |
231 POP(EBP) | 237 POP(EBP) |
232 RET() | 238 RET() |
233 _do_int: | 239 _do_int: |
234 INT(LIT(HEX(80))) | 240 INT(LIT(HEX(80))) |
235 RET() | 241 RET() |