我试图在iOS上使用ffmpeg并调试优化的arm代码中的崩溃。我发现一些无符号(.u16,.u32)指令已被签名的(.i16,.i32)替换。很容易看到,因为GDB上的反汇编指令与源代码不完全匹配。
例如,
vrshrn.u32 -> vrshrn.i32
vrshrn.u16 -> vrshrn.i16
vadd.u16 -> vadd.i16
我的问题:
答案 0 :(得分:4)
这些说明不依赖于元素的有效性 - 这实际上是.Inn
后缀的含义。汇编程序仍然接受.Snn
或.Unn
版本,但反汇编只会使用.Inn
。
对于区分有符号和无符号整数的指令(例如VMULL
),汇编器将不接受.Inn
后缀,而只接受.Snn
或.Unn
。< / p>
答案 1 :(得分: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
答案 2 :(得分:0)
总的来说,与一些编译器不同,你可以放心,汇编程序不会做任何事情。 当汇编程序改变某些指令时,它主要是精确等效或伪指令。