私はiPhone/iPadプロジェクトで作業しており、一部の(すべてではない)算術演算中にステータスレジスタを更新したいと考えています。デフォルトでは、Xcodeは「Thumbのためのコンパイル」を使用しています。変更したくありません。Apple ASとARM/Thumb ADDS命令
次のGCCインラインアセンブリコードはARMではうまく動作しますが、Thumb: '命令はThumb16モードではサポートされていません - r6、r4、r5を追加してコンパイルエラーが発生します。問題はステータスレジスタの更新にあります。 (私はまた、movcs
とstrcs
を変更する必要があることを認識しています)。
Thumbには、CPSRにオーバーフロー(V)またはキャリー(C)を設定するADD命令がありますか?そうでない場合は、オーバーフローやキャリーをテストするためのThumb固有のアセンブリレベルの回避策がありますか?
ジェフ
uint32_t result, a, b;
int no_carry = 1;
...
__asm__
(
"ldr r4, %[xa] ;" // R4 = a
"ldr r5, %[xb] ;" // R5 = b
"adds r6, r4, r5 ;" // R6 = R4 + R5, set status
"movcs r4, #0 ;" // set overflow (if carry set)
"strcs r4, %[xc] ;" // store it (if carry set)
"str r6, %[xr] ;" // result = R6
: [xr] "=m" (result), [xc] "=m" (no_carry)
: [xa] "m" (a), [xb] "m" (b)
: "r4", "r5", "r6"
);
...
EDIT:レジスタもARM ABI at Application Binary Interface (ABI) for the ARM Architectureを利用するために周りに移動する必要があります。
「コンパイル用のThumb」ビルド設定を見ましたか?申し訳ありませんが、お聞きしました。 –