You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GAS宏参数判断:如何区分立即数与未定义符号?

区分Gnu Assembler(GAS)宏参数中的未定义符号与立即数

原代码中使用.ifdef "\myparam"无法区分未定义符号和立即数,本质原因是双引号会将参数转为字符串,GAS不会将字符串视为符号进行定义检查,导致两种情况都进入else分支。

解决方案:利用GAS内置条件操作符区分

通过GAS的:numeric操作符先判断参数是否为立即数,再用.ifdef检查符号是否已定义,即可区分三种情况(立即数、已定义符号、未定义符号):

.macro mymacro myparam
  .if :numeric(\myparam)
    .print "parameter is an immediate value: \myparam\n"
  .else
    .ifdef \myparam
      .print "parameter is a defined symbol: \myparam\n"
    .else
      .print "parameter is an undefined symbol: \myparam\n"
    .endif
  .endif
.endm

# 测试示例
DEFINED_SYM = 42
mymacro DEFINED_SYM  # 输出:parameter is a defined symbol: DEFINED_SYM
mymacro UNDEFINED_SYM # 输出:parameter is an undefined symbol: UNDEFINED_SYM
mymacro 123           # 输出:parameter is an immediate value: 123
mymacro 0x1a          # 输出:parameter is an immediate value: 0x1a

关键说明

  • :numeric(\myparam):GAS内置条件操作符,若参数可被解析为数值(包括十进制、十六进制等格式的立即数),返回真。
  • .ifdef \myparam:直接检查符号本身是否已通过=或.set等指令定义,无需加双引号。

内容的提问来源于stack exchange,提问作者Citra Dewi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 21:11:28