【问题标题】:Nasm preprocessor - Address parameter via variableNasm 预处理器 - 通过变量的地址参数
【发布时间】:2017-12-11 15:00:04
【问题描述】:

我需要编写很多推送不同字符的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 个参数?

【问题讨论】:

    标签: assembly macros x86 nasm preprocessor


    【解决方案1】:

    使用%rotate 1,您可以将宏参数列表向左旋转1 个元素。这有效地将列表中的下一个元素放在开头。列表中的第一个元素始终可以引用为%1。将它放在%rep %0 循环中将允许您遍历宏参数列表中的所有元素。 NASM documentation 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
    

    【讨论】:

    • 完美!谢谢!
    猜你喜欢
    • 1970-01-01
    • 2011-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-06
    • 2018-11-11
    • 1970-01-01
    相关资源
    最近更新 更多