2012-04-04 87 views
3

我正试图在iOS上使用ffmpeg,并正在调试优化后的ARM代码中的崩溃。我发现一些无符号(.u16,.u32)指令已被符号(.i16,.i32)取代。很容易看到,因为GDB上的反汇编指令与源代码不完全匹配。Apple AS汇编程序是否会用iOS上的某些NEON指令替换某些NEON指令?

例如,

vrshrn.u32 -> vrshrn.i32 
vrshrn.u16 -> vrshrn.i16 
vadd.u16 -> vadd.i16 

我的问题:

  1. 这种行为是正确和期望?如果不是,我们如何纠正它?
  2. 如果它们相同,为什么我们需要未签名的呢?这是否因为代码更加明确?
  3. 这种行为是否与其他平台的工具包一样?例如,Android的工具包? (我听说苹果的AS是一个古老的一个)

回答

4

这些指令不依赖于要素的符号性 - 这实际上是.Inn后缀的意思。汇编程序仍然接受.Snn.Unn版本,但反汇编只会使用.Inn

对于扩展符号和无符号整数之间的区分(例如VMULL)汇编器将不会接受.Inn后缀的指令,但只有.Snn.Unn

3

它们是相同的指令。标志对操作没有影响。

$ cat neon.s 
    .text 
    .code 32 
    .globl _foo 
_foo: 
    vrshrn.u32 d0, q0, #1 
    vrshrn.i32 d0, q0, #1 

$ otool -tv neon.o 
neon.o: 
(__TEXT,__text) section 
_foo: 
00000000 f29f0850 vrshrn.i32 d0, q0, #1 
00000004 f29f0850 vrshrn.i32 d0, q0, #1 
0

一般情况下,你可以放心,装配什么也不做发狂,不像一些编译器。 当汇编器改变了一些指令时,它大多是确切的等价或伪装。