我正在做一个 iPhone/iPad 项目,我想在一些(不是全部)算术运算期间更新状态寄存器。默认情况下,Xcode 使用“Compile for Thumb”,我不想更改它。
以下 GCC 内联汇编代码在 ARM 下运行良好,但在 Thumb 下导致编译错误:'instruction not supported in Thumb16 mode - 添加 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 at Application Binary Interface (ABI) for the ARM Architecture。