具有“多行参数”的NASM宏

时间:2018-09-18 17:14:12

标签: assembly x86 nasm

这可能不是一个很好的问题,但我要做的基本上是将多行汇编传递给nasm宏。或者,等效地,我想要一个宏来实现某些代码块的样板“顶部”和“底部”,但是中间部分是任意的。

作为一个具体示例,请考虑以下nasm来源:

%assign regn 8
%rep 8
%define reg r %+ regn
lea reg, [rsp - 8]       ; body
push reg                 ; body
%assign regn (regn + 1)
%endrep

这将从r8r15的所有寄存器之间循环,并为每个寄存器生成两行“ body”代码,结果如下:

lea    r8,[rsp-0x8]
push   r8
lea    r9,[rsp-0x8]
push   r9
lea    r10,[rsp-0x8]
push   r10
lea    r11,[rsp-0x8]
push   r11
lea    r12,[rsp-0x8]
push   r12
lea    r13,[rsp-0x8]
push   r13
lea    r14,[rsp-0x8]
push   r14
lea    r15,[rsp-0x8]
push   r15

我想将这个“ 8圈循环”样板提取到某种类型的宏中,该样板是上面没有标记; body的所有行,因此可以使用不同类型的主体进行调用。 / p>

如果主体仅是一条直线,这将很简单:

%macro loop_r8_r15 1
%assign regn 8
%rep 8
%define reg r %+ regn
%1       ; body
%assign regn (regn + 1)
%endrep

但是,我找不到将其扩展到多行的自然方法。我想我可以使用一个接受一个或多个参数的宏,然后将其“循环”到正文中,但这意味着您需要在一行上编写宏调用,并将每一行粘贴在一起,而不是自然的一行-按指令的方式编写它。我也不确定如果主体本身包含宏调用或其他指令,它将如何工作。

0 个答案:

没有答案