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
相关产品推荐
相关产品推荐

