如何在MPLAB X中用MIPS汇编为每个宏调用创建唯一标签?
解决宏调用中重复标签定义的问题
这个问题我之前也碰到过!本质是因为每次调用宏的时候,汇编器会把宏内的代码原封不动展开,导致多次调用后出现多个完全相同的exit_label标签——汇编器无法区分这些标签,自然就报重复定义的错误了。
最简洁的解决办法是利用GNU汇编器(GAS)的自动生成唯一后缀特性,用特殊符号\@来为每个宏实例的标签生成独一无二的标识符。修改后的宏代码如下:
.macro do_work_if_value_not_zero value li s0, \value bne s0, zero, exit_label_\@ nop // Do work(这里写你需要执行的代码) exit_label_\@: .endm
原理说明:
\@是GAS内置的特殊变量,每次展开宏时,它会被替换成一个递增的整数(比如第一次调用是0,第二次是1,以此类推)。- 这样每次调用宏生成的标签就会变成
exit_label_0、exit_label_1、exit_label_2……完全不会重复。
其他可选方案(如果你的汇编器不支持\@):
如果使用的是其他不支持\@的汇编环境,你可以手动给宏添加一个额外的参数,用来传递唯一的标签后缀:
.macro do_work_if_value_not_zero value, label_suffix li s0, \value bne s0, zero, exit_label_\label_suffix nop // Do work exit_label_\label_suffix: .endm
调用时需要手动指定后缀:
do_work_if_value_not_zero 5, 1 do_work_if_value_not_zero 3, 2 do_work_if_value_not_zero 12, 3
不过这种方法需要手动管理后缀,不如\@来得方便,优先推荐第一种方案。
内容的提问来源于stack exchange,提问作者user9683851
相关产品推荐
相关产品推荐

