我有一个执行比较的宏,如果该比较不为真,则跳转到宏的末尾。这是一个简化的例子:
.macro do_work_if_value_not_zero value
li s0, value
bne s0, zero, exit_label
nop
// Do work
exit_label:
.endm
然而问题是我多次这样调用这个宏:
do_work_if_value_not_zero 5
do_work_if_value_not_zero 3
do_work_if_value_not_zero 12
结果我收到以下错误:
错误:符号`exit_label'已定义
因为我从不多次使用相同的参数调用宏,所以我尝试使用与':'连接的参数名称来创建一个唯一的标签,如下所示:
.macro do_work_if_value_not_zero value
li s0, value
bne s0, zero, \value
nop
// Do work
\value:
.endm
然而,这似乎不起作用,我收到了更多错误。
因此我的问题是,如何为每个宏调用创建一个唯一的退出标签以避免此问题?
答案 0 :(得分:0)
@ markgz的答案是最好的答案
如果需要替代解决方案,我会保留这个答案
这里的问题是value
不能用作标签,因为它是一个数字。因此,它可能不包含我们想要跳转到的行号。
这个问题有两种解决方法。
<强>第一强>
我们可以将文本连接到value
,以使其成为正确的标签名称
exitLabel\value :
第二(由@Christian Gibbons提供)
我们可以添加另一个参数来指定标签名称,如此
.macro do_work_if_value_not_zero value exitLabelName
...
...
\exitLabelName :
这个解决方案意味着可以多次调用具有相同参数的宏,这与第一个解决方案不同,后者仅限于对宏的唯一调用。
答案 1 :(得分:0)
大多数汇编程序都允许这样的本地标签:
.macro do_work_if_value_not_zero
li s0, value
bne s0, zero, 1f # 1f means branch forward to the next label '1:'
nop
// Do work
1:
.endm
来自MIPS汇编程序手册here:
生成的标签是单个数值(1 ... 255)。参考一个 生成标签,立即放置f(前进)或b(后退) 在数字之后。该引用告诉汇编程序查找 最近生成的标签,对应于中的数字 词汇向前或向后方向。