mirror of
https://github.com/netwide-assembler/nasm.git
synced 2024-11-27 08:10:07 +08:00
56b820355c
Add an optional second argument to struc, document it and test it. Also removed trailing whitespace in nasmdoc.src in the process.
157 lines
2.9 KiB
Plaintext
157 lines
2.9 KiB
Plaintext
; 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 three need to be defined, though the actual definitions will
|
|
; be constantly updated during preprocessing.
|
|
%define __FILE__
|
|
%define __LINE__
|
|
%define __BITS__
|
|
|
|
%define __SECT__ ; 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-2.nolist 0
|
|
%push
|
|
%define %$strucname %1
|
|
[absolute %2]
|
|
%$strucname: ; allow definition of `.member' to work sanely
|
|
%endmacro
|
|
%imacro endstruc 0.nolist
|
|
%{$strucname}_size equ ($-%$strucname)
|
|
%pop
|
|
__SECT__
|
|
%endmacro
|
|
|
|
%imacro istruc 1.nolist
|
|
%push
|
|
%define %$strucname %1
|
|
%$strucstart:
|
|
%endmacro
|
|
%imacro at 1-2+.nolist
|
|
times (%1-%$strucname)-($-%$strucstart) db 0
|
|
%2
|
|
%endmacro
|
|
%imacro iend 0.nolist
|
|
times %{$strucname}_size-($-%$strucstart) db 0
|
|
%pop
|
|
%endmacro
|
|
|
|
%imacro align 1-2+.nolist nop
|
|
times (((%1) - (($-$$) % (%1))) % (%1)) %2
|
|
%endmacro
|
|
%imacro alignb 1-2+.nolist
|
|
%ifempty %2
|
|
resb (((%1) - (($-$$) % (%1))) % (%1))
|
|
%else
|
|
times (((%1) - (($-$$) % (%1))) % (%1)) %2
|
|
%endif
|
|
%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
|
|
|
|
%define __FLOAT_DAZ__ nodaz
|
|
%define __FLOAT_ROUND__ near
|
|
; __FLOAT__ contains the whole floating-point configuration so it can
|
|
; be saved and restored
|
|
%define __FLOAT__ __FLOAT_DAZ__,__FLOAT_ROUND__
|
|
%imacro float 1-*.nolist
|
|
%rep %0
|
|
[float %1]
|
|
%ifidni %1,daz
|
|
%define __FLOAT_DAZ__ daz
|
|
%elifidni %1,nodaz
|
|
%define __FLOAT_DAZ__ nodaz
|
|
%elifidni %1,near
|
|
%define __FLOAT_ROUND__ near
|
|
%elifidni %1,up
|
|
%define __FLOAT_ROUND__ up
|
|
%elifidni %1,down
|
|
%define __FLOAT_ROUND__ down
|
|
%elifidni %1,zero
|
|
%define __FLOAT_ROUND__ zero
|
|
%elifidni %1,default
|
|
%define __FLOAT_DAZ__ nodaz
|
|
%define __FLOAT_ROUND__ near
|
|
%endif
|
|
%rotate 1
|
|
%endrep
|
|
%endmacro
|
|
|
|
%imacro default 1+.nolist
|
|
[default %1]
|
|
%endmacro
|
|
|
|
%imacro incbin 1-2+.nolist 0
|
|
%push
|
|
%pathsearch %$dep %1
|
|
%depend %$dep
|
|
%? %$dep,%2
|
|
%pop
|
|
%endmacro
|