Apple AS和ARM / Thumb ADDS指令

时间:2011-06-20 09:49:11

标签: gcc assembly arm thumb

我正在开发一个iPhone / iPad项目,我想在一些(不是全部)算术运算期间更新状态寄存器。默认情况下,Xcode使用'Compile for 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

3 个答案:

答案 0 :(得分:4)

我对XCode和Apple的工具链不是很熟悉,但我怀疑它可能会期待UAL之前的旧版装配。 ADD的Thumb-16编码始终设置标志(对于寄存器R0-R7),但是,在UAL前组件中,S未添加到助记符中。 (大多数算术运算总是更新Thumb-16中的标志,因此暗示了S.)因此,您应该尝试在汇编块的开头添加.syntax_unified,或者使用简单的ADD助记符。

但是,您的代码中还有另一个问题。 Thumb-16不支持条件指令,只支持条件分支。因此,您必须使用分支重做代码,或使用ADC / SBC。

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

答案 1 :(得分:4)

伊戈尔建议“.syntax_unified”。但是,至少对于binutils 2.22,命令是“.sytax unified”。以下示例在此处编译正确:

.align  4
.code   16
.syntax unified

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

答案 2 :(得分:0)

根据Thumb-16 Quick Reference GuideADDS指令应该可用。这似乎是汇编程序中的一个错误(正如@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,依此类推。

编辑:最近由于Binutils邮件列表上的arm thumb2 ldr.w syntax?而更新了代码。