2012-10-05 14 views
2

我使用gcc 4.6.3編譯爲sam7s處理器。如何強制gcc在asm中使用兩個不同的寄存器操作數?

我需要使用一些內聯彙編:

int res; 
asm volatile (" \ 
     MRS r0,CPSR  \n \ 
     MOV %0, r0  \n \ 
     BIC r0,r0,%1 \n \ 
     MSR CPSR,r0  \n \ 
     " : "=r" (res) : "r" (0xc0) : "r0"); 
return res; 

這是由GCC翻譯成(由我添加的註釋):

mov r3, #192 ; load 0xc0 to r3 
str r0, [sl, #56] ; preserve value of r0? 

mrs r0, CPSR ; load CPSR to r0 
mov r3, r0  ; save r0 to "res"; r3 overwritten! 
bic r0, r0, r3 ; 
msr CPSR_fc, r0 ; 

的問題是,在地方的 「%0」 (res)和「%1」(常量:0xc0)使用相同的寄存器「r3」。由於這個原因,%1在使用之前被覆蓋,代碼工作不正確。

問題是我該如何禁止gcc對輸入/輸出操作數使用相同的寄存器?

回答

4

好了,終於我找到了here

&說,一個輸出操作數寫入之前的輸入是
讀,所以這個輸出必須是不一樣的寄存器作爲任何輸入。
如果沒有這個,即使「0」約束不需要,gcc可能會將輸出和輸入置於同一個 寄存器中。這非常有用,但在此提及,因爲它是特定於 替代方案。不像=和%,但像?一樣,你必須將它包括在 中,並且每個選項都適用。

更改"=r" (res)"=&r" (res)一切工作正常。

相關問題