如何在Gnu Assembly中使用“.ifnb”?如何接受空值作为GAS中“.macro”函数的参数?

tp5buhyn  于 2023-10-19  发布在  Mac
关注(0)|答案(1)|浏览(121)

我试图传递一个空值给x64上GNU汇编中的宏函数,这个函数应该根据第一个参数是否为空添加三个值togather或两个值,例如,

.macro foo1 t0, t1, t2
  .ifnb t0
    add \t0, \t1
  .endif
    add \t1, \t2
.endm

foo2:
    foo1 , %rax, %rbx
    foo1 %rax, %rbx, %rcx

但是当我编译上面的代码时,gcc说expecting operand before ','; got nothing,因为我调用foo1使用以下格式foo1 , %rax, %rbx。所以我对如何使用.ifnb伪操作以及如何将空参数传递给像foo1这样的宏感到困惑。
我试着在google上搜索,但是我得到了一些关于gnu程序集空白值的东西。https://sourceware.org/binutils/docs/as/If.html我也读过GAS官方文档,但它也没有提到如何使用.ifnb,也没有为.macro提供空参数示例。https://sourceware.org/binutils/docs/as/Macro.html

t30tvxxf

t30tvxxf1#

.ifnb的正确语法如下:

.macro foo1 t0, t1, t2
  .ifnb \t0             ; <------ Note the backslash preceding the `t0`
    add \t0, \t1
  .endif
    add \t1, \t2
.endm

你会得到一个令人困惑的错误消息,指向宏调用的那一行,因为它似乎是在宏扩展到add , %rax之后生成的,但仍然引用原始代码中的那一行。

相关问题