私は iPhone/iPad プロジェクトに取り組んでおり、いくつかの (すべてではない) 算術演算中にステータス レジスタを更新したいと考えています。デフォルトでは、Xcode は「Compile for Thumb」を使用しますが、これを変更したくありません。
次の 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"
);
...
編集: ARM アーキテクチャのアプリケーション バイナリ インターフェイス (ABI) で ARM ABI を利用するには、レジスタも移動する必要があります。