ARM内核
- 函数的调用
- 加载、存储
- 计算
- 中断
- 异常
- 线程的切换
为了提高学习效率,我们要提前想好学习策略。
首先,使用频率越高的知识点,越要首先学习。假使,我们学习了一个知识点,能覆盖工作中80%的工作量,那是不是很夸张的学习效率?!
其次,有两种覆盖知识点,梳理知识点的策略。一种是将知识按体系划分,挨个学习,系统学习。具体而形象的学习样板就是教科书。第一章,第二章等等,挨个分支学习、梳理。如果我们要讲述应题的知识,就要按寄存器、计算机工作原理、汇编指令、内核架构分体系去挨个讲解。还有一种策略就是面对问题。比如,我们首先提出一个问题:“函数调用,从C语言到汇编,再到CPU内核,以及寄存器的工作表现是怎样实现的”,如果我们把这个问题讲解清楚,就要把各个牵涉的体系知识揉到一起讲解。第二种策略,似乎更能把使用频率高的知识点串一起,一起学习。是我们面对工程应用更好的学习策略。因为我们不是做研究啊!如果,我们用第二种工作策略,感觉收益不大了(因为使用频率低的,这种学习方式我们不易接触到,无法高效率补充知识盲点)。那么我们就应该更换第一中学习策略了,补充知识盲点,系统学习,系统梳理。
ok,我们采用第二种策略开始学习。
函数的调用
要实现函数调用,有至少要有四步:
- 压栈,保护当前函数现场。
- 跳转,实现函数跳转。
a. 读参数
b. 运算、运行
c. 返回结果 - 跳转,返回父级函数。
- 出栈,恢复现场。
用实例,来对应感受一下。
对应的汇编
可见,套路既是:
5. 压栈,保护当前函数现场。 { PUSH 或者 LDR } sp寄存器,Rx寄存器
6. 跳转,实现函数跳转。{B、BL、BX},对应给PC寄存器赋值
a. 读参数 (出栈【从栈读取】、或者R0、R1)
b. 运算、运行 (ADD等)
c. 返回结果(压栈【从栈保存】,或者R0、R1)
7. 跳转,返回父级函数。{B、BL、BX ,但对应LR}, 对应给PC寄存器赋值
8. 出栈,恢复现场。{POP 或者LDR}, sp寄存器,Rx寄存器
【注意】:
- 跳转前保存下一条指令地址至LR寄存器
不带返回的跳转指令B, 不会保存地址至LR寄存器
带返回的跳转指令BL,会自动保存地址至LR寄存器 - 在子函数不会自动跳回父函数,需要手动将LR寄存器的值赋给PC寄存器才能跳转回来