这是我的宏:
; 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
想法有什么不对?根据手册,将标签传递到宏应该可以工作。
答案 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