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 10ifdef @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 14if @wordsize eq 8 15 x64 equ 1 16endif 17else 18ifdef RAX 19 x64 equ 1 20endif 21endif 22 23 24ifdef x64 25 IS_X64 equ 1 26else 27 IS_X64 equ 0 28endif 29 30ifdef ABI_LINUX 31 IS_LINUX equ 1 32else 33 IS_LINUX equ 0 34endif 35 36ifndef x64 37; Use ABI_CDECL for x86 (32-bit) only 38; if ABI_CDECL is not defined, we use fastcall abi 39ifdef ABI_CDECL 40 IS_CDECL equ 1 41else 42 IS_CDECL equ 0 43endif 44endif 45 46OPTION PROLOGUE:NONE 47OPTION EPILOGUE:NONE 48 49MY_ASM_START macro 50 ifdef x64 51 .code 52 else 53 .386 54 .model flat 55 _TEXT$00 SEGMENT PARA PUBLIC 'CODE' 56 endif 57endm 58 59MY_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 72endm 73 74MY_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 85endm 86 87 88ifdef x64 89 REG_SIZE equ 8 90 REG_LOGAR_SIZE equ 3 91else 92 REG_SIZE equ 4 93 REG_LOGAR_SIZE equ 2 94endif 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 135ifdef 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 164else 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 173endif 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 192ifdef x64 193ifdef ABI_LINUX 194 195MY_PUSH_2_REGS macro 196 push r3 197 push r5 198endm 199 200MY_POP_2_REGS macro 201 pop r5 202 pop r3 203endm 204 205endif 206endif 207 208 209MY_PUSH_4_REGS macro 210 push r3 211 push r5 212 push r6 213 push r7 214endm 215 216MY_POP_4_REGS macro 217 pop r7 218 pop r6 219 pop r5 220 pop r3 221endm 222 223 224; for fastcall and for WIN-x64 225REG_PARAM_0_x equ x1 226REG_PARAM_0 equ r1 227REG_PARAM_1_x equ x2 228REG_PARAM_1 equ r2 229 230ifndef x64 231; for x86-fastcall 232 233REG_ABI_PARAM_0_x equ REG_PARAM_0_x 234REG_ABI_PARAM_0 equ REG_PARAM_0 235REG_ABI_PARAM_1_x equ REG_PARAM_1_x 236REG_ABI_PARAM_1 equ REG_PARAM_1 237 238MY_PUSH_PRESERVED_ABI_REGS_UP_TO_INCLUDING_R11 macro 239 MY_PUSH_4_REGS 240endm 241 242MY_POP_PRESERVED_ABI_REGS_UP_TO_INCLUDING_R11 macro 243 MY_POP_4_REGS 244endm 245 246else 247; x64 248 249if (IS_LINUX eq 0) 250 251; for WIN-x64: 252REG_PARAM_2_x equ x8 253REG_PARAM_2 equ r8 254REG_PARAM_3 equ r9 255 256REG_ABI_PARAM_0_x equ REG_PARAM_0_x 257REG_ABI_PARAM_0 equ REG_PARAM_0 258REG_ABI_PARAM_1_x equ REG_PARAM_1_x 259REG_ABI_PARAM_1 equ REG_PARAM_1 260REG_ABI_PARAM_2_x equ REG_PARAM_2_x 261REG_ABI_PARAM_2 equ REG_PARAM_2 262REG_ABI_PARAM_3 equ REG_PARAM_3 263 264else 265; for LINUX-x64: 266REG_LINUX_PARAM_0_x equ x7 267REG_LINUX_PARAM_0 equ r7 268REG_LINUX_PARAM_1_x equ x6 269REG_LINUX_PARAM_1 equ r6 270REG_LINUX_PARAM_2 equ r2 271REG_LINUX_PARAM_3 equ r1 272REG_LINUX_PARAM_4_x equ x8 273REG_LINUX_PARAM_4 equ r8 274REG_LINUX_PARAM_5 equ r9 275 276REG_ABI_PARAM_0_x equ REG_LINUX_PARAM_0_x 277REG_ABI_PARAM_0 equ REG_LINUX_PARAM_0 278REG_ABI_PARAM_1_x equ REG_LINUX_PARAM_1_x 279REG_ABI_PARAM_1 equ REG_LINUX_PARAM_1 280REG_ABI_PARAM_2 equ REG_LINUX_PARAM_2 281REG_ABI_PARAM_3 equ REG_LINUX_PARAM_3 282REG_ABI_PARAM_4_x equ REG_LINUX_PARAM_4_x 283REG_ABI_PARAM_4 equ REG_LINUX_PARAM_4 284REG_ABI_PARAM_5 equ REG_LINUX_PARAM_5 285 286MY_ABI_LINUX_TO_WIN_2 macro 287 mov r2, r6 288 mov r1, r7 289endm 290 291MY_ABI_LINUX_TO_WIN_3 macro 292 mov r8, r2 293 mov r2, r6 294 mov r1, r7 295endm 296 297MY_ABI_LINUX_TO_WIN_4 macro 298 mov r9, r1 299 mov r8, r2 300 mov r2, r6 301 mov r1, r7 302endm 303 304endif ; IS_LINUX 305 306 307MY_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 313endm 314 315MY_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 321endm 322 323 324MY_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 330endm 331 332 333MY_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 339endm 340 341endif ; x64 342