【问题标题】:Can't pass label to ARM macro?无法将标签传递给 ARM 宏?
【发布时间】:2015-10-20 21:17:22
【问题描述】:

这是我的宏:

        ; 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

我收到此错误:

== 编译 main.asm 为 main.o == “main.asm”,第 167 行(第 9 列):错误:A1516E:错误符号 'WAIT_INNER',未定义或外部 在“macros.s”中宏 DJNZ 的第 167 行 167 000000d0 BNE WAIT_INNER ^ 1 个错误,0 个警告 make: *** [main.o] 错误 1

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

【问题讨论】:

    标签: assembly macros arm


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多