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
</article>