如何使用MPLAB X中的mips程序集为每个宏调用创建唯一标签

时间:2018-04-23 03:48:45

标签: assembly mips mplab pic32

我有一个执行比较的宏,如果该比较不为真,则跳转到宏的末尾。这是一个简化的例子:

.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

然而,这似乎不起作用,我收到了更多错误。

因此我的问题是,如何为每个宏调用创建一个唯一的退出标签以避免此问题?

2 个答案:

答案 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(后退)   在数字之后。该引用告诉汇编程序查找   最近生成的标签,对应于中的数字   词汇向前或向后方向。