嵌软面试——ARM Cortex-M寄存器组

Cortex-M内存架构包含16个通用寄存器,其中R0-R12是13个32位的通用寄存器,另外三个寄存器是特殊用途,分别是R13(栈指针),R14(链接寄存器),R15(程序计数器)。

对于处理器来说,寄存器可以作为暂存器,存储临时结果,也可以作为输入数据,方便运算,也可以作为索引,去访问寄存器,其作用各种各样。

其中R0-R7是低寄存器,因为16位的指令只能访问他们,而R8-R12是高寄存器,可以被16或32位指令访问,需要注意的的是,这些通用寄存器在复位后初始值是未定义的,所以在初始前,必须由程序显式初始化,也可以编写汇编代码嵌入代码段。

R13寄存器------ SP栈指针

它是ARM处理器中最重要的专用寄存器之一,负责管理函数调用和局部变量的内存分配。

我们通常通过PUSH和POP指令访问栈空间,实现局部变量保存,函数返回地址等信息的管理,从物理机构看,ARM-Cortex-M系列寄存器实际上拥有两个栈指针,主栈指针 MSP (Main Stack Pointer )和进程指针 PSP(Process Stack Pointer

  1. MSP (Main Stack Pointer,主栈指针)

    • 用于操作系统内核和异常处理

    • 所有异常模式默认使用MSP

  2. PSP (Process Stack Pointer,进程栈指针)

    • 用于用户应用程序

    • 在用户线程模式下使用

R14------ LR链接寄存器

它用于保存函数或者子程序调用返回的地址

在函数或子程序被调用时,调用指令下一条指令的地址被保存到LR寄存器中,这样,当函数或子程序结束时,处理器可以通过LR寄存器中的值返回到正确的地址继续执行。

如果函数中调用了函数呢?A函数调用了B函数,B函数还调用了C函数,这时候LR的值会被覆盖,从而无法再恢复到A函数中继续运行,所以需要将LR的数值保存到栈中,包括异常处理也是由LR寄存器负责异常处理时的地址返回

为什么不能依赖 LR 本身?

  • LR 只有一个 ,但函数调用可以 无限嵌套 ,必须用栈存储 调用链

  • 异常/中断可能在任何时候发生,必须保证 LR 不被意外覆盖。

  • 递归函数 必须保存 LR,否则无法正确返回。

R15------PC程序计数器

该寄存器的值永远是下一个执行指令的地址,在ARM架构中,CPU的执行指令包括 取指(Fetch)、译码(Decode)和执行(Execute)三个阶段,PC在其中承担关键作用,它决定了从哪里取指,控制程序的顺序流转,异常处理和函数跳转都和PC指针息息相关,

相关推荐
拉不动的猪32 分钟前
闭包实际项目中应用场景有哪些举例
前端·javascript·面试
Fox爱分享1 小时前
腾讯面试:都知道0.1+0.2≠0.3,为啥 0.1+0.1 却等于 0.2?
面试
爱coding的橙子2 小时前
每日算法刷题Day81:10.29:leetcode 回溯5道题,用时2h
算法·leetcode·职场和发展
电鱼智能的电小鱼2 小时前
基于电鱼 ARM 工控机的井下设备运行状态监测方案——实时采集电机、电泵、皮带机等关键设备运行数据
arm开发·人工智能·嵌入式硬件·深度学习·机器学习·制造
wanhengidc4 小时前
服务器在企业中的作用与价值
运维·服务器·arm开发·安全·智能手机·玩游戏
AronTing4 小时前
2025阿里P6 Java后端面试全攻略:八大模块深度解析
后端·面试
Swift社区5 小时前
LeetCode 410 - 分割数组的最大值
算法·leetcode·职场和发展
2501_938782096 小时前
《Express 面试高频错题集:容易踩坑的 Node.js 后端问题解析》
面试·node.js·express
小高0077 小时前
从npm run build到线上部署:前端人必会的CI/CD套路
前端·javascript·面试
沐怡旸7 小时前
【Android】Dalvik 对比 ART
android·面试