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

相关推荐
爱分享的程序员6 小时前
前端面试专栏-前沿技术:30.跨端开发技术(React Native、Flutter)
前端·javascript·面试
拾光拾趣录7 小时前
前端灵魂拷问:10道题
前端·面试
cui_hao_nan8 小时前
面试刷题平台项目总结
面试
SIKDD9 小时前
arm v3 smmu 图示
arm开发
Github项目推荐10 小时前
Rust生态系统在Web开发中的优势(9754)
面试·github
程序员清风10 小时前
想让AI更强大?MCP协议了解一下!
面试·openai·ai编程
前端拿破轮11 小时前
腾讯面试官:手写一个节流防抖看看
前端·javascript·面试
景籬11 小时前
前端必会知识
前端·面试
小新学习屋12 小时前
《剑指offer》-算法篇-位运算
python·算法·leetcode·职场和发展·数据结构与算法