苹果AS(汇编)的ARM / Thumb ADDS指令

我工作的一个iPhone / iPad的项目,我想更新过程中的一些状态寄存器(不是全部)的算术运算。 默认情况下,Xcode使用“编译为Thumb',我不想改变它。

下面GCC内联汇编代码的ARM下正常工作,但会导致拇指下的编译错误:“在Thumb16模式下不支持的指令 - 增加了R6,R4,R5'。 问题就出在状态寄存器更新。 (我也知道, movcsstrcs将需要改变)。

拇指是否有一个ADD指令用于设置溢出(V)或携带(C)在CPSR? 如果不是,是否有特定的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在应用程序二进制接口(ABI)ARM体系结构。

--------------解决方案-------------

我不是很熟悉Xcode和苹果的工具链,但我怀疑它可能在老时,UAL预形式期待大会。 加入的拇指16编码总是设置标志(对寄存器R0-R7),然而,在预UAL组件中,S为未添加到助记符。 (大多数算术运算始终在Thumb-16的更新标志,所以S为隐含的)。所以,你应该尝试以添加.syntax_unified在大会块的开始,或使用简单的附加 ​​记忆。

然而,你必须在你的代码的另一个问题。 拇指-16不支持有条件的指令,只有条件分支。 所以,你必须使用一个分支重做你的代码,或者使用ADC / SBC。

请注意,所有上述的只适用于原拇指的ISA(又名拇指-16)。 Thumb-2的(又名拇指-32)可以做(几乎)任何臂可包括采用高寄存器和条件指令,但它在ARMv6的目标是不可用的(这可能是在Xcode中默认值)。

伊戈尔建议“.syntax_unified”。 然而,至少在binutils的2.22,该命令是“.sytax统一”。 以下示例编译这里很好:

.align 4
.code 16
.syntax unified

adds r0,r0,r2
adc r1,r1,r3

据拇指-16快速参考指南,该ADDS指令应该可用。 这似乎是在汇编中的错误(如被@dwelch确认)。

我发现我可以解决它通过发出指令预编码的使用汇编指令。 例如:

__asm__
(
"ldr r0, %[xa] ;" // R0 = a
"ldr r1, %[xb] ;" // R1 = b
"adds r1, r1, r0 ;" // R1 = a + b
...
);

将使用可以实现:

__asm__
(
"ldr r0, %[xa] ;" // R0 = a
"ldr r1, %[xb] ;" // R1 = b
".inst.w 0x1809 ;" // Issue 'adds r1, r1, r0'
...
);

如果我想adds r2, r2, r1 ,代码应该发射.inst.w 0x1852 ,等等。

编辑:代码最近更新由于武装thumb2 LDR.W语法? Binutils的邮件列表上。

分类:GCC 时间:2015-03-15 人气:0
本文关键词: 装配,手臂,GCC,拇指
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.137 (s). 10 q(s)