嵌软面试——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指针息息相关,

相关推荐
Lee川20 小时前
从异步迷雾到优雅流程:JavaScript异步编程与内存管理的现代化之旅
javascript·面试
晴殇i1 天前
揭秘JavaScript中那些“不冒泡”的DOM事件
前端·javascript·面试
绝无仅有1 天前
Redis过期删除与内存淘汰策略详解
后端·面试·架构
绝无仅有1 天前
Redis大Key问题排查与解决方案全解析
后端·面试·架构
AAA梅狸猫1 天前
Looper.loop() 循环机制
面试
AAA梅狸猫1 天前
Handler基本概念
面试
Wect1 天前
浏览器缓存机制
前端·面试·浏览器
掘金安东尼1 天前
Fun with TypeScript Generics:玩转 TS 泛型
前端·javascript·面试
掘金安东尼1 天前
Next.js 企业级落地
前端·javascript·面试
掘金安东尼1 天前
React 性能优化完全指南 2026
前端·javascript·面试