在iOS中如何使用汇编语言

时间:2021-02-01 01:05:22

本文将系统地介绍如何利用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


这里要注意的是Apple所采用的ARM汇编器遵循GNU Assembler规范。其中,我们可以看到,汇编文件里的注释可以采用C语言标准的注释方式,也可以用C++标准的//注释方式。

.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语言编译器中内联纯汇编函数的注意事项