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

相关推荐
weixin_4565881514 分钟前
【java面试day16】mysql-覆盖索引
java·mysql·面试
宫水三叶的刷题日记41 分钟前
真的会玩,钉钉前脚辟谣高管凌晨巡查工位,小编随后深夜发文
前端·后端·面试
叽哥2 小时前
Flutter面试:Dart基础2
flutter·面试·dart
测试老哥3 小时前
pytest+requests+allure自动化测试接入Jenkins学习
自动化测试·软件测试·学习·测试工具·职场和发展·jenkins·pytest
胡gh3 小时前
聊一聊构建工具:Vite和Webpack
面试·webpack·vite
胡gh4 小时前
如何聊懒加载,只说个懒可不行
前端·react.js·面试
汪子熙4 小时前
浏览器里出现 .angular/cache/19.2.6/abap_test/vite/deps 路径究竟说明了什么
前端·javascript·面试
CptW5 小时前
字节面试题:实现任务调度器(Scheduler)
面试·typescript
Process5 小时前
面试官:Vue和React源码里用到了哪些设计模式?
前端·javascript·面试