2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Kernel
4 * FILE: include/asm/asm.inc
5 * PURPOSE: ASM macros for GAS and MASM/ML64
6 * PROGRAMMERS: Timo Kreuzer (timo.kreuzer@reactos.org)
12 /* Common definitions for FPO macro
13 see http://msdn.microsoft.com/en-us/library/ms679352%28VS.85%29.aspx */
17 #define FRAME_NONFPO 3
21 /* Allow ".name" identifiers */
28 ASSUME CS:NOTHING, DS:NOTHING, ES:NOTHING, FS:NOTHING, GS:NOTHING
31 /* Explicit radix in MASM syntax */
35 #define HEX(x) 0##x##h
37 /* Macro values need not be marked */
40 /* MASM/ML doesn't want explicit [rip] addressing */
43 /* Due to MASM's reverse syntax, we are forced to use a precompiler macro */
44 #define MACRO(name, ...) name MACRO __VA_ARGS__
46 /* To avoid reverse syntax we provide a new macro .PROC, replacing PROC... */
48 __current_function_name EQU %name
57 /* ... and .ENDP, replacing ENDP */
59 %__current_function_name ENDP
63 /* Global labels need an extra colon */
64 GLOBAL_LABEL MACRO label
68 /* check http://msdn.microsoft.com/en-us/library/9c9k076y%28VS.80%29.aspx
69 and http://msdn.microsoft.com/en-us/library/ms679352%28VS.85%29.aspx */
70 FPO MACRO cdwLocals, cdwParams, cbProlog, cbRegs, fUseBP, cbFrame
71 .FPO (cdwLocals, cdwParams, cbProlog, cbRegs, fUseBP, cbFrame)
74 /* MASM doesn't have an ASCII macro */
75 .ASCII MACRO text:VARARG
78 .ascii MACRO text:VARARG
82 /* MASM doesn't have an ASCIZ macro */
83 .ASCIZ MACRO text:VARARG
87 .asciz MACRO text:VARARG
119 .align MACRO alignment
123 .byte MACRO args:VARARG
127 .short MACRO args:VARARG
131 .word MACRO args:VARARG
135 .long MACRO args:VARARG
139 .quad MACRO args:VARARG
143 .double MACRO args:VARARG
151 .fill MACRO count, size, value
163 .skip MACRO size, fill:=<0>
167 .space MACRO size, fill:=<0>
171 ljmp MACRO segment, offset
177 ljmp16 MACRO segment, offset
183 data32 MACRO opcode:VARARG
188 UNIMPLEMENTED MACRO name
191 absolute MACRO address
192 __absolute__address__ = address
195 resb MACRO name, size
196 name = __absolute__address__
197 __absolute__address__ = __absolute__address__ + size
200 /* We need this to distinguish repeat from macros */
207 /* For compatibility with GAS */
208 CFI_STARTPROC MACRO start
212 CFI_DEF_CFA MACRO reg:REQ, offset:REQ
214 CFI_DEF_CFA_OFFSET MACRO offset:REQ
216 CFI_DEF_CFA_REGISTER MACRO reg:REQ
218 CFI_ADJUST_CFA_OFFSET MACRO offset:REQ
220 CFI_OFFSET MACRO reg:REQ, offset:REQ
222 CFI_REGISTER MACRO reg1:REQ, reg2:REQ
224 CFI_REL_OFFSET MACRO reg:REQ, offset:REQ
226 CFI_SAME_VALUE MACRO reg:REQ
229 #else /***********************************************************************/
231 /* Force intel syntax */
232 .intel_syntax noprefix
236 /* Explicit radix in GAS syntax */
242 /* Macro values need to be marked */
245 /* Due to MASM's reverse syntax, we are forced to use a precompiler macro */
246 #define MACRO(...) .macro __VA_ARGS__
249 /* To avoid reverse syntax we provide a new macro .PROC, replacing PROC... */
253 /* x86 GAS expects a label with _ prefix */
258 .equ cfa_current_offset, -8
262 /* ... and .ENDP, replacing ENDP */
267 #define ENDFUNC .ENDP
269 /* MASM compatible PUBLIC */
274 /* No special marking of global labels */
275 .macro GLOBAL_LABEL label
280 .macro ASSUME p1 p2 p3 p4 p5 p6 p7 p8
283 /* MASM needs an end tag for segments */
287 /* MASM compatible ALIGN */
290 /* MASM compatible REPEAT, additional ENDR */
294 .macro ljmp segment, offset
295 jmp far ptr \segment:\offset
298 .macro ljmp16 segment, offset
299 jmp far ptr \segment:\offset
302 /* MASM compatible EXTERN */
306 /* MASM needs an END tag */
320 /* check http://msdn.microsoft.com/en-us/library/9c9k076y%28VS.80%29.aspx
321 and http://msdn.microsoft.com/en-us/library/ms679352%28VS.85%29.aspx */
322 .macro FPO cdwLocals, cdwParams, cbProlog, cbRegs, fUseBP, cbFrame
323 .if (cbFrame == FRAME_TRAP)
328 /* Macros for x64 stack unwind OPs */
330 .macro .allocstack size
331 .cfi_adjust_cfa_offset \size
332 .set cfa_current_offset, cfa_current_offset - \size
336 .macro .pushframe param=0
338 .cfi_adjust_cfa_offset 0x30
339 .set cfa_current_offset, cfa_current_offset - 0x30
341 .cfi_adjust_cfa_offset 0x28
342 .set cfa_current_offset, cfa_current_offset - 0x28
347 .cfi_adjust_cfa_offset 8
348 .equ cfa_current_offset, cfa_current_offset - 8
349 .cfi_offset \reg, cfa_current_offset
352 .macro .savereg reg, offset
354 .cfi_offset \reg, \offset
357 .macro .savexmm128 reg, offset
359 .cfi_offset \reg, \offset
362 .macro .setframe reg, offset
363 .cfi_def_cfa reg, \offset
364 .equ cfa_current_offset, \offset
370 .macro absolute address
371 __absolute__address__ = \address
374 .macro resb name, size
375 \name = __absolute__address__
376 __absolute__address__ = __absolute__address__ + \size
379 .macro UNIMPLEMENTED2 file, line, func
385 lea rcx, MsgUnimplemented[rip]
392 #define UNIMPLEMENTED UNIMPLEMENTED2 __FILE__, __LINE__,
394 /* MASM/ML uses ".if" for runtime conditionals, and "if" for compile time
395 conditionals. We therefore use "if", too. .if shouldn't be used at all */
399 #define elseif .elseif
405 /* CFI annotations */
406 #define CFI_STARTPROC .cfi_startproc
407 #define CFI_ENDPROC .cfi_endproc
408 #define CFI_DEF_CFA .cfi_def_cfa
409 #define CFI_DEF_CFA_OFFSET .cfi_def_cfa_offset
410 #define CFI_DEF_CFA_REGISTER .cfi_def_cfa_register
411 #define CFI_ADJUST_CFA_OFFSET .cfi_adjust_cfa_offset
412 #define CFI_OFFSET .cfi_offset
413 #define CFI_REGISTER .cfi_register
414 #define CFI_REL_OFFSET .cfi_rel_offset
415 #define CFI_SAME_VALUE .cfi_same_value
419 #endif /* __ASM_INC__ */