Cortex-M3-寄存器

  • Cortex‐M3 处理器拥有 R0‐R15 的寄存器组。其中 R13 作为堆栈指针 SP。SP 有两个,但在同一时刻只能有一个可以看到,这也就是所谓的“banked”寄存器。

寄存器组

R0-R12:通用寄存器 

  • R0‐R12 都是 32 位通用寄存器,用于数据操作。但是注意:绝大多数 16 位 Thumb 指令只能访问 R0‐R7,而 32 位 Thumb‐2 指令可以访问所有寄存器。

Banked R13: 两个堆栈指针

  • Cortex‐M3 拥有两个堆栈指针,然而它们是 banked,因此任一时刻只能使用其中的一个。
  • 主堆栈指针(MSP):复位后缺省使用的堆栈指针,用于操作系统内核以及异常处理例程(包括中断服务例程)
  • 进程堆栈指针(PSP):由用户的应用程序代码使用。
  • 堆栈指针的最低两位永远是 0,这意味着堆栈总是 4 字节对齐的。
  • 要注意的是,并不是每个应用都必须用齐两个堆栈指针。简单的应用程序只使用 MSP就够了。堆栈指针用于访问堆栈,并且 PUSH 指令和 POP 指令默认使用 SP。
  • 在 ARM 编程领域中,凡是打断程序顺序执行的事件,都被称为异常(exception)。除了外部中断外,当有指令执行了“非法操作”,或者访问被禁的内存区间,因各种错误产生的 fault,以及不可屏蔽中断发生时,都会打断程序的执行,这些情况统称为异常。在不严格的上下文中,异常与中断也可以混用。另外,程序代码也可以主动请求进入异常状态的(常用于系统用)。

R14:连接寄存器

  • 当呼叫一个子程序时,由 R14 存储返回地址
  • R14 是连接寄存器(LR)。在一个汇编程序中,你可以把它写作 both LR 和 R14。LR 用于在调用子程序时存储返回地址。例如,当你在使用 BL(分支并连接,Branch and Link)指令时,就自动填充 LR 的值。

  • 尽管 PC 的 LSB 总是 0(因为代码至少是字对齐的),LR 的 LSB 却是可读可写的。这是历史遗留的产物。在以前,由位 0 来指示 ARM/Thumb 状态。因为其它有些 ARM 处理器支持ARM 和 Thumb 状态并存,为了方便汇编程序移植,CM3 需要允许 LSB 可读可写
  • 不像大多数其它处理器,ARM 为了减少访问内存的次数(访问内存的操作往往要 3 个以上指令周期,带 MMU和 cache 的就更加不确定了),把返回地址直接存储在寄存器中。这样足以使很多只有 1 级子程序调用的代码无需访问内存(堆栈内存),从而提高了子程序调用的效率。如果多于 1 级,则需要把前一级的 R14 值压到堆栈里。在 ARM上编程时,应尽量只使用寄存器保存中间结果,迫不得以时才访问内存。在 RISC 处理器中,为了强调访内操作越过了处理器的界线,并且带来了对性能的不利影响,给它取了一个专业的术语:溅出。

R15:程序计数寄存器,也就是PC指针

  • 指向当前的程序地址。如果修改它的值,就能改变程序的执行流。
  • 在汇编代码中你也可以使用名字“PC”来访问它。因为 CM3 内部使用了指令流水线,读 PC 时返回的值是当前指令的地址+4。比如说:
  • 0x1000:  MOV R0, PC ; R0 = 0x1004
  • 如果向 PC 中写数据,就会引起一次程序的分支(但是不更新 LR 寄存器) )。CM3 中的指令至少是半字对齐的,所以 PC 的 LSB 总是读回 0。然而,在分支时,无论是直接写 PC 的值还是使用分支指令,都必须保证加载到 PC 的数值是奇数(即 LSB=1),用以表明这是在Thumb 状态下执行。倘若写了 0,则视为企图转入 ARM 模式,CM3 将产生一个 fault 异常。

特殊功能寄存器

  • Cortex‐M3 还在内核水平上搭载了若干特殊功能寄存器,包括程序状态字。
  • 寄存器组(PSRs)。
  • 中断屏蔽寄存器组(PRIMASK, FAULTMASK, BASEPRI)。
  • 控制寄存器(CONTROL)。

特殊寄存器

注:

  • MSB是Most Significant Bit的缩写,指最高有效位;
  • LSB是least significant bit的缩写,指最低有效位;

拓展:关于R15,PC指针描述

  • 不管是ARM状态还是Thumb状态,至少都是半字对齐,ARM状态是字对齐.
  • 区别在于寻址之后,对程序指针 PC,也就是R15的处理,Thumb状态的寻址之后,PC值尾位自己置1.ARM状态尾位不动.
  • 而Thumb2指令集,也是如此,Thumb2编译出的函数,地址是半字对齐的,也可能是字对齐,即同时兼容了前ARM内核的状态,但是,不过是半字对齐还是字对齐,都将PC尾位置1.
  • 所以,你一定是读取了PC的值,如果你直接读取函数的地址,不可能出现函数在奇数的情况.

