Hello everyone, I am trying to make some macro to aid programming in assembly. And what I am trying to do is, to define some macro, which will define a function header (including the label, some standard routines and give names to each parameter), and also some define local variables. Here are the codes:
%macro FUNCTION 1-*
%1:
push ebp
mov ebp, esp
%assign i 1
%rotate 1
%rep (%0 - 1) / 2
%xdefine %2 %1 [ebp + i * 4]
%assign i i + 1
%rotate 2
%endrep
%define no_paras ((%0 - 1) / 2)
%endmacro
%macro LOCALS 2-*
sub esp, %0 / 2 * 4
%assign i 1
%rep %0 / 2
%xdefine %2 %1 [ebp - i * 4]
%assign i i + 1
%rotate 2
%endrep
%define no_locals (%0 / 2)
%endmacro
When calling the macros, one would write something like this:
FUNCTION func1, dword, a, dword, b
LOCALS dword, c, dword, d
where func1 is the function name (the label), a and b are parameters, c and d are local variables. I "define" the parameters and variables using %xdefine, as you can see in the macro.
So now the problem is, when I call the macro the second time, and using the same names for parameters and variables like this:
FUNCTION func1, dword, a
mov a, eax
FUNCTION func2, dword, a
mov a, eax
I get some crazy stuff:
func1:
%line 3+0 C:\Users\edwardcarlfox\Desktop\ASMSrc\test.asm
push ebp
mov ebp, esp
%line 4+1 C:\Users\edwardcarlfox\Desktop\ASMSrc\test.asm
mov dword [ebp + 1 * 4], eax
func2:
%line 6+0 C:\Users\edwardcarlfox\Desktop\ASMSrc\test.asm
push ebp
mov ebp, esp
%line 7+1 C:\Users\edwardcarlfox\Desktop\ASMSrc\test.asm
mov [ebp + 1 * 4] dword [ebp + 1 * 4] [ebp + 1 * 4], eax
Technically, if I call the macro the second time, the name "a" will be redefined, so it will have a new value (although here the old and new values are the same). I cannot seem to find any error that causes this problem. But if I every time use different names, I have no problem.
Could some one see the problem? Or maybe I used some bad solution for this?
PS: I know there are already standard macros to define parameters and local variables, but I just want to make my own. So please don't tell me to use %arg and so on. I want to find out where I did wrong, or it is just a bug in the NASM preprocessor. And I also want to learn preprocessing in NASM.
Thanks in advanced!