f535537f |
1 | ; 7zAsm.asm -- ASM macros |
2 | ; 2023-12-08 : Igor Pavlov : Public domain |
3 | |
4 | |
5 | ; UASM can require these changes |
6 | ; OPTION FRAMEPRESERVEFLAGS:ON |
7 | ; OPTION PROLOGUE:NONE |
8 | ; OPTION EPILOGUE:NONE |
9 | |
10 | ifdef @wordsize |
11 | ; @wordsize is defined only in JWASM and ASMC and is not defined in MASM |
12 | ; @wordsize eq 8 for 64-bit x64 |
13 | ; @wordsize eq 2 for 32-bit x86 |
14 | if @wordsize eq 8 |
15 | x64 equ 1 |
16 | endif |
17 | else |
18 | ifdef RAX |
19 | x64 equ 1 |
20 | endif |
21 | endif |
22 | |
23 | |
24 | ifdef x64 |
25 | IS_X64 equ 1 |
26 | else |
27 | IS_X64 equ 0 |
28 | endif |
29 | |
30 | ifdef ABI_LINUX |
31 | IS_LINUX equ 1 |
32 | else |
33 | IS_LINUX equ 0 |
34 | endif |
35 | |
36 | ifndef x64 |
37 | ; Use ABI_CDECL for x86 (32-bit) only |
38 | ; if ABI_CDECL is not defined, we use fastcall abi |
39 | ifdef ABI_CDECL |
40 | IS_CDECL equ 1 |
41 | else |
42 | IS_CDECL equ 0 |
43 | endif |
44 | endif |
45 | |
46 | OPTION PROLOGUE:NONE |
47 | OPTION EPILOGUE:NONE |
48 | |
49 | MY_ASM_START macro |
50 | ifdef x64 |
51 | .code |
52 | else |
53 | .386 |
54 | .model flat |
55 | _TEXT$00 SEGMENT PARA PUBLIC 'CODE' |
56 | endif |
57 | endm |
58 | |
59 | MY_PROC macro name:req, numParams:req |
60 | align 16 |
61 | proc_numParams = numParams |
62 | if (IS_X64 gt 0) |
63 | proc_name equ name |
64 | elseif (IS_LINUX gt 0) |
65 | proc_name equ name |
66 | elseif (IS_CDECL gt 0) |
67 | proc_name equ @CatStr(_,name) |
68 | else |
69 | proc_name equ @CatStr(@,name,@, %numParams * 4) |
70 | endif |
71 | proc_name PROC |
72 | endm |
73 | |
74 | MY_ENDP macro |
75 | if (IS_X64 gt 0) |
76 | ret |
77 | elseif (IS_CDECL gt 0) |
78 | ret |
79 | elseif (proc_numParams LT 3) |
80 | ret |
81 | else |
82 | ret (proc_numParams - 2) * 4 |
83 | endif |
84 | proc_name ENDP |
85 | endm |
86 | |
87 | |
88 | ifdef x64 |
89 | REG_SIZE equ 8 |
90 | REG_LOGAR_SIZE equ 3 |
91 | else |
92 | REG_SIZE equ 4 |
93 | REG_LOGAR_SIZE equ 2 |
94 | endif |
95 | |
96 | x0 equ EAX |
97 | x1 equ ECX |
98 | x2 equ EDX |
99 | x3 equ EBX |
100 | x4 equ ESP |
101 | x5 equ EBP |
102 | x6 equ ESI |
103 | x7 equ EDI |
104 | |
105 | x0_W equ AX |
106 | x1_W equ CX |
107 | x2_W equ DX |
108 | x3_W equ BX |
109 | |
110 | x5_W equ BP |
111 | x6_W equ SI |
112 | x7_W equ DI |
113 | |
114 | x0_L equ AL |
115 | x1_L equ CL |
116 | x2_L equ DL |
117 | x3_L equ BL |
118 | |
119 | x0_H equ AH |
120 | x1_H equ CH |
121 | x2_H equ DH |
122 | x3_H equ BH |
123 | |
124 | ; r0_L equ AL |
125 | ; r1_L equ CL |
126 | ; r2_L equ DL |
127 | ; r3_L equ BL |
128 | |
129 | ; r0_H equ AH |
130 | ; r1_H equ CH |
131 | ; r2_H equ DH |
132 | ; r3_H equ BH |
133 | |
134 | |
135 | ifdef x64 |
136 | x5_L equ BPL |
137 | x6_L equ SIL |
138 | x7_L equ DIL |
139 | x8_L equ r8b |
140 | x9_L equ r9b |
141 | x10_L equ r10b |
142 | x11_L equ r11b |
143 | x12_L equ r12b |
144 | x13_L equ r13b |
145 | x14_L equ r14b |
146 | x15_L equ r15b |
147 | |
148 | r0 equ RAX |
149 | r1 equ RCX |
150 | r2 equ RDX |
151 | r3 equ RBX |
152 | r4 equ RSP |
153 | r5 equ RBP |
154 | r6 equ RSI |
155 | r7 equ RDI |
156 | x8 equ r8d |
157 | x9 equ r9d |
158 | x10 equ r10d |
159 | x11 equ r11d |
160 | x12 equ r12d |
161 | x13 equ r13d |
162 | x14 equ r14d |
163 | x15 equ r15d |
164 | else |
165 | r0 equ x0 |
166 | r1 equ x1 |
167 | r2 equ x2 |
168 | r3 equ x3 |
169 | r4 equ x4 |
170 | r5 equ x5 |
171 | r6 equ x6 |
172 | r7 equ x7 |
173 | endif |
174 | |
175 | x0_R equ r0 |
176 | x1_R equ r1 |
177 | x2_R equ r2 |
178 | x3_R equ r3 |
179 | x4_R equ r4 |
180 | x5_R equ r5 |
181 | x6_R equ r6 |
182 | x7_R equ r7 |
183 | x8_R equ r8 |
184 | x9_R equ r9 |
185 | x10_R equ r10 |
186 | x11_R equ r11 |
187 | x12_R equ r12 |
188 | x13_R equ r13 |
189 | x14_R equ r14 |
190 | x15_R equ r15 |
191 | |
192 | ifdef x64 |
193 | ifdef ABI_LINUX |
194 | |
195 | MY_PUSH_2_REGS macro |
196 | push r3 |
197 | push r5 |
198 | endm |
199 | |
200 | MY_POP_2_REGS macro |
201 | pop r5 |
202 | pop r3 |
203 | endm |
204 | |
205 | endif |
206 | endif |
207 | |
208 | |
209 | MY_PUSH_4_REGS macro |
210 | push r3 |
211 | push r5 |
212 | push r6 |
213 | push r7 |
214 | endm |
215 | |
216 | MY_POP_4_REGS macro |
217 | pop r7 |
218 | pop r6 |
219 | pop r5 |
220 | pop r3 |
221 | endm |
222 | |
223 | |
224 | ; for fastcall and for WIN-x64 |
225 | REG_PARAM_0_x equ x1 |
226 | REG_PARAM_0 equ r1 |
227 | REG_PARAM_1_x equ x2 |
228 | REG_PARAM_1 equ r2 |
229 | |
230 | ifndef x64 |
231 | ; for x86-fastcall |
232 | |
233 | REG_ABI_PARAM_0_x equ REG_PARAM_0_x |
234 | REG_ABI_PARAM_0 equ REG_PARAM_0 |
235 | REG_ABI_PARAM_1_x equ REG_PARAM_1_x |
236 | REG_ABI_PARAM_1 equ REG_PARAM_1 |
237 | |
238 | MY_PUSH_PRESERVED_ABI_REGS_UP_TO_INCLUDING_R11 macro |
239 | MY_PUSH_4_REGS |
240 | endm |
241 | |
242 | MY_POP_PRESERVED_ABI_REGS_UP_TO_INCLUDING_R11 macro |
243 | MY_POP_4_REGS |
244 | endm |
245 | |
246 | else |
247 | ; x64 |
248 | |
249 | if (IS_LINUX eq 0) |
250 | |
251 | ; for WIN-x64: |
252 | REG_PARAM_2_x equ x8 |
253 | REG_PARAM_2 equ r8 |
254 | REG_PARAM_3 equ r9 |
255 | |
256 | REG_ABI_PARAM_0_x equ REG_PARAM_0_x |
257 | REG_ABI_PARAM_0 equ REG_PARAM_0 |
258 | REG_ABI_PARAM_1_x equ REG_PARAM_1_x |
259 | REG_ABI_PARAM_1 equ REG_PARAM_1 |
260 | REG_ABI_PARAM_2_x equ REG_PARAM_2_x |
261 | REG_ABI_PARAM_2 equ REG_PARAM_2 |
262 | REG_ABI_PARAM_3 equ REG_PARAM_3 |
263 | |
264 | else |
265 | ; for LINUX-x64: |
266 | REG_LINUX_PARAM_0_x equ x7 |
267 | REG_LINUX_PARAM_0 equ r7 |
268 | REG_LINUX_PARAM_1_x equ x6 |
269 | REG_LINUX_PARAM_1 equ r6 |
270 | REG_LINUX_PARAM_2 equ r2 |
271 | REG_LINUX_PARAM_3 equ r1 |
272 | REG_LINUX_PARAM_4_x equ x8 |
273 | REG_LINUX_PARAM_4 equ r8 |
274 | REG_LINUX_PARAM_5 equ r9 |
275 | |
276 | REG_ABI_PARAM_0_x equ REG_LINUX_PARAM_0_x |
277 | REG_ABI_PARAM_0 equ REG_LINUX_PARAM_0 |
278 | REG_ABI_PARAM_1_x equ REG_LINUX_PARAM_1_x |
279 | REG_ABI_PARAM_1 equ REG_LINUX_PARAM_1 |
280 | REG_ABI_PARAM_2 equ REG_LINUX_PARAM_2 |
281 | REG_ABI_PARAM_3 equ REG_LINUX_PARAM_3 |
282 | REG_ABI_PARAM_4_x equ REG_LINUX_PARAM_4_x |
283 | REG_ABI_PARAM_4 equ REG_LINUX_PARAM_4 |
284 | REG_ABI_PARAM_5 equ REG_LINUX_PARAM_5 |
285 | |
286 | MY_ABI_LINUX_TO_WIN_2 macro |
287 | mov r2, r6 |
288 | mov r1, r7 |
289 | endm |
290 | |
291 | MY_ABI_LINUX_TO_WIN_3 macro |
292 | mov r8, r2 |
293 | mov r2, r6 |
294 | mov r1, r7 |
295 | endm |
296 | |
297 | MY_ABI_LINUX_TO_WIN_4 macro |
298 | mov r9, r1 |
299 | mov r8, r2 |
300 | mov r2, r6 |
301 | mov r1, r7 |
302 | endm |
303 | |
304 | endif ; IS_LINUX |
305 | |
306 | |
307 | MY_PUSH_PRESERVED_ABI_REGS_UP_TO_INCLUDING_R11 macro |
308 | if (IS_LINUX gt 0) |
309 | MY_PUSH_2_REGS |
310 | else |
311 | MY_PUSH_4_REGS |
312 | endif |
313 | endm |
314 | |
315 | MY_POP_PRESERVED_ABI_REGS_UP_TO_INCLUDING_R11 macro |
316 | if (IS_LINUX gt 0) |
317 | MY_POP_2_REGS |
318 | else |
319 | MY_POP_4_REGS |
320 | endif |
321 | endm |
322 | |
323 | |
324 | MY_PUSH_PRESERVED_ABI_REGS macro |
325 | MY_PUSH_PRESERVED_ABI_REGS_UP_TO_INCLUDING_R11 |
326 | push r12 |
327 | push r13 |
328 | push r14 |
329 | push r15 |
330 | endm |
331 | |
332 | |
333 | MY_POP_PRESERVED_ABI_REGS macro |
334 | pop r15 |
335 | pop r14 |
336 | pop r13 |
337 | pop r12 |
338 | MY_POP_PRESERVED_ABI_REGS_UP_TO_INCLUDING_R11 |
339 | endm |
340 | |
341 | endif ; x64 |