如何连接不在宏定义中的标签? (在 GAS 汇编程序中)

How can I concatenate a label not in a macro definition? (in GAS assembler)

我想这样做:

i=0
.rept 3
    add rcx,[a?(i*2+1)]
    i=i+1
.endr

它应该输出这个:

add rcx,[a1]
add rcx,[a3]
add rcx,[a5]

我找不到解决这个问题的方法。我不希望它在宏定义中。

我认为不使用宏或其他类型的预处理就无法解决此问题。执行此操作的 GNU 汇编器方法可能类似于:

.altmacro

.macro addmac val
    add rcx, [a\val]
.endm

.macro loopmac
    i=0
    .rept 3
        addmac %(i*2+1)
        i=i+1
    .endr
.endm

然后您可以像这样使用 loopmac 宏:

loopmac

您需要 .altmacro 指令才能正确处理 %(i*2+1)

7.4 .altmacro

You can write ‘%expr’ to evaluate the expression expr and use the result as a string.

而不是使用 .rept you could use .irp 并将宏简化为:

.macro loopmac
    .irp i,1,3,5
        add rcx, [a\i]
    .endr
.endm

最后一个例子不需要.altmacro处理。