Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Gcc Apple AS和ARM/Thumb增加了指令_Gcc_Assembly_Arm_Thumb - Fatal编程技术网

Gcc Apple AS和ARM/Thumb增加了指令

Gcc Apple AS和ARM/Thumb增加了指令,gcc,assembly,arm,thumb,Gcc,Assembly,Arm,Thumb,我正在做一个iPhone/iPad项目,我想在一些(不是全部)算术运算期间更新状态寄存器。默认情况下,Xcode使用“CompileforThumb”,我不想更改它 以下GCC内联汇编代码在ARM下运行良好,但在Thumb下会导致编译错误:“Thumb16模式下不支持指令-添加r6、r4、r5”。问题在于状态寄存器更新。(我也知道需要更改movcs和strc) Thumb是否有在CPSR中设置溢出(V)或进位(C)的ADD指令?如果没有,是否有特定于拇指的装配级变通方法来测试溢出和携带 uint

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

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

Thumb是否有在CPSR中设置溢出(V)或进位(C)的ADD指令?如果没有,是否有特定于拇指的装配级变通方法来测试溢出和携带

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"
);

...

编辑:寄存器也需要移动以利用。我对XCode和Apple的工具链不太熟悉,但我怀疑它可能期望以旧的、以前的形式组装。ADD的Thumb-16编码总是设置标志(对于寄存器R0-R7),但是,在前汇编中,S没有添加到助记符中。(大多数算术运算总是更新Thumb-16中的标志,因此S是隐含的。)因此,您应该尝试在汇编块的开头添加
.syntax\u unified
,或者使用简单的添加助记符


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

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

根据,添加的
指令应该可用。这似乎是汇编程序中的一个bug(正如@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'
  ...
);
如果希望
添加r2、r2、r1
,则代码应发出
.inst.w 0x1852
,依此类推

编辑:由于Binutils邮件列表上的原因,最近更新了代码。

Igor建议使用“.syntax\u unified”。但是,至少对于binutils 2.22,该命令是“.sytax unified”。下面的示例在这里编译得很好:

.align  4
.code   16
.syntax unified

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

你看过“为拇指编译”的构建设置了吗?抱歉,不得不问。“但是,您的代码中有另一个问题……”GAS很快停止了抱怨(添加后)。谢谢-修复。“添加的Thumb-16编码总是设置标志”-这很有趣。根据以下链接,在Thumb16上支持添加。也许这是苹果的毒气。请参阅。所有当前ARM文档都使用UAL语法,并明确指定了S。查看《ARM体系结构参考手册》的“旧式指令助记符”一节。gas这么做已经很长时间了,可能是在添加thumb之后。最恼人的是,binutils将其反汇编为add,但在汇编时不接受该语法。刚刚通过codesourcery gas 2.20.51验证。这是众所周知的事情。