寄存器r0-r15含义

注意:R11=fp;R12=ip;R13=SP;R14=LR;R15=PC;R0,R1,R2用于传递参数和存放函数返回值。

注意:低地址的寄存器被压入低地址内存中,也就是说如果向下增长,高地址寄存器先压,向上增长测试低地址先压。

注意:根据“ARM-thumb 过程调用标准”:
1. r0-r3 用作传入函数参数,传出函数返回值。在子程序调用之间,可以将 r0-r3 用于任何用途。被调用函数在返回之前不必恢复 r0-r3。---如果调用函数需要再次使用 r0-r3 的内容,则它必须保留这些内容。
2.  r4-r11 被用来存放函数的局部变量。如果被调用函数使用了这些寄存器,它在返回之前必须恢复这些寄存器的值。
3.  r12 是内部调用暂时寄存器 ip。它在过程链接胶合代码(例如,交互操作胶合代码)中用于此角色。在过程调用之间,可以将它用于任何用途。被调用函数在返回之前不必恢复 r12。

4. 寄存器 r13 是栈指针 sp。它不能用于任何其它用途。sp 中存放的值在退出被调用函数时必须与进入时的值相同。
5. 寄存器 r14 是链接寄存器 lr。如果您保存了返回地址,则可以在调用之间将 r14 用于其它用途,程序返回时要恢复

6. 寄存器 r15 是程序计数器 PC。它不能用于任何其它用途。pc :总是包含下一个要被执行的指令的位置。

lr   :(总是)包含着退出时要装载到 pc 中的值。在 26-bit 位代码中它还包含着 PSR。 
sp  :指向当前的栈块(chunk)限制,或它的上面。这是用于复制临时数据、寄存器和类似的东西到其中的地方。在 RISC OS 下,你有可选择的至少 256 字节来扩展它。 
fp 要么是零,要么指向回溯结构的最当前的部分。

M3内核基本结构

  • Cortex-M3内核是32位的
  • M3F103内核采用Thumb-2指令集
  • 支持16/32位指令混合编码
  • 内核模式分为handler(管理者)和thread(线程)模式。handler运行在特权级下,thread可运行在特权级下和用户级下
  • 操作权限分两个等级:特权级和用户级,处理器复位后自动进入thread模式下的特权级,这时候程序具有全部权限,处理器配置完毕后自动进入thread的用户级,放弃对重要处理器的配置权限。当进入中断时,自动切换到handler级。通过control寄存器的第0位可以切换特权级
  • 内核有18个寄存器,R0-R12、R13为SP寄存器、R14为LR寄存器、R15为PC寄存器、XPSR寄存器

R0-R12作为通用寄存器,这些通用寄存器用来存放临时数据,R0-R3在程序调用时可以用来传递函数参数和返回值,R12在某些情况下可以用来 保存子程序的中间值

SP是栈寄存器,用来指示当前栈的位置。在M3中有两个SP寄存器分别为MSP和PSP。MSP为缺省的栈指针,handler模式只能用MSP,thread模式可以使用MSP和PSP。注意任何时刻只有一个SP起作用,可简单的只使用MSP。

LR是链接寄存器,用来保存跳转后返回的地址。当发生函数调用时,LR寄存器中保存着函数返回后需要执行的指令地址。LR对普通函数调用时存储调用函数后的返回地址,但在中断发生时发生了变化。
当中断发生时,硬件自动存储R0-R3,R12,LR,PC,XPSR这8个寄存器,中断返回时自动恢复这8个寄存器。中断发生时将这8个寄存器压入PSP/MSP栈,进入中断服务程序后,硬件会自动将一个特殊的值EXC_RETURN而不是返回地址存入LR中,EXC_RETURN只有三个值,0xFFFFFFF1表示中断服务程序返回handler模式且使用MSP,0xFFFFFFF9表示中断服务函数返回thread模式且使用MSP,0XFFFFFFFD表示中断服务函数返回thread模式且使用PSP。
中断时由于LR不保存返回地址,所以根据栈中的PC值(下条指令地址)来寻找入口。
可以理解为M3内核机制进行了一个二级跳,先将8个寄存器数值压入栈中,再将代表中断返回所使用的工作模式以及栈寄存器的EXC_RETURN值存入LR中,中断退出时跳转到EXC_RETURN值,并从栈中取出8个寄存器值,这样就不仅找到了返回地址,又可以找到中断前的工作状态和栈指针。

PC寄存器存储的是当前所执行指令所在的地址。处理器通过PC寄存器找到其需要执行的指令,更改PC寄存器就会发生指令跳转。

XPSR--状态寄存器,这个状态寄存器由多个寄存器复合而成。APSR存放着程序的状态,IPSR存放着中断号,EPSR存放着执行程序的状态。

STM32F103处理器运行的程序完全由这18个寄存器控制,操作系统通过备份、还原更改寄存器来控制程序执行流程,实现任务切换。

