0、前言:
- 现在探究一种新的学习方式,arm阶段知识量太大了,就以问题为导向,建立 基础概念库 针对某个问题,向其中添加内容;
基础概念库:
1、异常向量表
- 异常发生后,CPU会跳转到异常模式下所对应的指令处执行异常模式下的指令。
- 异常向量表:所有的CPU都有异常向量表,这是CPU设计时就设定好的,是硬件决定的。当异常发生时,CPU会自动跳转到异常向量表中对应的异常代码地址处执行代码,异常向量表是硬件向软件提供的处理异常的支持。
- 异常向量表本质 上就是一段特定的内存地址空间,大小固定,ARM中每种异常对应该内存空间中的某个特定的内存地址(4Byte),正好是一条32位指令的长度,当异常发生时,CPU将PC(R15)强制设置为当前异常对应的固定内存地址。
2、ARM异常处理机制
- 拷贝CPSR到SPSR;
- 设置适当的CPSR位;
- 保存返回地址LR,将PC设置为相应的异常向量表地址;
- 返回时,从SPSR恢复CPSR,从LR恢复PC,恢复通用寄存器;
3、在汇编中调用c语言程序 & 《案例1》:
C 语言函数被汇编调用时,参数传递必须遵循统一规则(否则 C 函数无法正确识别参数),核心规则:
- 前 4 个参数:通过寄存器 r0 ~ r3 传递(依次对应函数的第 1 ~ 4 个参数);
- 超过 4 个的参数:通过栈(Stack) 传递(第 5 个及以后的参数,按顺序压入栈中);
- 返回值:通过 r0 寄存器返回给调用者。
C 函数执行时必须依赖栈(Stack)完成 3 件事:
- 保存函数调用的返回地址(lr寄存器,避免嵌套调用覆盖);
- 存储局部变量(如果 C 函数有局部变量,会在栈上分配空间);
- 传递超过 4 个的参数,用push指令把需要用到的存放参数的寄存器压栈;
4、在c语言程序中调用汇编 & 《案例2》:
ARM 处理器内核的寄存器介绍:
- 在keil中如下图所示:

- 这些寄存器属于ARM 处理器的内核(CPU 核心),是处理器内部用于临时存储数据和控制执行流程的硬件单元。
- 通用寄存器(R0~R12):用于临时存储数据、地址、函数参数、返回值等,是程序运行中最常使用的寄存器,支持算术运算、逻辑运算、数据传输等操作。R0 ~ R3:常用于 ** 函数参数传递(前 4 个参数)** 和返回值存储(R0);R4~R11:通用数据寄存器,可自由用于各种数据存;R12:常用于函数调用时的临时存储(