; Standard macro set for NASM -*- nasm -*- ; Macros to make NASM ignore some TASM directives before the first include ; directive. %idefine IDEAL %idefine JUMPS %idefine P386 %idefine P486 %idefine P586 %idefine END ; This is a magic token which indicates the end of the TASM macros *END*TASM*MACROS* ; Note that although some user-level forms of directives are defined ; here, not all of them are: the user-level form of a format-specific ; directive should be defined in the module for that directive. ; These two need to be defined, though the actual definitions will ; be constantly updated during preprocessing. %define __FILE__ %define __LINE__ %define __SECT__ [section .text] ; it ought to be defined, even if as nothing %imacro section 1+.nolist %define __SECT__ [section %1] __SECT__ %endmacro %imacro segment 1+.nolist %define __SECT__ [segment %1] __SECT__ %endmacro %imacro absolute 1+.nolist %define __SECT__ [absolute %1] __SECT__ %endmacro %imacro struc 1.nolist %push struc %define %$strucname %1 [absolute 0] %$strucname: ; allow definition of `.member' to work sanely %endmacro %imacro endstruc 0.nolist %{$strucname}_size: %pop __SECT__ %endmacro %imacro istruc 1.nolist %push istruc %define %$strucname %1 %$strucstart: %endmacro %imacro at 1-2+.nolist times %1-($-%$strucstart) db 0 %2 %endmacro %imacro iend 0.nolist times %{$strucname}_size-($-%$strucstart) db 0 %pop %endmacro %imacro align 1-2+.nolist nop %ifidni %2,nop [align %1] %else times ($$-$) & ((%1)-1) %2 %endif %endmacro %imacro alignb 1-2+.nolist resb 1 times ($$-$) & ((%1)-1) %2 %endmacro %imacro extern 1-*.nolist %rep %0 [extern %1] %rotate 1 %endrep %endmacro %imacro bits 1+.nolist [bits %1] %endmacro %imacro use16 0.nolist [bits 16] %endmacro %imacro use32 0.nolist [bits 32] %endmacro %imacro use64 0.nolist [bits 64] %endmacro %imacro global 1-*.nolist %rep %0 [global %1] %rotate 1 %endrep %endmacro %imacro common 1-*.nolist %rep %0 [common %1] %rotate 1 %endrep %endmacro %imacro cpu 1+.nolist [cpu %1] %endmacro %imacro default 1+.nolist [default %1] %endmacro ; NASM compatibility shim %define __OUTPUT_FORMAT__ __YASM_OBJFMT__ %ifidn __YASM_OBJFMT__,bin %imacro org 1+.nolist [org %1] %endmacro %endif %ifidn __YASM_OBJFMT__,win32 %imacro export 1+.nolist [export %1] %endmacro %imacro safeseh 1+.nolist [safeseh %1] %endmacro %endif %ifidn __YASM_OBJFMT__,win64 %define __YASM_WIN64__ %endif %ifidn __YASM_OBJFMT__,x64 %define __YASM_WIN64__ %endif %ifdef __YASM_WIN64__ %undef __YASM_WIN64__ %imacro export 1+.nolist [export %1] %endmacro ; Raw exception handling operations %imacro proc_frame 1+.nolist %1: [proc_frame %1] %endmacro %if 0 ; Disable these as they're too closely named to the macroized ones. ; MASM needs a preceding . to use these, so it seems reasonable for ; us to similarly require the []. %imacro pushreg 1.nolist [pushreg %1] %endmacro %imacro setframe 1-2.nolist [setframe %1 %2] %endmacro %imacro allocstack 1.nolist [allocstack %1] %endmacro %imacro savereg 2.nolist [savereg %1 %2] %endmacro %imacro savexmm128 2.nolist [savexmm128 %1 %2] %endmacro %imacro pushframe 0-1.nolist [pushframe %1] %endmacro %imacro endprolog 0.nolist [endprolog] %endmacro %endif %imacro endproc_frame 0.nolist [endproc_frame] %endmacro ; Complex (macro) exception handling operations ; Mimics many macros provided by MASM's macamd64.inc %imacro push_reg 1 push %1 [pushreg %1] %endmacro %imacro rex_push_reg 1 db 0x48 push %1 [pushreg %1] %endmacro %imacro push_eflags 0 pushfq [allocstack 8] %endmacro %imacro rex_push_eflags 0 db 0x48 pushfq [allocstack 8] %endmacro %imacro alloc_stack 1 sub rsp, %1 [allocstack %1] %endmacro %imacro save_reg 2 mov [rsp+%2], %1 [savereg %1 %2] %endmacro %imacro save_xmm128 2 movdqa [rsp+%2], %1 [savexmm128 %1 %2] %endmacro %imacro push_frame 0-1.nolist [pushframe %1] %endmacro %imacro set_frame 1-2 %if %0==1 mov %1, rsp %else lea %1, [rsp+%2] %endif [setframe %1 %2] %endmacro %imacro end_prolog 0.nolist [endprolog] %endmacro %imacro end_prologue 0.nolist [endprolog] %endmacro %endif %ifidn __YASM_OBJFMT__,elf %define __YASM_ELF__ %endif %ifidn __YASM_OBJFMT__,elf32 %define __YASM_ELF__ %endif %ifidn __YASM_OBJFMT__,elf64 %define __YASM_ELF__ %endif %ifdef __YASM_ELF__ %undef __YASM_ELF__ %imacro type 1+.nolist [type %1] %endmacro %imacro size 1+.nolist [size %1] %endmacro %imacro weak 1+.nolist [weak %1] %endmacro %endif %ifidn __YASM_OBJFMT__,rdf %imacro library 1+.nolist [library %1] %endmacro %imacro module 1+.nolist [module %1] %endmacro %endif