【问题标题】:How can I concatenate a label not in a macro definition? (in GAS assembler)如何连接不在宏定义中的标签? (在 GAS 汇编器中)
【发布时间】:2017-11-08 17:12:24
【问题描述】:

我想这样做:

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

它应该输出这个:

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

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

【问题讨论】:

  • 你在用 gcc 构建你的 asm 吗?如果是这样,您还可以使用带有 CPP 宏的 C 预处理器将两个 args 粘贴在一起。除非它发生在gas 看到.rept 之前不起作用。嗯。
  • 我认为不使用宏是不可能的。
  • 我很好奇你为什么不能使用宏?
  • @MichaelPetch 很难确切地说出一大堆便便 binutils 有多少,但我认为不使用宏就无法在此处进行所需的字符串操作。
  • @MichaelPetch 我编辑了我的问题。我不认为你可以用宏来做到这一点。 请证明我错了:)

标签: assembly macros x86-64 gnu-assembler


【解决方案1】:

我不相信您可以在不使用宏或其他类型的预处理的情况下解决此问题。执行此操作的 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

您可以编写“%expr”来计算表达式 expr 并将结果用作字符串。

您可以使用.irp 而不是使用.rept 并将宏简化为:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-16
    • 1970-01-01
    • 1970-01-01
    • 2021-02-01
    • 1970-01-01
    • 2011-02-28
    • 2021-01-10
    相关资源
    最近更新 更多