3

我试图在 iOS 上使用 ffmpeg 并在优化的 arm 代码中调试崩溃。我发现一些无符号(.u16,.u32)指令已被有符号(.i16,.i32)取代。很容易看出,因为 GDB 上的反汇编指令与源代码不太匹配。

例如,

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

我的问题:

  1. 这种行为是否正确且符合预期?如果不是,我们如何纠正它?
  2. 如果它们是等价的,为什么我们还需要未签名的呢?是因为这样代码更明确吗?
  3. 其他平台的工具包是否会出现这种行为?比如Android的工具包?(听说苹果的AS很老了)
4

3 回答 3

4

这些指令不依赖于元素的符号——这实际上是.Inn后缀的意思。汇编器仍然接受其中一个.Snn.Unn版本,但反汇编只会使用.Inn.

对于区分有符号和无符号整数的指令(例如VMULL),汇编器不接受.Inn后缀,而只接受.Snnor .Unn

于 2012-04-04T15:03:04.340 回答
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
于 2012-04-04T18:02:53.090 回答
0

一般来说,您可以放心,汇编器不会像某些编译器那样做任何疯狂的事情。当汇编器改变一些指令时,它大多是完全等价的或伪指令。

于 2012-04-05T02:30:14.037 回答