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

相关推荐
smileNicky9 小时前
面试高频:MySQL Binlog 的三种模式
mysql·面试·职场和发展
_深海凉_9 小时前
LeetCode热题100-括号生成
算法·leetcode·职场和发展
AI人工智能+电脑小能手9 小时前
【大白话说Java面试题 第41题】【JVM篇】第1题:JVM由哪些部分组成?
java·开发语言·jvm·后端·面试
Lee川16 小时前
面试通关:JWT 认证与双 Token 机制深度解析
后端·面试
kyriewen18 小时前
你还在手动敲命令部署?GitHub Actions 让你 push 即上线,摸鱼时间翻倍
前端·面试·github
怕浪猫18 小时前
荒岛原始无工业、无电力、无设备,从零搭建最基础计算机体系
人工智能·设计模式·面试
米粒11 天前
力扣算法刷题 Day 64 Floyd算法 & A* 算法 & 总结篇
算法·leetcode·职场和发展
青山师1 天前
动态代理深度解析:JDK与CGLIB底层实现与实战
java·设计模式·面试·动态代理·java面试·cglib
MonkeyKing71551 天前
iOS 开发 ARC 与 MRC 底层原理及区别
ios·面试
盏灯1 天前
以前有一个同事说:最讨厌下班提需求又没电脑在身边...
前端·后端·面试