mirror of
https://github.com/netwide-assembler/nasm.git
synced 2024-11-21 03:14:19 +08:00
332 lines
8.6 KiB
Plaintext
332 lines
8.6 KiB
Plaintext
;; --------------------------------------------------------------------------
|
|
;;
|
|
;; Copyright 1996-2019 The NASM Authors - All Rights Reserved
|
|
;; See the file AUTHORS included with the NASM distribution for
|
|
;; the specific copyright holders.
|
|
;;
|
|
;; Redistribution and use in source and binary forms, with or without
|
|
;; modification, are permitted provided that the following
|
|
;; conditions are met:
|
|
;;
|
|
;; * Redistributions of source code must retain the above copyright
|
|
;; notice, this list of conditions and the following disclaimer.
|
|
;; * Redistributions in binary form must reproduce the above
|
|
;; copyright notice, this list of conditions and the following
|
|
;; disclaimer in the documentation and/or other materials provided
|
|
;; with the distribution.
|
|
;;
|
|
;; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
|
;; CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
|
;; INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
;; MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
;; DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
|
;; CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
;; SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
;; NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
;; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
;; HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
;; CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
|
;; OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|
;; EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
;;
|
|
;; --------------------------------------------------------------------------
|
|
|
|
; Standard macro set for NASM -*- nasm -*-
|
|
|
|
; Macros to make NASM ignore some TASM directives
|
|
STD: tasm
|
|
%idefine IDEAL
|
|
%idefine JUMPS
|
|
%idefine P386
|
|
%idefine P486
|
|
%idefine P586
|
|
%idefine END
|
|
|
|
; The normal standard macros
|
|
STD: nasm
|
|
|
|
; 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.
|
|
|
|
%define __?SECT?__ ; it ought to be defined, even if as nothing
|
|
%defalias __SECT__ __?SECT?__
|
|
|
|
%imacro section 1+.nolist
|
|
%define __?SECT?__ [section %1]
|
|
__?SECT?__
|
|
%endmacro
|
|
|
|
%imacro segment 1+.nolist
|
|
%define __?SECT?__ [segment %1]
|
|
__?SECT?__
|
|
%endmacro
|
|
|
|
%define __?SECTALIGN_ALIGN_UPDATES_SECTION?__ 1
|
|
%imacro sectalign 1+.nolist
|
|
%ifidni %1,off
|
|
%define __?SECTALIGN_ALIGN_UPDATES_SECTION?__ 0
|
|
%elifidni %1,on
|
|
%define __?SECTALIGN_ALIGN_UPDATES_SECTION?__ 1
|
|
%else
|
|
[sectalign %1]
|
|
%endif
|
|
%endmacro
|
|
%defalias __SECTALIGN_ALIGN_UPDATES_SECTION__ __?SECTALIGN_ALIGN_UPDATES_SECTION?__
|
|
|
|
%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
|
|
%defstr %$member %1
|
|
%substr %$member1 %$member 1
|
|
%ifidn %$member1, '.'
|
|
times (%$strucname%1-%$strucname)-($-%$strucstart) db 0
|
|
%else
|
|
times (%1-%$strucname)-($-%$strucstart) db 0
|
|
%endif
|
|
%2
|
|
%endmacro
|
|
|
|
%imacro iend 0.nolist
|
|
times %{$strucname}_size-($-%$strucstart) db 0
|
|
%pop
|
|
%endmacro
|
|
|
|
%imacro align 1-2+.nolist nop
|
|
%if __?SECTALIGN_ALIGN_UPDATES_SECTION?__
|
|
sectalign %1
|
|
%endif
|
|
times (((%1) - (($-$$) % (%1))) % (%1)) %2
|
|
%endmacro
|
|
|
|
%imacro alignb 1-2+.nolist
|
|
%if __?SECTALIGN_ALIGN_UPDATES_SECTION?__
|
|
sectalign %1
|
|
%endif
|
|
%ifempty %2
|
|
[warning push]
|
|
[warning -zeroing]
|
|
resb (((%1) - (($-$$) % (%1))) % (%1))
|
|
[warning pop]
|
|
%else
|
|
times (((%1) - (($-$$) % (%1))) % (%1)) %2
|
|
%endif
|
|
%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 extern 1-*.nolist
|
|
%rep %0
|
|
[extern %1]
|
|
%rotate 1
|
|
%endrep
|
|
%endmacro
|
|
|
|
%imacro static 1-*.nolist
|
|
%rep %0
|
|
[static %1]
|
|
%rotate 1
|
|
%endrep
|
|
%endmacro
|
|
|
|
%imacro global 1-*.nolist
|
|
%rep %0
|
|
[global %1]
|
|
%rotate 1
|
|
%endrep
|
|
%endmacro
|
|
|
|
%imacro required 1-*.nolist
|
|
%rep %0
|
|
[required %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?__
|
|
|
|
%defalias __FLOAT_DAZ__ __?FLOAT_DAZ?__
|
|
%defalias __FLOAT_ROUND__ __?FLOAT_ROUND?__
|
|
%defalias __FLOAT__ __?FLOAT?__
|
|
|
|
%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 userel 0.nolist
|
|
[default rel]
|
|
%endmacro
|
|
%imacro useabs 0.nolist
|
|
[default abs]
|
|
%endmacro
|
|
%imacro usebnd 0.nolist
|
|
[default bnd]
|
|
%endmacro
|
|
%imacro usenobnd 0.nolist
|
|
[default nobnd]
|
|
%endmacro
|
|
|
|
%imacro incbin 1-2+.nolist 0
|
|
%push
|
|
%pathsearch %$dep %1
|
|
%depend %$dep
|
|
%? %$dep,%2
|
|
%pop
|
|
%endmacro
|
|
|
|
; Compatibility macro aliases
|
|
%defalias __NASM_MAJOR__ __?NASM_MAJOR?__
|
|
%defalias __NASM_MINOR__ __?NASM_MINOR?__
|
|
%defalias __NASM_SUBMINOR__ __?NASM_SUBMINOR?__
|
|
%defalias __NASM_PATCHLEVEL__ __?NASM_PATCHLEVEL?__
|
|
%defalias __NASM_SNAPSHOT__ __?NASM_SNAPSHOT?__
|
|
%defalias __NASM_VERSION_ID__ __?NASM_VERSION_ID?__
|
|
%defalias __NASM_VER__ __?NASM_VER?__
|
|
|
|
%defalias __OUTPUT_FORMAT__ __?OUTPUT_FORMAT?__
|
|
%defalias __DEBUG_FORMAT__ __?DEBUG_FORMAT?__
|
|
|
|
%defalias __DATE__ __?DATE?__
|
|
%defalias __DATE_NUM__ __?DATE_NUM?__
|
|
%defalias __TIME__ __?TIME?__
|
|
%defalias __TIME_NUM__ __?TIME_NUM?__
|
|
%defalias __UTC_DATE__ __?UTC_DATE?__
|
|
%defalias __UTC_DATE_NUM__ __?UTC_DATE_NUM?__
|
|
%defalias __UTC_TIME__ __?UTC_TIME?__
|
|
%defalias __UTC_TIME_NUM__ __?UTC_TIME_NUM?__
|
|
%defalias __POSIX_TIME__ __?POSIX_TIME?__
|
|
|
|
%defalias __FILE__ __?FILE?__
|
|
%defalias __LINE__ __?LINE?__
|
|
%defalias __BITS__ __?BITS?__
|
|
%defalias __PTR__ __?PTR?__
|
|
%defalias __PASS__ __?PASS?__
|
|
|
|
; Backwards compatibility aliases for tokens. The extra level of indirection here
|
|
; means %aliases on|off will do the right thing for these as well.
|
|
%idefine __?infinity?__ %?
|
|
%idefine __?nan?__ %?
|
|
%idefine __?qnan?__ %?
|
|
%idefine __?snan?__ %?
|
|
|
|
%idefine __?float8?__ %?
|
|
%idefine __?float16?__ %?
|
|
%idefine __?float32?__ %?
|
|
%idefine __?float64?__ %?
|
|
%idefine __?float80m?__ %?
|
|
%idefine __?float80e?__ %?
|
|
%idefine __?float128l?__ %?
|
|
%idefine __?float128h?__ %?
|
|
|
|
%idefine __?utf16?__ %?
|
|
%idefine __?utf16le?__ %?
|
|
%idefine __?utf16be?__ %?
|
|
%idefine __?utf32?__ %?
|
|
%idefine __?utf32le?__ %?
|
|
%idefine __?utf32be?__ %?
|
|
|
|
%idefine __?ilog2e?__ %?
|
|
%idefine __?ilog2w?__ %?
|
|
%idefine __?ilog2f?__ %?
|
|
%idefine __?ilog2c?__ %?
|
|
|
|
%idefalias __infinity__ __?infinity?__
|
|
%idefalias __nan__ __?nan?__
|
|
%idefalias __qnan__ __?qnan?__
|
|
%idefalias __snan__ __?snan?__
|
|
|
|
%idefalias __float8__ __?float8?__
|
|
%idefalias __float16__ __?float16?__
|
|
%idefalias __float32__ __?float32?__
|
|
%idefalias __float64__ __?float64?__
|
|
%idefalias __float80m__ __?float80m?__
|
|
%idefalias __float80e__ __?float80e?__
|
|
%idefalias __float128l__ __?float128l?__
|
|
%idefalias __float128h__ __?float128h?__
|
|
|
|
%idefalias __utf16__ __?utf16?__
|
|
%idefalias __utf16le__ __?utf16le?__
|
|
%idefalias __utf16be__ __?utf16be?__
|
|
%idefalias __utf32__ __?utf32?__
|
|
%idefalias __utf32le__ __?utf32le?__
|
|
%idefalias __utf32be__ __?utf32be?__
|
|
|
|
%idefalias __ilog2e__ __?ilog2e?__
|
|
%idefalias __ilog2w__ __?ilog2w?__
|
|
%idefalias __ilog2f__ __?ilog2f?__
|
|
%idefalias __ilog2c__ __?ilog2c?__
|