diff options
Diffstat (limited to 'misc/myC32.mac')
-rw-r--r-- | misc/myC32.mac | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/misc/myC32.mac b/misc/myC32.mac new file mode 100644 index 0000000..e70fc82 --- /dev/null +++ b/misc/myC32.mac @@ -0,0 +1,121 @@ +; 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 + |