这可能不是一个很好的问题,但我要做的基本上是将多行汇编传递给nasm宏。或者,等效地,我想要一个宏来实现某些代码块的样板“顶部”和“底部”,但是中间部分是任意的。
作为一个具体示例,请考虑以下nasm来源:
%assign regn 8
%rep 8
%define reg r %+ regn
lea reg, [rsp - 8] ; body
push reg ; body
%assign regn (regn + 1)
%endrep
这将从r8
到r15
的所有寄存器之间循环,并为每个寄存器生成两行“ 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
但是,我找不到将其扩展到多行的自然方法。我想我可以使用一个接受一个或多个参数的宏,然后将其“循环”到正文中,但这意味着您需要在一行上编写宏调用,并将每一行粘贴在一起,而不是自然的一行-按指令的方式编写它。我也不确定如果主体本身包含宏调用或其他指令,它将如何工作。