iOS汇编入门教程之在Xcode工程中嵌入汇编代码的方法

简介

上一篇文章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.jb51.net/article/179970.htm

使用纯汇编实现函数

注意: 由于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__ 引入汇编代码的功能,而直接使用汇编实现函数逻辑则是相当于手动帮助编译器完成了生成汇编代码的过程,通过嵌入汇编可以从更大程度上把握程序的运行。

以上所述是小编给大家介绍的iOS汇编入门教程之在Xcode工程中嵌入汇编代码的方法,希望对大家有所帮助!

(0)

相关推荐

  • C# 通过 inline-asm 解决嵌入x86汇编

    "嵌入"是指什么?资源?注入进程?如果是嵌入资源,那跟嵌入任何其他内容是一样的,vs中只要拖拽就能完成嵌入资源.如果是注入进程,则必须得先将汇编码转为机器码.虽然托管的C#也是能办到,但这似乎是所有人都不推荐的方式. C#可不可以嵌入汇编 可以 在我眼中C#作为一个介于中上层语言是不可能不可以置入汇编代码的 为什么会被我认为中上层语言呢 从C#保留指针就可以看出 我知道有很多人一定不会相信C#可以使用汇编代码 不过C#会比较麻烦C#不可以直接内联汇编(inline-asm)准确的说C#

  • iOS Xcode汇编模式切换的方法介绍

    一.概念 1.汇编指令 : 模拟器上运行的是Intel指令,而真机上运行的是arm指令, 2.每条汇编指令的格式总是由: 操作码, 操作数1,操作数2,操作数3组成. 操作数要么就是常数,要么就是寄存储器,要么就是内存地址.你所看到的操作数中的RAX,RSI,RDI,R0,R1... 这些都是CPU中的寄存器(关于寄存器部分我将在下一篇文章中具体介绍).而且在XCODE的左下角部分我们可以查看当前CPU中的所有寄存器的值,你可以打印并修改他们. 每个函数方法的第一个地址,就是这个函数的入口地址,

  • 易语言代码中嵌入汇编/机器码方法

    很多朋友在编写易语言里要混合插入汇编语言等,如何解决呢?我们来看下 我们都知道,C++或Delphi的程序源代码中可以嵌入汇编代码,以达到某些特定目的.易语言作为实用而又功能强大的编程语言,也允许在代码中嵌入汇编,--当然严格来说,是嵌入机器指令代码.借助"特殊功能支持库"中的"置入代码"命令,可以完成这项功能.(liigo 2009.03.20补记:自易语言4.12版本起,"置入代码"已被移入核心支持库.) 为什么要在易语言中"置入代

  • iOS汇编入门教程之在Xcode工程中嵌入汇编代码的方法

    简介 上一篇文章ARM64汇编基础中介绍了汇编在iOS开发中的应用以及ARM汇编基础知识,本文将介绍在C或Objective-C构成的工程中如何嵌入汇编代码. 注意 在调试ARM汇编时,Xcode的Build对象必须为真机,如果对象为模拟器则是x86汇编. 内联汇编 汇编与C间接通信 在函数中可以直接插入汇编代码来影响函数的运行逻辑,使用的语法为编译指令 __asm__ ,注意插入汇编有可能会被编译器忽略,因此需要加入 __volatile__ 修饰符保证汇编代码有效. 下面给出一个简单的例子,

  • iOS汇编入门教程之ARM64汇编基础教程

    前言 对于应用层开发人员而言,仅仅掌握Objective-C和系统框架即可较好的完成开发,但在涉及到应用加固.逆向分析等内容时仅有应用层开发技能就会显得非常的无力,因此掌握汇编对于突破iOS开发水平的瓶颈十分有效. 一个例子 以反调试为例,我们知道,通过调用ptrace函数可以阻止调试器依附. ptrace(31, 0, 0, 0) 这种方式能够被函数hook轻易破解,例如使用facebook的fishhook.为了防止函数被hook,我们可以将函数调用转为通过汇编发起系统调用,即使用下面的代码

  • PowerShell入门教程之Cmd命令与PowerShell命令相互调用的方法

    单独使用一种脚本来完成一项任务是理想的状态,而现实的情况往往是,因为历史原因.或者团队组成,你不得不将多种脚本或者程序组合在一起,来完成某项任务.本文的讨论范围是Cmd命令与PowerShell命令之间的组合与调用. 毋庸置疑,Cmd命令与PowerShell命令之间的调用有两个方向.即在Cmd命令中调用PowerShell的命令,以及在PowerShell脚本中调用Cmd命令.需要说明的是,这里的调用分两个层次:一.简单的在其中一个的环境中执行另外一个命令,完成部分工作:二.在其中一个的执行上

  • CocosCreator入门教程之用TS制作第一个游戏

    前提 无论学什么技术知识,官方文档都应该是你第一个教程,所以请先至少阅读新手上路这一节 http://docs.cocos.com/creator/manual/zh/getting-started/ 再来看这篇文章. 这里假设你已经安装成功了 Cocos Creator. TypeScript VS JavaScript 这里当然只会讲优点: 1. ts 是 js 的超集,所有 js 的语法 ts 都支持. 2. ts 支持接近完美的代码提示,js 代码提示接近于没有. 3. ts 有类型定义

  • AngularJS入门教程之AngularJS表达式

    表达式用于应用程序数据绑定到HTML.表达式都写在双括号就像{{表达式}}.表达式中的行为跟ng-bind指令方式相同. AngularJS应用表达式是纯javascript表达式,并输出它们被使用的数据在那里. AngularJS表达式格式 : {{expression }} AngularJS表达式可以是字符串.数字.运算符和变量 数字运算{{1 + 5}} 字符串连接{{ 'abc' + 'bcd' }} 变量运算 {{ firstName + " " + lastName }}

  • AngularJS入门教程之Helloworld示例

    本文实例讲述了AngularJS入门教程之Helloworld示例.分享给大家供大家参考,具体如下: 什么是AngularJs? angularjs是一个为动态WEB应用设计的结构框架.它能让你使用HTML作为模板语言,通过扩展HTML的语法,让你能更清楚.简洁地构建你的应用组件.它的创新点在于,利用数据绑定和依赖注入,它使你不用再写大量的代码了.这些全都通过浏览器端的javascript实现,这也使得它能够完美地和任何服务器技术结合. AngularJS简单的Helloworld例子: <!D

  • AngularJS入门教程之AngularJS模型

    相关阅读: AngularJS入门教程之AngularJS表达式 AngularJS入门教程之AngularJS指令 在前面表达式和指令的教程中了解到,AngularJS模型(ng-model)可以将HTML输入域中的值与AngularJS创建的变量绑定. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <script src="http://apps.bdimg.

  • AngularJS入门教程之AngularJS指令

    熟悉HTML的朋友都知道,HTML有很多属性.比如<a>标签的href属性可以来指定链接的URL地址,<input>标签的type属性可以用来指定input的类型.AngularJS指令就是通过扩展HTML的属性来为 AngularJS应用增加功能. AngularJS指令用于扩展HTML.这些都是先从ng- 前缀的特殊属性.我们将讨论以下指令: 常用AngularJS指令 ng-app 指令初始化一个 AngularJS 应用程序. ng-init 指令初始化应用程序数据. ng

  • Zend Framework入门教程之Zend_View组件用法示例

    本文实例讲述了Zend Framework入门教程之Zend_View组件用法.分享给大家供大家参考,具体如下: Zend_View组件可以实现MVC模式中视图部分的代码与Model和Controller部分的分离. 使用步骤:首先在Controller中建立一个Zend_View实例,并将需要的变量传递给它:之后,Controller通知Zend_View显示一个特定的视图, 生成View输出的内容. 实例之控制器代码脚本: <?php //使用模型来获取书籍作者和标题相关数据 $data =

  • Zend Framework入门教程之Zend_Session会话操作详解

    本文实例讲述了Zend Framework入门教程之Zend_Session会话操作.分享给大家供大家参考,具体如下: 会话命名空间 实现会话 代码: <?php require_once "Zend/Session/Namespace.php"; $myNamespace = new Zend_Session_Namespace('Myspace'); if(isset($myNamespace->numberOfPageRequests)) { $myNamespace

随机推荐