| 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 |