我有一个执行比较的宏,如果比较不正确,则跳转到宏的末尾。这是一个简化的示例:
.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
然而这似乎不起作用,并且我收到了更多错误。
因此我的问题是,如何为每个宏调用创建唯一的退出标签以避免此问题?
大多数汇编器允许这样的本地标签:
.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 https://courses.cs.washington.edu/courses/cse410/07sp/misc/MIPS-ASM-007-2418-006.pdf:
生成的标签是单个数值 (1...255)。参考一个
生成标签,立即输入 f(向前)或 b(向后)
数字后。该引用告诉汇编器寻找
与中的数字相对应的最近生成的标签
词汇上向前或向后的方向。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)