XCODE(IOS)下内嵌ARM汇编(ARM嵌入式开发中的GCC内联汇编)

时间:2021-04-15 04:03:05

有时候再更新,先看看国内大神们的讲解,基本上看完就懂的了。首先要搞清楚的是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的指令代码。

XCODE(IOS)下内嵌ARM汇编(ARM嵌入式开发中的GCC内联汇编)


当然,链接一里面还有比较好的解决方法,如下。

#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


他们一段的作用就是根据CPU不同的架构调用不同的汇编,这样使程序在各设备下都弄跑起来,包括虚拟机。

下面就上一个傻瓜式的教程:

导入 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(),我相信大家都会。更加具体的就看链接三了。

入门的两种调用汇编方法都说完了,大家加油吧!有好的链接也可以分享一下。