sam7sプロセッサ用にコンパイルされたgcc4.6.3を使用しています。
インラインアセンブリを使用する必要があります。
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が入力/出力オペランドに同じレジスタを使用することをどのように禁止できるかということです。