2015-10-20 132 views
0

這裏是我的宏:無法將標籤傳遞給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

看起來像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