栈寄存器R0-R15相关推荐

  1. Cortex-A7 MPCore 架构详细介绍(九种运行模式、内核寄存器组R0~R15,有特定的名字和功能)

    目录 0.ARM架构的历史简介 1.Cortex-A7 MPCore(即多核) 简介 2.Cortex-A 处理器九种运行模式 3.Cortex-A 寄存器组(内核寄存器) 3.1通用寄存器 3.1. ...

  2. 汇编中浮点栈寄存器st0~st7浮点计算fld压栈再计算的过程运行原理

    目录 为什么浮点数不能用普通的数学指令计算 结论 用普通的数学计算add无法实现浮点数加法.必须使用浮点数计算指令fadd来进行浮点数加法计算. fpu的概念 浮点数计算需要先用fld指令压栈用fld ...

  3. Cortex-M3 R0~R15寄存器组

    [R0~R12通用寄存器] R0~R12都是32位通用寄存器,用于数据操作.其中: R0~R7为低组寄存器,所有的指令都可以访问. R8~R12为高组寄存器,只有32位Thumb2指令和很少的16位T ...

  4. 寄存器(R0~R16)以及从SysTick系统时钟理解RTOS移植初始化

    移植系统最重要的细节之一就是配置系统时钟 第一次玩RT-Thread,发现同样的程序逻辑,测试现象不一样,从现象很明显看出来是时钟频率配置不一样. 由于之前玩STM32几乎没有关注过系统时钟的初始化, ...

  5. 编译器和出栈压栈寄存器对printf参数输出的不同影响

    链接:https://www.nowcoder.com/questionTerminal/c64aadd25ceb4789bfd404819704855d 来源:牛客网 题目的写法事实上是有严重安全隐 ...

  6. 51单片机的工作寄存器R0~R7位于内部RAM什么位置

    转自:https://zhidao.baidu.com/question/1495509806096353459.html 51单片机的工作寄存器一共有32个,为RAM中的00H--1FH单元,分为4 ...

  7. ARM 寄存器 详解

    From( ARM 寄存器详解 ):https://blog.csdn.net/sandeldeng/article/details/52954781 ARM 汇编基础教程:2.数据类型和寄存器:ht ...

  8. 鸿蒙系统源代码解析,鸿蒙内核源码分析(系统调用篇) | 图解系统调用全貌

    本篇说清楚系统调用 读本篇之前建议先读鸿蒙内核源码分析(总目录)工作模式篇. 本篇通过一张图和七段代码详细说明系统调用的整个过程,代码一捅到底,直到汇编层再也捅不下去. 先看图,这里的模式可以理解为空 ...

  9. arm汇编总结---让汇编不再神秘

    一.指令格式 <opcode>{<cond>}{S}     {Rd},    {Rn},   {shifer_operand} <opcode>:    指令操作 ...

最新文章

  1. c语言函数传参时候的类型强制装换
  2. 量子位MEET大会报名开启!各领域头部玩家集结,AI年度榜单揭晓,在这里预见智能科技新未来...
  3. c语言案例——输入一个字符串,将其逆序输出
  4. 易语言开发c s,Grid++Report报表工具C/S实战项目演练
  5. 图模型(graphical model, GM)的表示
  6. 安卓SQLiteOpenHelper使用说明
  7. JavaEE目标及企业应用和互联网应用区别
  8. NoSuchMethodError 发生原因和解决办法
  9. java 桥接模式_JAVA设计模式之【桥接模式】
  10. django11:自动序列化/批量插入数据/分页器
  11. EditPlus3 添加 PHP代码格式化
  12. Java的堆与栈,科普给大家
  13. android 里程,鹰眼Android SDK | 百度地图API SDK
  14. 傲游浏览器语言怎么切换 傲游浏览器语言切换方法简述
  15. C++新特性探究(十六):move constructor移动构造
  16. 详解用backgroundImage解决图片轮播切换
  17. Flutter实战一Flutter聊天应用(八)
  18. 江苏计算机等级考试二级office题库,2020年江苏省计算机二级Office考试易考套餐:二级MS Office高级应用全程班(网课+题库)...
  19. php 翻转180度,如何翻转视频—将视频翻转90或180度
  20. MySQL数据库创建表

热门文章

  1. k8s学习(九) 使用metrics-server 进行hpa扩容
  2. 致远小场景方案之表单获取ERP基础档案数据
  3. 吉安娜的远征下载地址(免费)
  4. 10年IT老兵个人工作感悟
  5. C# ??(问问,问号问号)运算符,可空值(申明加?(问号))的克星
  6. steam插件_教程丨Steam游戏历史价格信息查询,冬季特卖更省钱
  7. EZ-USB 68013在WIN7 64位下驱动识别方法
  8. 主题:论浪漫主义时期的音乐
  9. ES6 rest参数,扩展运算符,Symbol数据类型,迭代器和生成器 【详解加案例 】(二)
  10. Vue 2.x 常用知识点笔记(万字笔记)