加入收藏 | 设为首页 | 会员中心 | 我要投稿 晋中站长网 (https://www.0354zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长资讯 > 评论 > 正文

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

发布时间:2019-05-29 20:59:36 所属栏目:评论 来源:欧阳大哥2013
导读:合抱之木,生于毫末;九层之台,起于垒土;千里之行,始于足下。--(老子道德经 ) 对于一个闭源系统来说如果想研究某些逻辑的内部实现就需要对汇编语言进行掌握和了解、对于某些需要高性能实现的逻辑来说用汇编语言实现可能是最好的选择、对于某些逻辑来说可能只

数据的定义类似C语言中变量的定义,汇编代码中也支持多种类型的数据定义。定义一个数据的语法如下:

  1.      
  2. .<数据类型>  值 

一共有如下的数据类型:

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

数据类型的值可以是一个常量也可是一个表达式,也可以是一个标签符号。如果我们想给某个数据定义指定一个类似于变量的名称,则可以和标签来结合。比如:

  1. name: 
  2. .asciz "欧阳大哥" 
  3. age: 
  4. .long 13 
  5. nickname: 
  6. .quad name   //这里的昵称变量是一个指针表明和name是相同的。 

如果要想在代码块中访问上面定义了标签名的变量,则可以采用如下指令:

  1. //x86体系的指令访问符号变量 
  2. leaq name(%rip), %rax 
  3. movl age(%rip), %ebx 
  4. movq nickname(%rip), %rcx 
  5.   
  6. //arm64体系的指令访问符号变量 
  7. adrp x0, name@PAGE 
  8. add x0, x0, name@PAGEOFF 
  9. adrp x1, age@PAGE 
  10. add x1, x1, age@PAGEOFF 
  11. ldr x1, [x1] 
  12. adrp x2, nickname@PAGE 
  13. add x2, x2, nickname@PAGEOFF 

7.函数的定义

汇编语言中并没有专门用于函数定义的关键字,汇编语言中只有代码块的定义,所有可执行的代码块都存放在代码段中。所谓函数调用其实就是调用函数代码对应的首地址。因此对于文件内的函数调用其实可以借助标签来完成,而其他文件对函数的调用则可以借助符号来完成。对于函数中的参数部分的处理则是按照函数调用参数传递的ABI规则来指定。

下面就是一个求两个参数和的加法函数在x86_64位体系结构下的实现:

  1. //x86_64位下的函数实现 
  2. .text 
  3. .global _add 
  4. .align 3 
  5. _add: 
  6. movq  %rdi,%rbx 
  7. movq  %rsi,%rax 
  8. addq  %rbx,%rax 
  9. ret 
  10. LExit_add: 

8.指令的编写

关于在汇编语言中编写指令这里就不赘述了,否则一本书也说不完,大家可以参考相关的汇编代码的书籍即可。

9.伪条件语句

汇编语言有相应的进行比较和跳转的指令,但是我们仍然可以借助伪条件语句来使得我们的代码更加具有可读性。伪条件语句的语法如下:

  1. .if 逻辑表达式 
  2. .elseif 逻辑表达式 
  3. .else 
  4. .endif 

10.CFI: 调用框架指令

这部分伪指令以.cfi开头。主要用来记录函数的帧栈信息和用于异常处理。具体的指令介绍请参考:blog.csdn.net/permike/art…

引用汇编代码文件中的符号

因为汇编代码源文件没有所谓的.h头文件声明。所以当你在其他文件中要想使用汇编语言中定义的函数或者全局变量时,可以在你的源代码文件的顶部进行符号使用的声明:

  1. //xxxxx.m 
  2.   
  3. //函数声明 
  4. extern void 不带下划线的函数符号(参数列表); 
  5.   
  6. //变量使用声明 
  7. extern 类型 不带下划线的变量符号; 

在高级语言中嵌入汇编代码

我们还可以在高级语言中嵌入汇编代码,嵌入的主要目的是为了优化代码的性能,还有一些高级语言完成不了能力比如获取当前执行指令的地址以及读取一些状态寄存器和特殊寄存器的值,还有一些场景甚至可以用汇编代码来解决高级语言需要用锁来解决的多线程的问题等等。

就可以很清楚的知道嵌入的规则了,这篇文章已经介绍得很仔细了。下面我将举3个具体的例子:

高级语言的变量作为嵌入汇编代码的输入输出

  1. //计算两个数相加 
  2. long add(long a, long b) 
  3.     long c = 0; 
  4. #if __arm64__ 
  5.      __asm__( 
  6.              "ldr x11, %1n" 
  7.              "ldr x12, %2n" 
  8.              "add %0, x11, x12n" 
  9.              :"=r"(c) 
  10.              :"m"(a),"m"(b) 
  11.              ); 
  12.       
  13. #elif __x86_64__ 
  14.       
  15.     __asm__( 
  16.             "movq %1,%%rdin" 
  17.             "movq %2,%%rsin" 
  18.             "addq %%rdi,%%rsin" 
  19.             "movq %%rsi,%0n" 
  20.             :"=r"(c) 
  21.             :"m"(a),"m"(b) 
  22.             ); 
  23.       
  24. #else 
  25.         c = a + b; 
  26. #endif 
  27.       
  28.     return c; 

(编辑:晋中站长网)

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

热点阅读