Cortex_M3通用寄存器组&特殊功能寄存器功能简介及汇编用法

通用寄存器组:
CM3 拥有通用寄存器 R0-R15 以及一些特殊功能寄存器。 R0-R12 是最“通用目的”的,但是绝大多数的 16 位指令只能使用 R0-R7(低组寄存器),而 32 位的 Thumb-2 指令则可以访问所有通用寄存器。特殊功能寄存器有预定义的功能,而且必须通过专用的指令来访问。
在这里插入图片描述

RO–R12为32位的通用寄存器;
绝大多数的 16 位指令只能使用 R0-R7(低组寄存器),而 32 位的 Thumb-2 指令则可以访问所有通用寄存器。
R0-R7 也被称为低组寄存器。所有指令都能访问它们。它们的字长全是 32 位,复位后的初始值是不可预料的;
R8-R12 也被称为高组寄存器。这是因为只有很少的 16 位 Thumb 指令能访问它们, 32 位的thumb-2 指令则不受限制。它们也是 32 位字长,且复位后的初始值是不可预料的。

R13位堆栈指针寄存器SP,R13有两个堆栈指针,任何时候都只能用到一个;
主堆栈指针(MSP):复位后缺省使用的堆栈指针,用于操作系统内核以及异常处理例程(包括中断服务例程)
进程堆栈指针(PSP):由用户的应用程序代码使用。(堆栈指针的最低两位永远是 0,这意味着堆栈总是 4 字节对齐的。他们的地址必 须是0x4,0x8,0xc,……)
堆栈指针用于访问堆栈,访问堆栈只需要两条指令,PUSH核POP,并且 PUSH 指令和 POP 指令默认使用 SP。通常在进入一个子程序后,第一件事就是把寄存器的值先 PUSH 入堆栈中,在子程序退出前再 POP 曾经 PUSH 的那些寄存器。其汇编语言语法如下例所示;

PUSH {R0}         ; *(--R13)=R0。 R13 是 long*的指针
POP {R0}          ; R0= *R13++

PUSH 和 POP 还能一次操作多个寄存器,如下所示:

subroutine_1
PUSH {R0-R7, R12, R14} ; 保存寄存器列表
…                      ; 执行处理
POP {R0-R7, R12, R14}  ; 恢复寄存器列表
BX R14                 ; 返回到主调函数

R14:连接寄存器LR;
跳转到一个子程序时,由 R14 ,也就是LR寄存器来存储返回地址;其汇编用法如下:

main ;主程序
…
BL function1 ; 使用“分支并连接”指令呼叫 function1
             ; PC= function1,并且 LR=main 的下一条指令地址
…
Function1
…            ; function1 的代码
BX LR        ; 函数返回(如果 function1 要使用 LR,必须在使用前 PUSH,
             ; 否则返回时程序就可能跑飞了——译注)

R15:程序计数寄存器;
也叫PC指针寄存器,用于指向下一条指令的地址,确保程序有序的执行,CM3 内部使用了指令流水线,读 PC 时返回的值是当前指令的地址+4。如:

0x1000: MOV R0, PC ; R0 = 0x1004

特殊功能寄存器–必须通过专用的指令来访问
在这里插入图片描述

状态寄存器xPSR
记录 ALU 标志(0 标志,进位标志,负数标志,溢出标志),执行状态,以及当前正服务的中断号,程序状态寄存器在其内部又被分为三个子状态寄存器:
1.应用程序 PSR(APSR)
2. 中断号 PSR(IPSR)
3. 执行 PSR(EPSR)
通过 MRS/MSR 指令,可对这 3 个 寄存器即可以单独访问,也可以组合访问(2 个组合, 3 个组合都可以)。如下图所示:
在这里插入图片描述

中断屏蔽寄存器
有3个寄存器,分别是PRIMASK, FAULTMASK 和 BASEPRI,用于控制异常的使能和除能,只有在特权级下,才允许访问这 3 个寄存器。
1.PRIMASK
这是个只有单一比特的寄存器。 在它被置 1 后,就关掉所有可屏蔽的异常,只剩下 NMI 和硬 fault 可以响应。它的缺省值是 0,表示没有关中断

2.FAULTMASK
这是个只有 1 个位的寄存器。当它置 1 时,只有 NMI 才能响应,所有其它的异常,甚至是硬 fault,也通通闭嘴。它的缺省值也是 0,表示没有关异常。

3.BASEPRI
这个寄存器最多有 9 位(由表达优先级的位数决定)。它定义了被屏蔽优先级的阈值。当它被设成某个值后,所有优先级号大于等于此值的中断都被关(优先级号越大,优先级越低)。但若被设成 0,则不关闭任何中断, 0 也是缺省值。

要访问 PRIMASK, FAULTMASK 以及 BASEPRI,要使用 MRS/MSR 指令,如下所示:

MRS R0, BASEPRI 	;读取 BASEPRI 到 R0 中
MRS R0, FAULTMASK 	;似上
MRS R0, PRIMASK 	;似上
MSR BASEPRI, R0 	;写入 R0 到 BASEPRI 中
MSR FAULTMASK, R0 	;似上
MSR PRIMASK, R0 	;似上

控制寄存器(CONTROL)
控制寄存器有两个用途,其一用于定义特权级别,其二用于选择当前使用哪个堆栈指针。由两个比特来行使这两个职能

CONTROL[1]–堆栈指针选择:
0=选择主堆栈指针 MSP(复位后的缺省值)
1=选择进程堆栈指针 PSP
在 Cortex-M3 的 handler 模式中,只允许使用 MSP,所以此时不得往该位写 1, CONTROL[1]总是 0。在线程模式中则可以为 0 或 1。

CONTROL[0] :
0=特权级的线程模式
1=用户级的线程模式
仅当在特权级下操作时才允许写该位。一旦进入了用户级,唯一返回特权级的途径,就是触发一个(软)中断,再由服务例程改写(Handler 模式永远都是特权级的)。CONTROL 寄存器也是通过 MRS 和 MSR 指令来操作的:

MRS R0, CONTROL
MSR CONTROL, R0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值