; 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