无法将标签传递给ARM宏?

时间:2015-10-20 21:17:23

标签: assembly macros arm

这是我的宏:

        ; Good old DJNZ meets ARM!

        MACRO
        DJNZ  $register, $target
            SUBS    $register, $register, #1
            BNE     $target
        MEND

我的用法:

DELAY       PROC
                PUSH    {R2, LR}                   ; Push the changed registers & link register

WAIT_OUTER      LDR     R2, =40000                 ; Length of inner loop

WAIT_INNER      DJNZ    R2, WAIT_INNER
                DJNZ    R0, WAIT_OUTER

                POP     {R2, PC}                   ; Pop & return
            ENDP

我收到了这个错误:

== Compiling main.asm to main.o ==
"main.asm", line 167 (column 9): Error: A1516E: Bad symbol 'WAIT_INNER', not defined or external
    at line 167 in macro DJNZ in 'macros.s'

  167 000000d0    BNE  WAIT_INNER
                       ^
1 Error, 0 Warnings
make: *** [main.o] Error 1

想法有什么不对?根据手册,将标签传递到宏应该可以工作。

1 个答案:

答案 0 :(得分:1)

对于标签和宏来说,似乎armasm有一些略微不直观的syntax,尽管the examples确实让它更清晰。

长话短说,你没有在那里的行的开头定义标签WAIT_INNER,你实际上是将它作为另一个参数传递给宏。但是,由于宏不使用该参数,因此它不会在任何地方扩展,因此宏扩展传递的输出中没有标签,您将收到错误。

简单的解决方法是只将标签定义作为宏调用的单独语句:

WAIT_INNER
            DJNZ    R2, WAIT_INNER
            ...

更加繁琐的选择是明确地说宏的任何标签参数应出现在第一条指令处:

       MACRO
$label DJNZ  $register, $target
$label     SUBS    $register, $register, #1
           BNE     $target
       MEND