无法将标签传递给 ARM 宏?

Can't pass label to ARM macro?

这是我的宏:

        ; 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

想法怎么了?根据手册,将标签传递给宏应该可行。

似乎 armasm 有点不直观syntax when it comes to labels and macros, although the examples让它更清晰一些。

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

简单的解决方法是让标签定义成为独立于宏调用的语句:

WAIT_INNER
            DJNZ    R2, WAIT_INNER
            ...

更巧妙的选择是明确指出宏的任何标签参数都应出现在第一条指令中:

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