有时候再更新,先看看国内大神们的讲解,基本上看完就懂的了。首先要搞清楚的是XCODE用的汇编是ARM汇编,而虚拟机的指令是X86的,而不是ARM的指令。所以必须真机才可以。1.XCODE环境下,直接嵌入ARM汇编。2.XCODE环境下,C中嵌入ARM汇编。这两个方面都会涉及到。这三篇文章都非常好,看懂,对于XCODE下汇编就有个全面了解了,能做出简单的ARM汇编混编。
1.在iOS中如何使用汇编语言
http://www.cnblogs.com/zenny-chen/archive/2011/10/31/2229731.html
2.Xcode 环境下的汇编与 C/C++/ObjC (上)
http://www.cnblogs.com/pinping/archive/2011/08/04/2127056.html
3.ARM嵌入式开发中的GCC内联汇编简介
http://blog.csdn.net/ce123_zhouwei/article/details/8209702
有些东西大家必须先知道:(ARM架构兼容性问题:http://www.cocoachina.com/ios/20140915/9620.html 可以了解一下 )
armv6 设备: iPhone, iPhone2, iPhone3G, 第一代、第二代 iPod Touch
armv7 设备: iPhone3GS, iPhone4, iPhone4S
iPad, iPad2, iPad3(The New iPad), iPad mini
iPod Touch 3G, iPod Touch4
armv7s设备: iPhone5, iPhone5C, iPad4(iPad with Retina Display)
arm64 设备: iPhone5S, iPad Air, iPad mini2(iPad mini with Retina Display)
所以关于链接一中的代码:
_my_arm_test:
vdup.32 q0, r0
qadd8 r0, r1, r2
add r0, r0, LSL #2
bx lr
上面这段是armv7的ARM汇编,所以在其它架构的CPU上跑就会报错。当然也有解决方法,仅限armv7及以上设备。由于代码部分是ARM7的代码,自然ARM64位的就不能跑。所以进行的下面一个处理,下面的图里箭头位置去掉了arm64。这样跑起来实际上5S跑的时候还是armv7的指令代码。
当然,链接一里面还有比较好的解决方法,如下。
#if defined(__i386__) || defined(__x86_64__)他们一段的作用就是根据CPU不同的架构调用不同的汇编,这样使程序在各设备下都弄跑起来,包括虚拟机。
_MyASMTest:
xor %eax, %eax
ret
#elif defined(__arm__)
_MyASMTest:
eor r1, r0, r0
bx lr
#elif defined(__arm64__)
_MyASMTest:
eor x1, x0, x0
ret
#endif
下面就上一个傻瓜式的教程:
导入 lala.s 汇编文件:
.text
.align 2
.globl _MyASMTest
.globl _my_arm_test
#if defined(__i386__) || defined(__x86_64__)
_MyASMTest:
xor %eax, %eax
ret
#elif defined(__arm__)
_MyASMTest:
eor r1, r0, r0
bx lr
#elif defined(__arm64__)
_MyASMTest:
eor x1, x0, x0
ret
#endif
.arm
_my_arm_test:
vdup.32 q0, r0
qadd8 r0, r1, r2
add r0, r0, LSL #2
bx lr
ViewController.m的文件改为:
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
my_test();
// Do any additional setup after loading the view, typically from a nib.
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
extern int my_arm_test(int a, int b, int c);
extern int MyASMTest(int a, int b);
void my_test(void)
{
printf("这个支持64位的%d\n", MyASMTest(10, 20));
printf("这个不支持64位的,实际还是ARMV7%d\n", my_arm_test(10, 20, 30));
}
@end
这是XCODE直接调汇编的方法:
新建一个工程,添加一个文件.s,修改一个文件。build setting 下的valid architectures的arm64去掉,这样就可以安心跑起来啦。如果比ARM7还低的测试设备,那ARM汇编部分代码就要重新查找一下。
下面是内敛汇编,可以放到.m或者.c中跑都可以:
unsigned long neilian (void)
{
int a = 100;
int tmp=5;
asm(
"mov %0,#35\n"
:"=r"(tmp)
:
);
printf("%d",tmp);
return 0;
}
上面这个具体的方法,调用就是neilian(),我相信大家都会。更加具体的就看链接三了。
入门的两种调用汇编方法都说完了,大家加油吧!有好的链接也可以分享一下。