Something went wrong. Try again.
Reactos
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465/* * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS Kernel * FILE: include/asm/asm.inc * PURPOSE: ASM macros for GAS and MASM/ML64 * PROGRAMMERS: Timo Kreuzer (timo.kreuzer@reactos.org) */#ifndef __ASM_INC__#define __ASM_INC__/* * Common definitions for the FPO macro. * See https://docs.microsoft.com/en-us/windows/desktop/api/winnt/ns-winnt-_fpo_data */#define FRAME_FPO 0#define FRAME_TRAP 1#define FRAME_TSS 2#define FRAME_NONFPO 3#ifdef _USE_ML/* Allow ".name" identifiers */OPTION DOTNAME#ifdef _M_IX86.686P.XMM.MODEL FLATASSUME FS:NOTHING, GS:NOTHING#endif/* Explicit radix in MASM syntax */#define BIN(x) x##y#define OCT(x) x##q#define DEC(x) x##t#define HEX(x) 0##x##h/* Macro values need not be marked */#define VAL(x) x/* MASM/ML doesn't want explicit [rip] addressing */rip = 0/* Due to MASM's reverse syntax, we are forced to use a precompiler macro */#define MACRO(name, ...) name MACRO __VA_ARGS__/* To avoid reverse syntax we provide a new macro .PROC, replacing PROC... */.PROC MACRO name__current_function_name EQU %name#ifdef _M_IX86 %name PROC#else %name PROC FRAME#endifENDM#define FUNC .PROC/* ... and .ENDP, replacing ENDP */.ENDP MACRO %__current_function_name ENDPENDM#define ENDFUNC .ENDP/* Global labels need an extra colon */GLOBAL_LABEL MACRO label %label::ENDM/* * See https://docs.microsoft.com/en-us/cpp/assembler/masm/dot-fpo * and https://docs.microsoft.com/en-us/windows/desktop/api/winnt/ns-winnt-_fpo_data */FPO MACRO cdwLocals, cdwParams, cbProlog, cbRegs, fUseBP, cbFrame .FPO (cdwLocals, cdwParams, cbProlog, cbRegs, fUseBP, cbFrame)ENDM/* MASM doesn't have an ASCII macro */.ASCII MACRO text:VARARG DB textENDM.ascii MACRO text:VARARG DB textENDM/* MASM doesn't have an ASCIZ macro */.ASCIZ MACRO text:VARARG DB text DB 0ENDM.asciz MACRO text:VARARG DB text DB 0ENDM.code64 MACRO .codeENDM.code32 MACRO .code .586PENDM.code16 MACRO ASSUME nothing .text SEGMENT use16 PUBLIC 'CODE' .586PENDM.endcode16 MACRO .text ENDSENDM.bss MACRO .DATA? ASSUME nothingENDM//.text MACRO//ENDM.align MACRO alignment ALIGN alignmentENDM.byte MACRO args:VARARG db argsENDM.short MACRO args:VARARG dw argsENDM.word MACRO args:VARARG dw argsENDM.long MACRO args:VARARG dd argsENDM.quad MACRO args:VARARG dq argsENDM.double MACRO args:VARARG real8 argsENDM.org MACRO value ORG valueENDM.fill MACRO count, size, value REPEAT count if (size EQ 1) DB value elseif (size EQ 2) DW value elseif (size EQ 4) DD value endif ENDMENDM.skip MACRO size, fill:=<0> DB size DUP (fill)ENDM.space MACRO size, fill:=<0> .skip size, fillENDM/* OFFset macro */#define OFF(x) offset x#define lXdtPrefix fword ptrljmp MACRO segment, offset DB 0EAh DD offset DW segmentENDMljmp16 MACRO segment, offset DB 0EAh DW offset DW segmentENDMdata32 MACRO opcode:VARARG DB 66h opcodeENDMUNIMPLEMENTED2 MACRO file, line, func jmp UNIMPLEMENTED2_IMPLUNIMPLEMENTED_MSG: .ascii "WARNING: %s at %s:%d is UNIMPLEMENTED!", 10, 0UNIMPLEMENTED_FUNC: .ascii "&func&", 0UNIMPLEMENTED_FILE: .ascii file, 0EXTERN DbgPrint:PROCUNIMPLEMENTED2_IMPL: sub rsp, 28h mov r9, line lea r8, UNIMPLEMENTED_FILE lea rdx, UNIMPLEMENTED_FUNC lea rcx, UNIMPLEMENTED_MSG call DbgPrint add rsp, 28h xor eax, eaxENDM#define UNIMPLEMENTED UNIMPLEMENTED2 __FILE__, __LINE__,absolute MACRO address __absolute__address__ = addressENDMresb MACRO name, size name = __absolute__address__ __absolute__address__ = __absolute__address__ + sizeENDM/* We need this to distinguish repeat from macros */#define ENDR ENDM#define CR 13#define LF 10#define NUL 0/* For compatibility with GAS */CFI_STARTPROC MACRO startENDMCFI_ENDPROC MACROENDMCFI_DEF_CFA MACRO reg:REQ, offset:REQENDMCFI_DEF_CFA_OFFSET MACRO offset:REQENDMCFI_DEF_CFA_REGISTER MACRO reg:REQENDMCFI_ADJUST_CFA_OFFSET MACRO offset:REQENDMCFI_OFFSET MACRO reg:REQ, offset:REQENDMCFI_REGISTER MACRO reg1:REQ, reg2:REQENDMCFI_REL_OFFSET MACRO reg:REQ, offset:REQENDMCFI_SAME_VALUE MACRO reg:REQENDM#else /***********************************************************************//* Force intel syntax */.intel_syntax noprefix/* Put dwarf debug info in the .dwarf_debug section, which will be properly stripped */.cfi_sections .debug_frame.altmacro/* Explicit radix in GAS syntax */#define BIN(x) 0b##x#define OCT(x) 0##x#define DEC(x) x#define HEX(x) 0x##x/* Macro values need to be marked */#define VAL(x) \x#define CR "\r"#define LF "\n"#define NUL "\0"/* Due to MASM's reverse syntax, we are forced to use a precompiler macro */#define MACRO(...) .macro __VA_ARGS__#define ENDM .endm/* To avoid reverse syntax we provide a new macro .PROC, replacing PROC... */.macro .PROC name .func \name \name:#ifdef _X86_ .cfi_startproc#else .seh_proc \name#endif.endm#define FUNC .PROC/* ... and .ENDP, replacing ENDP */.macro .ENDP#ifdef _X86_ .cfi_endproc#else .seh_endproc#endif .endfunc.endm#define ENDFUNC .ENDP/* MASM compatible PUBLIC */.macro PUBLIC symbol .global \symbol.endm/* No special marking of global labels */.macro GLOBAL_LABEL label \label:.endm/* Dummy ASSUME */.macro ASSUME p1 p2 p3 p4 p5 p6 p7 p8.endm/* MASM needs an end tag for segments */.macro .endcode16.endm/* MASM compatible ALIGN */.macro align x .align x.endm/* MASM compatible REPEAT, additional ENDR */#define REPEAT .rept#define ENDR .endr/* OFFset macro */#define OFF(x) x#define lXdtPrefix.macro ljmp segment, offset .byte 0xEA .long offset .word segment.endm.macro ljmp16 segment, offset .byte 0xEA .word offset .word segment.endm.macro data32 opcode:vararg .byte 0x66 opcode.endm.macro retf lret.endm/* MASM compatible EXTERN */.macro EXTERN name.endm/* MASM needs an END tag */.macro END.endm.macro .MODEL model.endm.macro .code .text.endm.macro .const .section .rdata.endm/* * See https://docs.microsoft.com/en-us/cpp/assembler/masm/dot-fpo * and https://docs.microsoft.com/en-us/windows/desktop/api/winnt/ns-winnt-_fpo_data */.macro FPO cdwLocals, cdwParams, cbProlog, cbRegs, fUseBP, cbFrame .if (cbFrame == FRAME_TRAP) .cfi_signal_frame .endif.endm/* Macros for x64 stack unwind OPs */.macro .allocstack size .seh_stackalloc \size.endm.macro .pushframe param /* * FIXME. .seh_pushframe doesn't accept code argument. * Patch sent. */ .seh_pushframe \param.endm.macro .pushreg reg .seh_pushreg \reg.endm.macro .savereg reg, offset .seh_savereg \reg, \offset.endm.macro .savexmm128 reg, offset .seh_savexmm \reg, \offset.endm.macro .setframe reg, offset .seh_setframe \reg, \offset.endm.macro .endprolog .seh_endprologue.endm.macro absolute address __absolute__address__ = \address.endm.macro resb name, size \name = __absolute__address__ __absolute__address__ = __absolute__address__ + \size.endm.macro UNIMPLEMENTED2 file, line, func jmp 4f1: .ascii "Unimplemented %s (%s:%d)", CR, LF, NUL2: .asciz "\func"3: .asciz \file4: sub rsp, 0x20 lea rcx, 1b[rip] lea rdx, 2b[rip] lea r8, 3b[rip] mov r9, \line call DbgPrint add rsp, 0x20.endm#define UNIMPLEMENTED UNIMPLEMENTED2 __FILE__, __LINE__,/* MASM/ML uses ".if" for runtime conditionals, and "if" for compile time conditionals. We therefore use "if", too. .if shouldn't be used at all */#define if .if#define endif .endif#define else .else#define elseif .elseif/* CFI annotations */#define CFI_STARTPROC .cfi_startproc#define CFI_ENDPROC .cfi_endproc#define CFI_DEF_CFA .cfi_def_cfa#define CFI_DEF_CFA_OFFSET .cfi_def_cfa_offset#define CFI_DEF_CFA_REGISTER .cfi_def_cfa_register#define CFI_ADJUST_CFA_OFFSET .cfi_adjust_cfa_offset#define CFI_OFFSET .cfi_offset#define CFI_REGISTER .cfi_register#define CFI_REL_OFFSET .cfi_rel_offset#define CFI_SAME_VALUE .cfi_same_value#endif#endif /* __ASM_INC__ */