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

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

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

标签可以当作是一个文件中的局部指针变量,对付数据段中界说的标签凡是用来当做会见变量的地点,而对付代码段中界说的标签凡是用来做指令跳转用。好比下面的代码:

  1. //x86_64中的代码 
  2. .data 
  3. AGE:    //标签的界说处 
  4. .long 13 
  5.   
  6. .text 
  7. LAB1:    //标签的界说处 
  8. mov AGE(%rip), %rax     //标签的行使处 
  9. jmp LAB1                         //标签的行使处 

有的时辰还可以界说偏向标签,偏向标签只能是数字,然后可以在行使这些偏向标签时,在偏向标签后头带一个b表白跳转到当前指令前面界说的某个最近的偏向标签,而偏向标签后头带一个f表白跳转到当前指令后头界说的某个最近的偏向标签。就好比下面演示的代码:

  1. //x86_64中的演示代码,这内里界说了偏向标签,同时也有怎样跳转到这些偏向标签的行使要领。 
  2. .text 
  3. mov %rax, %rax 
  4. 1:                //a 
  5. mov %rax, %rax 
  6. 2:                //b 
  7. mov %rax, %rax 
  8. 2:                //c 
  9. mov %rax, %rax 
  10. jmp 2b   //跳转到c处 
  11. jmp 1b   //跳转到a处 
  12. jmp 1f   //跳转到d处 
  13. 1:                //d 
  14. mov %rax, %rax 

标签只是文件内陆点偏移的别名,只能在界说的文件内部引用。要想让这个标签被外部引用和会见就必要将标签声明为标记。高级说话文件中界说的能被外部会见的函数和全局变量着实都是一个标记,不管是函数地点照旧全局变量的内存地点,着实都是一个地点位置,而地点的别名则是可以用标签暗示,因此要想将一个标签界说为外部可会见,就必要将标署名声明为标记。就如高级说话中的静态函数和静态变量以及全局函数和全局变量一样,汇编说话中的标记声明也有两种:

  1. //对外可见的全局标记,可以被外部措施引用和会见。 
  2. .global  全局标记名 
  3. 全局标记名: 
  4.   
  5. //私有外部标记,只在措施内可引用和会见。 
  6. .private_extern  私有外部标记名 
  7. 私有外部标记名: 

标记名要和标署名匹配。由于C说话的函数名称以及全局变量等标记在编译时天生的标记前面添加一个下划线_。以是在高级说话中的名称对应的真实标记都是带一个下划线前缀的,因此一样平常环境下我们在汇编说话中声明的标记和标署名最好带一个下划线。而且在其他高级说话的声明中不要行使这个下化线,就好比下面的例子:

  1. //xxx.s 
  2.   
  3. //在数据段中界说一个全局变量标记_testSymbol。 
  4. .data 
  5. .global _testSymbol 
  6. _testSymbol: 
  7. .int 10 
  8.   
  9. ............................................. 
  10. //xxx.m 
  11.   
  12. //高级说话中声明行使这个标记。 
  13. extern int testSymbol; 
  14.   
  15. int main(int argc, char *argv[]) 
  16.    printf("testSymbol = %d",testSymbol); 
  17.    return 0; 

同时在汇编代码中引用高级说话界说的标记时,也要多带上一个下划线前缀。

4.对齐

由于内存寻址会见的一些特征,要求我们的某些代码可能数据的存放地点必需是某个数字的倍数,也就是所谓的对齐。配置对齐的要害字如下:

  1. //表白此处的地点是(2^3)8的倍数。这内里p2align貌似和align所表达的意义相似,不知道为什么会有两个要害字。 
  2. .align 3 
  3. .p2align 3 

5.宏界说

汇编说话也可以和C说话一样行使宏界说,来做一些代码复用处理赏罚。宏界说的语法如下:

  1. //宏的开始 
  2. .macro 宏名称 
  3.   
  4. //这内里可以编写任何其他的汇编代码和要害字 
  5. // 宏可以带参数,宏内行使参数老是从$0开始。 
  6. //宏的竣事 
  7. .endmacro 

(编辑:湖南网)

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

热点阅读