iOS汇编入门教程(二)在Xcode工程中嵌入汇编代码

简介

在上一篇文章 iOS汇编入门教程 中介绍了汇编在iOS开发中的应用以及ARM汇编基础知识,本文将介绍在C或Objective-C构成的工程中如何嵌入汇编代码。

注意

在调试ARM汇编时,Xcode的Build对象必须为真机,如果对象为模拟器则是x86汇编。

内联汇编

汇编与C间接通信

在函数中可以直接插入汇编代码来影响函数的运行逻辑,使用的语法为编译指令__asm__,注意插入汇编有可能会被编译器忽略,因此需要加入__volatile__修饰符保证汇编代码有效。

下面给出一个简单的例子,假如我们要实现一个将数值翻一倍的简单函数。

int double_num(int num) {
    return num * 2;
}
复制代码

下面我们采用内联汇编的形式实现将num的值翻倍的操作。

int double_num(int num) {
    __asm__ __volatile__(
        "lsl x0, x0, 1\n"
        "str x0, [sp, #12]\n"
    );
    return num;
}
复制代码

lsl为左移指令,x0中存储的为入参num的值,由于该函数未发起对其他函数的调用,所以不必保护现场,只有一个int类型入参,需要4byte,由于ARM64下sp寻址时必须按照16byte对齐,所以该函数的调用栈大小为16byte,所以num变量会存储在高地址的sp+12~sp+16区域,因此在函数返回时会从sp+12处取出,我们通过str指令将翻倍之后的数值存储在对应区域即可。

汇编与C直接通信

在上面的例子中,为了将计算后的值作为返回值,我们采用了静态计算变量地址的方式,这里我们换用另一种方式,将汇编的计算结果直接存储在C变量中,以下面的函数为例,将输入的值翻倍数次。

int double_num_times(int num, int times) {
    int ret;
    __asm__ __volatile__(
        "lsl x0, x0, x1\n"
        "mov %0, x0"
        : "=r" (ret)
        :
        :
    );
    return ret;
}
复制代码

这里的x0中存储的是num,x1存储的是times,可见从C到汇编的通信时非常自然的;可见汇编的后三行使用了三个冒号,这是内联汇编与C通信的语法,其中第一行为输出指令,第二行为输入指令,第三行为更改的变量列表。对于汇编到C的赋值,只需要在第一行声明"=r" (变量标识符),在汇编执行完毕后会将%0寄存器的值保存在变量标识符内,如果有多个变量需要赋值,可以使用%1, %2以此类推,有关内联汇编输入输出的基本语法可以看这篇文章

使用纯汇编实现函数

注意: 由于C++有特殊的name mangling规则,该方法仅适用于C

除了嵌入式内联汇编外,我们还可以使用汇编文件来直接定义函数,在Xcode中新建文件时,选择Other组中的汇编文件,即可创建一个汇编文件并将其添加到工程的编译单元中。

我们采用纯汇编来实现一下上面的double_num_times函数,在汇编文件中写入如下代码。

; example.s
.section __TEXT,__text,regular,pure_instructions
.ios_version_min 11, 2
.p2align 2
.global _double_num_times_asm
_double_num_times_asm:
    sub sp, sp, #16
    lsl x0, x0, x1
    add sp, sp, #16
    ret
复制代码

第一行为段的固定写法,第四行将符号引出到全局,从第五行开始定义了符号_double_num_times_asm的功能逻辑,这里的下划线是根据C语言的name mangling规则命名的,符号将被映射为C语言的全局函数符号double_num_times_asm

通过上述的汇编代码,我们已经完成了函数定义,只需要通过一个头文件声明一下函数即可。

// example.h
int double_num_times_asm(int num, int times);
复制代码

引入头文件后,即可正常使用函数。

总结

在Xcode中嵌入汇编代码主要依赖了C语言支持通过__asm__引入汇编代码的功能,而直接使用汇编实现函数逻辑则是相当于手动帮助编译器完成了生成汇编代码的过程,通过嵌入汇编可以从更大程度上把握程序的运行。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值