内容简介:简介上一篇文章ARM64汇编基础中介绍了汇编在iOS开发中的应用以及ARM汇编基础知识,本文将介绍在C或Objective-C构成的工程中如何嵌入汇编代码。在调试ARM汇编时,Xcode的Build对象必须为真机,如果对象为模拟器则是x86汇编。
简介
上一篇文章ARM64汇编基础中介绍了汇编在iOS开发中的应用以及ARM汇编基础知识,本文将介绍在C或Objective-C构成的工程中如何嵌入汇编代码。
注意
在调试ARM汇编时,Xcode的Build对象必须为真机,如果对象为模拟器则是x86汇编。
内联汇编
汇编与C间接通信
在函数中可以直接插入汇编代码来影响函数的运行逻辑,使用的语法为编译指令 __asm__
,注意插入汇编有可能会被编译器忽略,因此需要加入 __volatile__
修饰符保证汇编代码有效。
下面给出一个简单的例子,假如我们要实现一个将数值翻一倍的简单函数。
下面我们采用内联汇编的形式实现将num的值翻倍的操作。
lsl为左移指令,x0中存储的为入参num的值,由于该函数未发起对其他函数的调用,所以不必保护现场,只有一个int类型入参,需要4byte,由于ARM64下sp寻址时必须按照16byte对齐,所以该函数的调用栈大小为16byte,所以num变量会存储在高地址的 sp+12~sp+16
区域,因此在函数返回时会从 sp+12
处取出,我们通过 str
指令将翻倍之后的数值存储在对应区域即可。
汇编与C直接通信
在上面的例子中,为了将计算后的值作为返回值,我们采用了静态计算变量地址的方式,这里我们换用另一种方式,将汇编的计算结果直接存储在C变量中,以下面的函数为例,将输入的值翻倍数次。
这里的x0中存储的是num,x1存储的是times,可见从C到汇编的通信是非常自然的;可见汇编的后三行使用了三个冒号,这是内联汇编与C通信的语法,其中第一行为输出指令,第二行为输入指令,第三行为更改的变量列表。对于汇编到C的赋值,只需要在第一行声明 "=r"(变量标识符)
,在汇编执行完毕后会将%0寄存器(实际上是使用x8, x9寄存器来模拟的,常与临时值寄存器x12配合使用,使用%0可能会污染x8和x9)的值保存在变量标识符内,如果有多个变量需要赋值,可以使用%1, %2以此类推,有关内联汇编输入输出的基本语法可以看这篇文章 https://www.cnblogs.com/pengdonglin137/p/3328141.html。
使用纯汇编实现函数
注意: 由于C++有特殊的name mangling规则,该方法仅适用于C
除了嵌入式内联汇编外,我们还可以使用汇编文件来直接定义函数,在Xcode中新建文件时,选择Other组中的汇编文件,即可创建一个汇编文件并将其添加到工程的编译单元中。
我们采用纯汇编来实现一下上面的 double_num_times
函数,在汇编文件中写入如下代码。
第一行为段的固定写法,段的定义将在后续的教程中详细介绍,第四行将符号引出到全局,从第五行开始定义了符号 _double_num_times_asm
的功能逻辑,这里的下划线是根据 C语言 的name mangling规则命名的,符号将被映射为C语言的全局函数符号 double_num_times_asm
,这里由于 _double_num_times_asm
没有调用到其他符号,因此不需要处理x29和x30的暂存。
通过上述的汇编代码,我们已经完成了函数定义,只需要通过一个头文件声明一下函数即可。
引入头文件后,即可正常使用函数。
总结
在Xcode中嵌入汇编代码主要依赖了C语言支持通过 __asm__
引入汇编代码的功能,而直接使用汇编实现函数逻辑则是相当于手动帮助编译器完成了生成汇编代码的过程,通过嵌入汇编可以从更大程度上把握程序的运行。
如果感觉这篇文章不错可以点击在看:point_down:
以上所述就是小编给大家介绍的《iOS汇编入门教程(二)在Xcode工程中嵌入汇编代码》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- iOS汇编入门教程(一)ARM64汇编基础
- iOS 汇编入门教程(一):ARM64 汇编基础
- iOS汇编入门教程(三)汇编中的 Section 与数据存取
- EJS入门教程
- SnapKit入门教程
- Socat 入门教程
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
区块链核心算法解析
【瑞士】Roger Wattenhofer(罗格.瓦唐霍费尔) / 陈晋川、薛云志、林强、祝庆 / 电子工业出版社 / 2017-8 / 59.00
《区块链核心算法解析》介绍了构建容错的分布式系统所需的基础技术,以及一系列允许容错的协议和算法,并且讨论一些实现了这些技术的实际系统。 《区块链核心算法解析》中的主要概念将独立成章。每一章都以一个小故事开始,从而引出该章节的内容。算法、协议和定义都将以形式化的方式描述,以便于读者理解如何实现。部分结论会在定理中予以证明,这样读者就可以明白为什么这些概念或算法是正确的,并且理解它们可以确保实现......一起来看看 《区块链核心算法解析》 这本书的介绍吧!
图片转BASE64编码
在线图片转Base64编码工具
RGB CMYK 转换工具
RGB CMYK 互转工具