在iOS中如何使用汇编语言

本文将系统地介绍如何利用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语言编译器中内联纯汇编函数的注意事项


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值