加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 业界 > 正文

深入iOS系统底层之程序中的汇编代码

发布时间:2019-06-01 04:53:39 所属栏目:业界 来源:欧阳大哥2013
导读:合抱之木,生于毫末;九层之台,起于垒土;千里之行,始于足下。--(老子道德经 ) 对付一个闭源体系来说假如想研究某些逻辑的内部实现就必要对汇编说话举办把握和相识、对付某些必要高机能实现的逻辑来说用汇编说话实现大噶?鲱好的选择、对付某些逻辑来说也许只

这个首要是由于找不到体系SDK的路径文件所致,因此可以带上-isysroot参数来同时指定体系SDK路径。下面就是一个行使的示例:

  1. clang -rewrite-objc -arch arm64  -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.1.sdk xxxx.m 

这里的-isysroot后头的路径要确保是对应体系SDK的路径,同时-arch中的值要和路径中的SDK要是沟通的布局系统。

4.天生汇编代码

-S 源代码文件 -o 输出文件: 要将某个源代码文件天生汇编代码时必要在 -S 参数后头指定源代码文件。而-o 后头的输出文件就是对应的汇编代码文件,一样平常这个输出文件以.s为扩展名。这里要留意同时行使-arch参数指定输出的系统架构。

5.编译

-c 源代码文件 -o 输出文件:要编译某个源代码文件时行使这两个参数选项,个中-c后头随着的是要编译的源代码文件,而-o后头输出的是.o为扩展名的方针文件。

6.链接

-filelist LinkFileList文件 -o 输出文件: 执行链接时要把全部方针.o文件作为输入参数,可是为了打点利便可以将这些.o文件的路径生涯到一个扩展名为.LinkFileList的文件中,然后再行使-filelist 参数后头跟从对应的.LinkFileList文件来指定方针文件荟萃。而-o后头的输出文件就是对应的可执行措施文件。

工程中引入汇编代码

你也可以在xcode工程中直接引入汇编代码可能行使汇编代码来编写措施和函数,添加汇编文件的要领是:File菜单->New->File...->在列表中选择:Assembly File即可。一样平常环境下汇编代码都是以.s为扩展名,天生的文件是一个空文件,然后你就可以在文件内里编写对应的汇编代码了。体系也支持在汇编代码中配置断点举办调试。由于iOS体系支持多种系统布局,以是可以在汇编代码中行使几个宏来区分代码是x86_64的照旧arm可能arm64的, 就好比下面的代码:

  1. //你可以像高级说话一样通过#include引入头文件。 
  2. #include <xxx.h> 
  3.   
  4. //arm系统 
  5. #ifdef __arm__ 
  6.   
  7. //指令和数据界说 
  8.   
  9. //arm64系统 
  10. #elif __arm64__ 
  11.   
  12. //指令和数据界说 
  13.   
  14. //x86 32位系统 
  15. #elif __i386__ 
  16.   
  17. //指令和数据界说 
  18.   
  19. //x86_64位系统 
  20. #elif __x86_64__ 
  21.   
  22. //指令和数据界说 
  23.   
  24. //其他系统 
  25. #else 
  26.   
  27. #endif</xxx.h> 

当你在项目中添加了一个汇编文件时,就必要把握和相识汇编代码的编写。关于汇编指令的具体描写因为过分复杂这里就不先容了,这里首要先容一些常用的汇编要害字,以便辅佐各人能更好的阅读和编写措施。

常见的汇编语法

在Xcode中无论是AT&T照旧arm汇编说话的要害字都以.开头。编写汇编代码首要就是数据的界说以及代码指令。一个汇编说话文件中还可以行使和C说话相同的文件引入以及各类预编译指令,还可以引用高级说话中界说的变量和标记以及函数。

1.注释

汇编指令中注释和C/C++/OC沟通。arm系统下的汇编代码特有的行注释是代码后头的 ;号注释,而x86_64系统下的汇编代码的特有的行注释是##。

2.节

无论是指令照旧数据打点的单元都是节(Section)。由于在iOS体系的mach-o文件名目中的数据和指令的存储都是以段(Segment)和节为单元分另外。任何代码和数据老是在某个节内被界说。每个节都归属于某个段,每个节有一个独一的名字。节界说的要害字和语法如下:

  1. .section <段名>,<节名>,<节属性> 

沟通的段名和节名可以呈此刻多出,数据和代码都是界说在由.section指定的节下开始,并竣事于下一个节的界说开始处。体系最终在天生代码时会将沟通的段名和节名的内容同一汇总到一路存储。一样平常环境下全部的指令代码都是在__TEXT段下的节中被界说,而数据界说则是在__DATA段下的节中被界说。假如汇编代码中不指定节名则数据和代码默认是在__TEXT,__text下。体系还提供了两个简化代码段和数据段的节界说要害字。

  1. //代码段的界说,等价于 .section __TEXT,__text 
  2. .text 
  3.   
  4. //数据段的界说,等价于 .section __DATA,__data 
  5. .data 

在反汇编代码中的节界说中除了指命名称外你还会看到一些好比:regular,pure_instructions,no_dead_strip,cstring_literals等等节界说的属性。这些属性所代表的意义和mach-o文件名目中的布局体struct section_64中的flags字段所暗示的意义同等。flags可配置的值就是中那些以S_开头的宏界说值。

3.标签和标记

标签是一个可被领略的地点偏移暗示,是一个地点的别名。行使标签的方针是为了让措施代码更具有可读性。标签界说后可以在其他指令中引用,也可以在数据变量中被引用。标签的界说法则为:

  1. 标署名1: 
  2. //代码和数据 
  3. 标署名2: 
  4. //代码和数据 

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读