Assembly Nasm预处理器-通过变量的地址参数

Assembly Nasm预处理器-通过变量的地址参数,assembly,macros,x86,nasm,preprocessor,Assembly,Macros,X86,Nasm,Preprocessor,我需要编写大量的push指令来推送不同的字符。我想用一个宏。这就是我到目前为止所做的: %macro push_multi 1-* ; Accept between 1 and ∞ arguments %assign i 1 %rep %0 ; %0 is number of arguments push %{i} %assign i i+1 %endrep %endmacro push_mul

我需要编写大量的
push
指令来推送不同的字符。我想用一个宏。这就是我到目前为止所做的:

%macro push_multi 1-*       ; Accept between 1 and ∞ arguments
    %assign i 1
    %rep %0                 ; %0 is number of arguments
        push %{i}
        %assign i i+1
    %endrep
%endmacro

push_multi 'a', 'b', 'c'    ; push 'a' then push 'b' then push 'c'
但是
nasm-E
的结果是:

push %i
push %i
push %i
我想要这个:

push 'a'
push 'b'
push 'c'

如何使用
assign
创建的变量处理宏的第n个参数?

使用
%rotate 1
可以将宏参数列表向左旋转1个元素。这将有效地将列表中的下一个元素放在开头。列表中的第一个元素始终可以引用为
%1
。将其放入
%rep%0
循环将允许您迭代宏参数列表中的所有元素。for
%rotate
表示:

%使用单个数值参数(可能是表达式)调用rotate。宏参数向左旋转了那么多个位置。如果%rotate的参数为负,则宏参数将向右旋转

在您的情况下,这应该有效:

%macro push_multi 1-*       ; Accept 1 or more arguments
    %rep %0                 ; %0 is number of arguments pass to macro
        push %1
        %rotate 1           ; Rotate to the next argument in the list
    %endrep
%endmacro
如果要反向执行列表,可以使用
-1
沿相反方向旋转,并首先执行
%rotate

%macro push_multi 1-*       ; Accept 1 or more arguments
    %rep %0                 ; %0 is number of arguments pass to macro
        %rotate -1          ; Rotate to the prev argument in the list
                            ; If at beginning of list it wraps to end of list 
        push %1
    %endrep
%endmacro

完美的谢谢