GNU汇编中.ifnb伪指令用法及宏空参数传递问题
解决GAS宏传递空参数的语法错误与功能实现
错误原因
GNU汇编器(GAS)的宏调用语法不允许参数列表以逗号开头,也不允许两个逗号之间直接留空。你写的foo1 , %rax, %rbx会触发语法错误,因为汇编器认为第一个参数位置缺少合法操作数。
正确实现方式
方法1:用空字符串标记空参数,结合.ifnb判断
调整宏调用时的空参数写法,用""表示空参数,同时在宏内用.ifnb判断参数是否非空:
.macro foo1 t0, t1, t2 .ifnb \t0 add \t0, \t1 .endif add \t1, \t2 .endm foo2: foo1 "" , %rax, %rbx # 第一个参数为空,仅执行 add %rax, %rbx foo1 %rax, %rbx, %rcx # 第一个参数非空,先执行 add %rax, %rbx,再执行 add %rbx, %rcx
方法2:利用可选参数调整宏定义
GAS要求可选参数必须放在参数列表末尾,我们可以调整参数顺序,把可选的第一个参数移到最后,再通过参数存在性判断逻辑:
.macro foo1 t1, t2, t0:opt .ifnb \t0 add \t0, \t1 .endif add \t1, \t2 .endm foo2: foo1 %rax, %rbx # 仅传递两个参数,t0为空,执行 add %rax, %rbx foo1 %rbx, %rcx, %rax # 传递三个参数,t0=%rax,先执行 add %rax, %rbx,再执行 add %rbx, %rcx
关于.ifnb伪指令的说明
.ifnb <arg>用于判断指定的宏参数是否非空(存在且不为空字符串);对应的.ifb <arg>用于判断参数是否为空。这两个伪指令在宏展开时生效,用于分支生成汇编代码。
内容的提问来源于stack exchange,提问作者Tall
相关产品推荐
相关产品推荐

