ARM處理器指令集
一. 蘋果模擬器指令集:
指令集 | 分析 |
i386 |
針對intel通用微處理器32 架構的 |
x86_64 |
針對x86架構的64 位處理器 |
i386|x86_64 |
是Mac處理器的指令集,i386 是針對intel通用微處理器32 架構的。x86_64 是針對x86 架構的64 位處理器。 |
模擬器
並不運行arm
代碼,軟件會被編譯成x86
可以運行的指令。所以生成靜態庫時都是會先生成兩個.a
,一個是i386
的用於在模擬器
運行,另一個是在真實設備
上運行的,然後再用命令將兩個.a
合併成一個(1+1=1
)。
二.蘋果設備指令集相關
位數 | 指令集 |
---|---|
32 位ARM |
armv6 、armv7 、armv7s |
64 位ARM |
arm64 、armv8 |
蘋果A7 處理器支持兩個不同的指令集:32位ARM 指令集(armv6|armv7|armv7s )和64位ARM 指令集(`arm64 |
armv8`)。 |
指令集 | 支持設備 |
---|---|
armv6 設備 |
第一代、第二代 iPod Touch |
armv7 設備 |
iPad, iPad2, iPad3(The New iPad), iPad mini; iPod Touch 3G, iPod Touch4 |
armv7s 設備 |
iPad4(iPad with Retina Display) |
ARMv8 /arm64 設備 |
iPad Air, iPad mini2(iPad mini with Retina Display) |
三. 蘋果模擬器、設備指令集總結
模擬器 | 設備 |
---|---|
( |
( |
當使用iOS模擬器的時候會遇到i386
|x86_64
,iOS模擬器沒有arm
指令集,編譯運行的是x86指令集
,所以,只有在iOS設備
上,纔會執行設備對應的arm指令集
。
四. XCode中與指令集相關
XCode中關於生成二進制包指令集相關的設置項有以下三個:
圖.xcode設置
Xcode設置項 | 定義 | 注意事項 |
---|---|---|
Architecture |
指你想 支持的指令集 |
該選項指定了工程 如果支持的指令集數目有多個,就會編譯出包含多個指令集代碼的數據包,從而會造成最終編譯生成的 |
Valid architectures |
指即將 編譯的指令集 |
該選項指定
例如: |
Build Active Architecture Only |
該編譯項用於設置是否只 編譯當前使用的設備 對應的arm指令集 。 |
使用條件: ①其值設置爲 ② ①設置爲 ②設置爲 例如:當該選項設置成 |
假定:我們將Build Active Architecture Only
值設置爲YES
,同時Xcode
連接上手機iPhone5S
匹配指令集arm64
)。如下五種
情況總結如下表:
情況 | Architectures | ValidArchitectures | 結果 | 分析 |
---|---|---|---|---|
情況① | armv7、armv7s 、arm64 |
armv6、armv7s 、arm64 |
arm64 |
因爲:取交集 所以:爲 |
情況② | armv6 、armv7、 armv7s |
armv6 、armv7s 、arm64 |
armv7s |
因爲:取交集 所以:爲 |
情況③ | armv6 armv7 |
armv6、 armv7s、 arm64 |
armv7 |
無交集。但是因爲:ValidArchitectures 支持armv7s 則必然支持armv7 ,Architectures支持armv7,從XCode4.5 開始,就不 再支持armv6 指令集。所以:最終生成二進制指令集armv7 |
情況④ | armv6 | armv6、 armv7s、 arm64 |
<br />無響應 |
雖然 因爲從 |
情況⑤ | armv7、 armv7s、 arm64 |
armv7、 armv7s |
error報錯 | 生成二進制包支持的指令集編譯出錯error 信息:No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=arm64, VALID_ARCHS=armv7 |
- 分析:
- 當
Build Active Architecture Only
起作用時:連接的手機指令集匹配是由高到低(arm64 > armv7s > armv7
)依次匹配的。 - 指令集都是可以
向下兼容
的
比如,你的設備是armv7s
指令集,那麼它也可以兼容運行比armv7s
版本低的指令集:armv7、armv6
xcode
對armv6
指令集的支持 Xcode4.5
起不
再支持armv6
。
如何選擇支持的指令集
?
如果你的軟件對安裝包大小非常敏感,你可以減少安裝包中的指令集數據包,而且這能達到立竿見影的效果。
很久前xcode
支持的指令集是armv7/armv7s
,後來改成只支持armv7
後,比原來小了10MB
左右。目前AppStore上的一些知名應用,比如百度地圖、騰訊地圖通過反彙編工具查看後,也都只支持armv7
指令集。
根據向下兼容原則,armv7
指令集的應用是可以正常在支持armv7s/arm64
指令集的機器上運行的。
不過對於armv7s/arm64
指令集設備來說,使用運行armv7
應用是會有一定的性能損失
,不過這種損失有多大缺乏權威統計數據,不會影響用戶體驗的。
建議:Valid Architectures通常Debug
模式設置值爲Yes
,Release
模式設置爲No
參考鏈接:
1.armv6, armv7, armv7s的區別
2.Apple移動設備處理器指令集 armv6、armv7、armv7s及arm64
3.Xcode設置項之Architectures和Valid Architectures
4.iOS工程如何支持64-bit