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

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

发布时间:2019-05-29 13:06:49 所属栏目:业界 来源:欧阳大哥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 

(编辑:核心网)

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

热点阅读