有時候再更新,先看看國内大神們的講解,基本上看完就懂的了。首先要搞清楚的是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__)
_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(),我相信大家都會。更加具體的就看連結三了。
入門的兩種調用彙編方法都說完了,大家加油吧!有好的連結也可以分享一下。