STM32
登录
直播中
三心四意
8年用户
798经验值
私信
关注
[问答]
Cortex-M3处理器拥有哪些通用寄存器及特殊功能寄存器呢
开启该帖子的消息推送
Cortex-M3
处理器
寄存器
Cortex-M3处理器拥有哪些通用寄存器及特殊功能寄存器呢?分别有哪些呢?
回帖
(1)
甘晓茵
2021-11-25 09:56:29
Cortex-M3系列处理器拥有通用寄存器R0-R15以及一些特殊功能寄存器。R0-R12是最“通用目的”的,但是绝大多数的16位指令只能使用R0-R7(低组寄存器),而32位的Thumb-2指令则可以访问所有通用寄存器。特殊功能寄存器有预定义的功能,而且必须通过专用的指令来访问。
通用目的寄存器R0-R7
R0-R7也称为低组寄存器。所有指令都能访问它们。它们的字长全是32位,复位后的初始值是不可预料的。
通用目的寄存器R8-R12
R8-R12也被称为高组寄存器。这是因为只有很少的16位Thumb指令能访问它们。32位的指令则不受限制。它们也是32位字长的,且复位后的初始值是不可预料的。
堆栈指针R13
R13是堆栈指针。在CM3处理器内核中共有两个堆栈指针,于是也就支持两个堆栈。当引用R13(或写作SP)时,你引用到的是当前正在使用的那一个,另一个必须用特殊的指令来访问(MRS,MSR指令)。这两个堆栈指针分别是:
主堆栈指针(MSP),或写作SP_main。这是缺省的堆栈指针,它由OS内核、异常服务例程以及所有需要特权访问的应用程序代码来使用。
进程堆栈指针(PSP),或写作SP_process.用于常规的应用程序代码(不处于异常服用例程中)。要注意的是,并不是每个应用都必须用齐两个堆栈指针。简单的应用程序只使用MSP就够了。堆栈指针用于访问堆栈,并且PUSH指令和POP指令默认使用SP。
连接寄存器R14
R14是连接寄存器(LR)。在一个汇编程序中,你可以把它写作bothLR和R14。LR用于在调用子程序时存储返回地址。例如,当你在使用BL(分支并连接,Branch and link)指令时,就自动填充LR值。
尽管PC的LSB总是0(因为代码至少是字对齐的),LR的LSB却是可读可写的。这是历史遗留的产物。在以前,由位0来表示ARM/Thumb状态。因为其它有些ARM处理器支持ARM和Thumb状态并存,为了方便汇编程序移植,CM3需要允许LSB可读可写。
程序计数器15
R15是程序计数器,在汇编代码中你也可以使用名字“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系列处理器拥有通用寄存器R0-R15以及一些特殊功能寄存器。R0-R12是最“通用目的”的,但是绝大多数的16位指令只能使用R0-R7(低组寄存器),而32位的Thumb-2指令则可以访问所有通用寄存器。特殊功能寄存器有预定义的功能,而且必须通过专用的指令来访问。
通用目的寄存器R0-R7
R0-R7也称为低组寄存器。所有指令都能访问它们。它们的字长全是32位,复位后的初始值是不可预料的。
通用目的寄存器R8-R12
R8-R12也被称为高组寄存器。这是因为只有很少的16位Thumb指令能访问它们。32位的指令则不受限制。它们也是32位字长的,且复位后的初始值是不可预料的。
堆栈指针R13
R13是堆栈指针。在CM3处理器内核中共有两个堆栈指针,于是也就支持两个堆栈。当引用R13(或写作SP)时,你引用到的是当前正在使用的那一个,另一个必须用特殊的指令来访问(MRS,MSR指令)。这两个堆栈指针分别是:
主堆栈指针(MSP),或写作SP_main。这是缺省的堆栈指针,它由OS内核、异常服务例程以及所有需要特权访问的应用程序代码来使用。
进程堆栈指针(PSP),或写作SP_process.用于常规的应用程序代码(不处于异常服用例程中)。要注意的是,并不是每个应用都必须用齐两个堆栈指针。简单的应用程序只使用MSP就够了。堆栈指针用于访问堆栈,并且PUSH指令和POP指令默认使用SP。
连接寄存器R14
R14是连接寄存器(LR)。在一个汇编程序中,你可以把它写作bothLR和R14。LR用于在调用子程序时存储返回地址。例如,当你在使用BL(分支并连接,Branch and link)指令时,就自动填充LR值。
尽管PC的LSB总是0(因为代码至少是字对齐的),LR的LSB却是可读可写的。这是历史遗留的产物。在以前,由位0来表示ARM/Thumb状态。因为其它有些ARM处理器支持ARM和Thumb状态并存,为了方便汇编程序移植,CM3需要允许LSB可读可写。
程序计数器15
R15是程序计数器,在汇编代码中你也可以使用名字“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异常。
举报
更多回帖
rotate(-90deg);
回复
相关问答
Cortex-M3
处理器
寄存器
STM32的核心
Cortex-M3
处理器
简介
2021-09-23
2719
Cortex-M3
处理器
中的嵌套向量中断控制
器
的特性是什么?
2021-11-05
4947
关于三星2410A
处理器
特殊功能
寄存器
问题
2011-10-02
4044
Cortex-M3
芯片
处理器
主要有哪些应用
呢
2021-11-30
2265
单片机的
特殊功能
寄存器
有哪些?
2022-02-16
1824
Cortex-M
4
处理器
使用的流水线具有哪些特征
2021-10-15
3818
特殊功能
寄存器
为什么要设有地址
呢
2018-10-19
2495
ARM
Cortex
系列
处理器
工作模式下实际访问的
寄存器
有哪些
2022-06-01
5945
51单片机寻址方式的疑问:为什么B
寄存器
在乘除法指令中是
寄存器
寻址?
2019-01-01
3977
STM32的
功能
2021-02-01
1277
发帖
登录/注册
20万+
工程师都在用,
免费
PCB检查工具
无需安装、支持浏览器和手机在线查看、实时共享
查看
点击登录
登录更多精彩功能!
首页
论坛版块
小组
免费开发板试用
ebook
直播
搜索
登录
×
20
完善资料,
赚取积分