正在做一个应用,底层使用汇编,该汇编分为i386 和arm还有其他,我的程序在模拟器中运行正常,也就是走i386汇编没问题,但是同一个工程,运行到iPad4上,经调试跟踪,问题出在arm汇编的部分,该部分执行完之后结果有误,所以错误。我也查了资料,有说苹果的处理器不是标准的arm架构,默认指令集是thumb2,我的other C Flag也改过。但是依然不对。。。。求大神指点
1楼 @tinyfool OK,情况是这样。我现在做的是一个数据加密解密的客户端,公司原本是只有windows平台的,我在做的是iOS平台的客户端,原本windows平台的加解密部分有使用汇编代码,故我这里也需要使用,不然是解密不了用windows客户端加密的密文的。我使用标准C++和标准C语言,改写的windows平台的代码使其加解密部分可以在iOS平台使用。现在在模拟器环境下已经成功。即可以解密使用windows客户端加密的密文。但是该工程我运行在iPad4就会失败,原因就是我上面说的,在模拟器里面执行的是i386的汇编代码,而在真机中是arm汇编代码。该汇编代码是大数变换bignum.h。网上可以找到的,不是我写的,其中的arm部分说支持armv3+。如觉得不清楚,郝大大请告知,我再继续描述
xcode5 的话,在 Log Navigator 里可以展开看一下相关文件的编译命令。
那个汇编你还是要搞清楚是用哪个指令集写的,ARMv3 的指令集相当老了,thumb指令是 ARMv4T 指令集才引入的,然后相应的设置编译参数,怀疑需要 -mno-thumb 。
Apple 的处理器是在实现架构上修改,指令集是标准的。
建议你到 wikipedia 上扫一眼 arm 指令集的介绍,这样有一些基本的概念。你要先确认这些代码里的指令倒底有没有用到 thumb,虽然注释上说兼容 ARMv3+,但是我也不知道作者有没有测试过,我就碰到过给 ARMv6 写的代码里用到 ARMv6T2指令的。其次看 xcode 编译指令是不是正确。最重要的是,所谓的出错是什么现象?如果没有 SIGILL 说明没有异常指令。如果只是运算结果不对,倒有一点thumb代码在arm模式执行或者反过来的可能性,不过也有可能代码里对处理器做了什么不恰当的假设。
顺便说一下,如果算法你知道的话,直接用一个 C 的版本应该就行了,ARMv3 的汇编版本在这种纯计算上能有多少性能提升呀,编译器生成 v7+Neon 的性能有可能更好。