2012-04-04 85 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

一般情況下,你可以放心,裝配什麼也不做發狂,不像一些編譯器。 當彙編器改變了一些指令時,它大多是確切的等價或僞裝。