本文将系统地介绍如何利用XCode在iOS设备上使用汇编语言。
一、创建汇编源文件:
在你的XCode项目中存放源文件的目录下鼠标(或触控板)右键,选择New File。然后在左侧的iOS那栏里选择Other,在右边你会看到Assembly File,选中它,然后命名,以.s作为后缀。
二、编写汇编代码:
然后可以尝试以下代码:
/* * arm7.asm * Test * * Created by Zenny Chen on 4/24/10. * Copyright 2010 GreenGames Studio. All rights reserved. */.text.align 4.globl _my_arm_test.globl _my_thumb_test.arm_my_arm_test: vdup.32 q0, r0 qadd8 r0, r1, r2 add r0, r0, LSL #2 bx lr.thumb.thumb_func _my_thumb_test_my_thumb_test: movw r1, #1001 rev16 r0, r1 bx lr
.text表示代码正文部分。
.align根据不同的汇编器会有不同的行为,像这里的.align4可能表示4字节对齐,也可能表示16字节对齐。
GAS规范中表示,可以用.global或.globl来标注全局函数。在Apple的Assembler中仅支持.globl。函数名前要加下划线。
.arm表示后面的函数中的指令都是arm指令。而.thumb表示后面函数中的指令都是thumb或thumb-2指令。其中,如果一个函数是用thumb写的,那么必须用.thumb_func修饰,否则连接器在连接符号时会有问题。
上述代码中,_my_arm_test分别使用了一条NEON指令,一条ARMv6指令和两条ARMv5TE指令。而_my_thumb_test中则分别使用了一条ARMv7 Thumb-2指令、一条ARMv6指令和一条ARMv5TE指令。
三、在C/C++或Objective C/C++中调用汇编函数
如何在你的C/C++源文件中调用汇编写的函数呢?其实这跟调用普通的C函数一样。
externint my_arm_test(inta, int b, int c);
externint my_thumb_test(inta, int b);
void my_test(void)
{
printf("ARM value: %d\n", my_arm_test(10, 20, 30));
printf("Thumb value: %d\n", my_thumb_test(10, 20));
}
我们可以看到,这里函数名前的下划线没有了。这里不需要,而且也不能加下划线。
由于当前Apple的ARM汇编器尚未完全支持Thumb-2指令集,像.w后缀就全都没有支持。但Apple LLVM3.0和LLVM-GCC支持。因此我们可以采用在C/C++中以内联汇编的方式来写。详细请参考——在LLVM的C语言编译器中内联纯汇编函数的注意事项。