为什么要学习汇编
我们都知道,App装在手机上是二进制文件,也就是机器能识别的0和1的这种机器语言,而汇编是一种很底层的语言,能和机器语言一一对应,这样,我们就可以把机器语言反编译成汇编语言,知道里面的逻辑。
- 汇编语言与机器语言一一对应,能编译和反编译
- 高级语言能编译成汇编语言,但是汇编几乎不能反编译成高级语言
汇编的种类
不同的CPU使用不同的架构,不同的架构对应不同的指令集,我们主要研究arm64架构的汇编。
| 架构 | iOS设备 |
|---|---|
| x86 | 模拟器,Mac |
| armv7 | iPhone3GS, iPhone4, iPhone4S,iPad, iPad2, iPad3(The New iPad), iPad mini, iPod Touch 3G, iPod Touch4 |
| armv7s | iPhone5, iPhone5C, iPad4(iPad with Retina Display) |
| arm64 | iPhone5S 以后 iPhoneX , iPad Air, iPad mini2以后, M1 |
CPU和寄存器
CPU中有一个很重要的部件叫寄存器。寄存器的作用就是进行数据的临时存储。 CPU的运算速度是非常快的,为了性能CPU在内部开辟一小块临时存储区域,并在进行运算时先将数据从内存复制到这一小块临时存储区域中,运算时就在这一小快临时存储区域内进行。我们称这一小块临时存储区域为寄存器。
- 对于arm64系的CPU来说, 如果寄存器以x开头则表明的是一个64位的寄存器,如果以w开头则表明是一个32位的寄存器,其中32位的寄存器是64位寄存器的低32位部分并不是独立存在的。
通用寄存器
- 通用寄存器也称数据地址寄存器通常用来做数据计算的临时存储、做累加、计数、地址保存等功能。定义这些寄存器的作用主要是用于在CPU指令中保存操作数,在CPU中当做一些常规变量来使用。
- ARM64拥有有32个64位的通用寄存器 x0 到 x28,fp,lr,sp
- PC寄存器:指令指针寄存器,显示了CPU当前要读取指令的地址
- fp:某些时刻保存栈底的地址
- sp:保存栈顶的地址
- lr:保存回家的路,遇到ret指令,PC->lr里面的值