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對輸入/輸出操作數使用相同的寄存器?