无法将标签传递给 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
这是我的宏:
; 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