nasm/misc/myC32.mac
H. Peter Anvin d105682096 Remove $Id$ tags (useless with git)
Remove CVS $Id$ tags, since git doesn't use them.
2007-09-12 21:05:06 -07:00

122 lines
2.4 KiB
Plaintext

; NASM macro set to make interfacing to 32-bit programs easier
; Also cool little macros to make NASM emulate some MASM things.
;
; Originally included in NASM. Modifications by Peter Johnson, 1999.
;
%imacro proc 1 ; begin a procedure definition
%push proc
global %1
%1: push ebp
mov ebp, esp
%assign %$arg 8
;%assign %$argnum 0
%define %$procname %1
%endmacro
%imacro arg 0-1 4 ; used with the argument name as a label
%00 equ %$arg
;%assign %$argnum %$argnum+1
;.arg%$argnum equ %1
%assign %$arg %1+%$arg
%endmacro
%imacro endproc 0
%ifnctx proc
%error Mismatched `endproc'/`proc'
%else
; mov esp, ebp
; pop ebp
%ifdef LEGACY_ENDPROC
ret
%endif
;__end_%$procname: ; useful for calculating function size
; global %{$procname}_arglen
;%{$procname}_arglen equ %$arg-8
;%assign %$i 1
;%rep %$argnum
; global %{$procname}_arg%$i
;%{$procname}_arg%$i equ %{$procname}.arg%$i
;%assign %$i %$i+1
;%endrep
%pop
%endif
%endmacro
; redefine ret instructions for in-proc cases
%imacro ret 0-1
%ifnctx proc
ret %1
%else
mov esp, ebp
pop ebp
ret %1
%endif
%endmacro
%imacro retf 0-1
%ifnctx proc
retf %1
%else
mov esp, ebp
pop ebp
retf %1
%endif
%endmacro
%imacro retn 0-1
%ifnctx proc
retn %1
%else
mov esp, ebp
pop ebp
retn %1
%endif
%endmacro
; invoke calls a C function
; defaults to word (16 bit) size parameters
%macro invoke 1-*
%rotate -1
;%define invoketype word
%rep (%0-1)
; %ifidni %1,dword
; %define invoketype dword
; %elifidni %1,word
; %define invoketype word
; %elifidni %1,byte
; %define invoketype byte
; %else
%ifidni %1, cs
o16 push %1
%elifidni %1, ds
o16 push %1
%elifidni %1, es
o16 push %1
%elifidni %1, fs
o16 push %1
%elifidni %1, gs
o16 push %1
%elifidni %1, word cs
o16 push %1
%elifidni %1, word ds
o16 push %1
%elifidni %1, word es
o16 push %1
%elifidni %1, word fs
o16 push %1
%elifidni %1, word gs
o16 push %1
%else
push %1
%endif
; %endif
%rotate -1
%endrep
call %1
%if (%0!=1)
add esp, byte %{1}_arglen
%endif
%endmacro