我正在開發一個iPhone/iPad項目,我想在某些(並非全部)算術運算期間更新狀態寄存器。默認情況下,Xcode使用「爲Thumb編譯」,我不想改變它。Apple AS和ARM/Thumb ADDS指令
以下GCC內聯彙編代碼在ARM下工作正常,但會導致Thumb下的編譯錯誤:'Thumb16模式下不支持'指令 - 添加r6,r4,r5'。問題在於狀態寄存器更新。 (我也知道movcs
和strcs
將需要更改)。
Thumb是否有一條ADD指令,用於設置CPSR中的溢出(V)或進位(C)?如果沒有,是否有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 at Application Binary Interface (ABI) for the ARM Architecture的優勢。
你看過「編譯爲Thumb」的編譯設置嗎?對不起,不得不問。 –