3

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が入力/出力オペランドに同じレジスタを使用することをどのように禁止できるかということです。

4

1 に答える 1

5

さて、ついに私はここでそれを見つけました

&は、入力が
読み取られる前に出力オペランドが書き込まれることを示しているため、この出力は他の入力と同じレジスタであってはなりません。
これがないと、「0」制約で必要とされない場合でも、gccは出力と入力を同じレジスタに配置する可能性があります。これは非常に便利ですが、代替案に固有であるため、ここで説明します。=や%とは異なりますが、?と同様に、適用する各選択肢に含める必要があります。

すべてに変更"=r" (res)した後は正常に"=&r" (res)動作します。

于 2012-10-05T12:06:44.997 に答える