gpt4 book ai didi

gcc - Apple AS 和 ARM/Thumb ADDS 指令

转载 作者:行者123 更新时间:2023-12-02 07:10:29 25 4
gpt4 key购买 nike

我正在做一个 iPhone/iPad 项目,我想在一些(不是全部)算术运算期间更新状态寄存器。默认情况下,Xcode 使用“为 Thumb 编译”,我不想更改它。

以下 GCC 内联汇编代码在 ARM 下运行良好,但在 Thumb 下会导致编译错误:“Thumb16 模式不支持指令 - 添加 r6、r4、r5”。问题出在状态寄存器更新上。 (我还知道 movcsstrcs 需要更改)。

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 .

最佳答案

我对 XCode 和 Apple 的工具链不是很熟悉,但我怀疑它可能需要旧的、pre-UAL 形式的程序集。 ADD 的 Thumb-16 编码始终设置标志(用于寄存器 R0-R7),但是,在 UAL 之前的程序集中,S 未添加到助记符中。 (大多数算术运算总是更新 Thumb-16 中的标志,因此隐含了 S。)因此,您应该尝试在汇编 block 的开头添加 .syntax_unified,或者使用简单的 ADD 助记符。

但是,您的代码中还有另一个问题。 Thumb-16 不支持条件指令,只支持条件分支。所以你将不得不使用分支重做你的代码,或者使用 ADC/SBC。

请注意,以上所有内容仅适用于原始的 Thumb ISA(又名 Thumb-16)。 Thumb-2(又名 Thumb-32)可以(几乎)做 ARM 可以做的任何事情,包括使用高位寄存器和条件指令,但它在 ARMv6 目标中不可用(这可能是 XCode 中的默认设置)。

关于gcc - Apple AS 和 ARM/Thumb ADDS 指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6409449/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com