Cortex-M3-寄存器相关推荐

  1. Cortex M3寄存器组

    寄存器组 宗旨:技术的学习是有限的,分享的精神是无限的. 1.通用目的寄存器R0~R7 R0-R7 也被称为低组寄存器.所有指令都能访问它们.它们的字长全是 32 位,复位后的初始值是不可预料的. 2 ...

  2. Cortex M3 NVIC与中断控制

    Cortex M3 NVIC与中断控制 宗旨:技术的学习是有限的,分享的精神是无限的. 一.NVIC概览 --嵌套中断向量表控制器 NVIC 的寄存器以存储器映射的方式来访问,除了包含控制寄存器和中断 ...

  3. cortex m3的操作模式和状态

    1.操作状态(operation state): debug state:处理器在调试器发起halt或匹配到断点时,会进入debug state并停止执行指令. thumb state:处理器正在运行 ...

  4. Cortex、ARMv8、arm架构、ARM指令集、soc?Cortex A8、A9都是ARMv7a 架构;Cortex M3、M4是ARMv7m架构;前者是处理器(内核)后者是指令集的架构(架构)

    架构组成元素的指令集状态或者语法thumb指令集与arm指令集的区别例如thumb指令集是什么_thumb指令集与arm指令集的区别以及thumb-2的关系在下一文中介绍,本文暂时不讨论 有粉丝问我到 ...

  5. Cortex‐M3的Faults异常究竟是什么?

    关注+星标公众号,不错过精彩内容 作者 | strongerHuang 微信公众号 | strongerHuang 有许多朋友在学习,或者开发STM32时都遇到过HardFault_Handler的情 ...

  6. Cortex‐M3和Cortex‐M0是否都能位带操作

    最近在进行stm32l011f4的编程,想到stm32有位带操作,便想试一试,但是事与愿违,先贴下位带操作代码 Cortex‐M0的位带操作代码 //IO输出方向设置 #define SDA_IN() ...

  7. Cortex M3内核架构

    CortexM3内核架构 宗旨:技术的学习是有限的,分享的精神是无限的. 1.ARMCortex-M3处理器 Cortex-M3处理器内核是单片机的中央处理单元( CPU). 完整的基于CM3的MCU ...

  8. Cortex M3 Bit-banding简介

    http://blog.csdn.net/shevsten/article/details/7676397 Cortex M3 Bit-banding简介 分类: ARM MCU2012-06-19 ...

  9. cortex m3 开源_开源增强现实耳机,Steam的125M有效帐户等

    cortex m3 开源 您好,开放游戏迷! 在本周的版本中,我们将了解Steam的1.25亿活跃帐户和Game Developers Conference,这是一个开源增强现实头戴设备,Linux游 ...

  10. Cortex M3处理器工作模式及中断过程

    来自::http://blog.csdn.net/ffgamelife/article/details/6947300 1.      工作模式 线程模式(Thread mode):处理器复位或异常退 ...

最新文章

  1. Linux系统下的Nginx的缓存设置、压缩配置和自动列目录配置
  2. flirtlib 测试过程
  3. Programming Computer Vision with Python (学习笔记六)
  4. php mysql 条件查询语句_where 查询条件-Medoo - 高效的轻量级PHP数据库框架, 提高开发效率!...
  5. 圆形渐变shader_Flutter 中渐变的高级用法
  6. 云安全的新战场上,要靠什么来抵御威胁
  7. 英特尔推出业界领先的AI与数据分析平台,全新处理器、内存、存储、FPGA解决方案集体亮相
  8. 如何数分钟创建并成功运行数千台云主机?
  9. android UDP通信
  10. java处理excel的读写
  11. Glide的图像centerCrop处理-长短边适配
  12. python建模概述
  13. 苹果内核H5网页漫画小说系统源码+支持对接公众号
  14. linux下golang protoc安装详细教程
  15. 一杯咖啡带你读懂状态机
  16. Tmux(-yank,-cssh,-xpanes)使用指南
  17. 程序设计思维与实践 Week15 实验
  18. CPU卡PSAM卡 响应指令
  19. TIA WinCC Professional入门经典(2) 创建画面与联合仿真
  20. Java编程序哥德巴赫猜想

热门文章

  1. Qt官方开发环境生成的exe发布方式--使用windeployqt
  2. Using join buffer (Batched Key Access)
  3. mysql安装完成后登入错误
  4. vmware Failed to initialize remote display subsystem
  5. python学习笔记——类
  6. 批处理判断文件夹是否存在
  7. Spring AOP 本质(3)
  8. “脚踢各大Python Web框架”,Sanic真有这能耐么?
  9. iis8.5 php mysql_Win2012 R2 IIS8.5+PHP(FastCGI)+MySQL运行环境搭建教程
  10. mysql增删改查 工具类_Hibernate增删改查数据库之二工具类