2013-07-09 168 views
0

我試圖用icachetest工作,它有一個文件,任命icache.s包含:如何在ARM程序集中聲明一個定義並使用它?

#define LOOP \ 
     subs r2, r2, #1    ; \ 
     mov  r0, r0     ; \ 
     mov  r0, r0     ; \ 
     mov  r0, r0     ; \ 
     mov  r0, r0     ; \ 
     mov  r0, r0     ; \ 
     beq  end_loop    ; \ 
     mov  r0, r0     ; \ 

我使用arm-eabi-as編譯這個項目,但我得到這個錯誤:

AS  icache.S 
icache.S: Assembler messages: 
icache.S:16: Error: junk at end of line, first unrecognized character is `\' 
icache.S:17: Error: junk at end of line, first unrecognized character is `\' 
icache.S:18: Error: junk at end of line, first unrecognized character is `\' 
icache.S:19: Error: junk at end of line, first unrecognized character is `\' 
icache.S:20: Error: junk at end of line, first unrecognized character is `\' 
icache.S:21: Error: junk at end of line, first unrecognized character is `\' 
icache.S:22: Error: junk at end of line, first unrecognized character is `\' 
icache.S:23: Error: junk at end of line, first unrecognized character is `\' 
icache.S:52: Error: bad instruction `loop LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP' 
icache.S:53: Error: bad instruction `loop LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP' 
icache.S:54: Error: bad instruction `loop LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP LOOP' 
+1

您不應該使用'as' - 只需要使用'gcc',以便調用預處理器,例如, 'gcc -Wall icache.S ...'。 –

+0

「as」是什麼? – 0x90

+0

作爲彙編程序,乾淨的程序集將與as組裝好。如果你正在使用C代碼在你的程序集中嘗試一些混合語言的東西,那麼你需要在被gcc調用之前的C預處理器。基本上你不使用定義在asm中使用宏。 –

回答

1

LOOP是其他人指出的宏。由於它沒有參數或條件,因此很容易用gas宏代替。

.macro LOOP 
    subs r2, r2, #1 
    mov  r0, r0 
    mov  r0, r0 
    mov  r0, r0 
    mov  r0, r0 
    mov  r0, r0 
    beq  end_loop 
    mov  r0, r0 
.endm 

它會表現一樣在此之後一個#define,與只有一個是每行允許的警告。 ARM彙編程序確實允許多行操作碼(據我所知)。

您可以使用.rept重複該宏。

.rept 2048 
    LOOP 
.endr 
+0

查看類似:[宏使用氣體](http://stackoverflow.com/questions/3127905/macros-using-gas)和[GAS宏文檔](http://sourceware.org/binutils/docs/as/ Macro.html)。 –

+0

如何調用LOOP宏? – 0x90

+0

你應該只需要'LOOP'。您可能需要源中的'\ r \ n'。我不知道你是否可以在一行上有多個宏**調用。 –

相關問題