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

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

发布时间:2019-06-01 04:53:39 所属栏目:业界 来源:欧阳大哥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; 

(编辑:湖南网)

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

热点阅读