天天看點

XCODE(IOS)下内嵌ARM彙編(ARM嵌入式開發中的GCC内聯彙編)

有時候再更新,先看看國内大神們的講解,基本上看完就懂的了。首先要搞清楚的是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(),我相信大家都會。更加具體的就看連結三了。

入門的兩種調用彙編方法都說完了,大家加油吧!有好的連結也可以分享一下。