1.寄存器组
CM3 拥有通用寄存器 R0‐R15 以及一些特殊功能寄存器。 R0‐R12 是最“通 用目的” 的, 但是绝大多数的 16 位指令只能使用 R0‐R7(低组寄存器),而 32 位的 Thumb‐2指令则可以访问所有通用寄存器。 特殊功能寄存器有预定义的功能, 而且必须通过专用的指令来访问。M4只比M3多了一个浮点运算单元FPU.
通用目的寄存器 R0-R7: R0‐R7 也被称为低组寄存器。所有指令都能访问它们。它们的字长全是 32 位,复位后的初始值是不可预料的。
通用目的寄存器 R8-R12: R8‐R12 也被称为高组寄存器。这是因为只有很少的 16 位 Thumb 指令能访问它们, 32位的指令则不受限制。它们也是 32 位字长,且复位后的初始值是不可预料的。
堆栈指针 R13: R13 是堆栈指针。在 CM3 /4处理器内核中共有两个堆栈指针,于是也就支持两个堆栈。当引用 R13(或写作 SP)时,你引用到的是当前正在使用的那一个,另一个必须用特殊的指令来访问( MRS,MSR 指令)。 主堆栈指针(MSP),或写作 SP_main。这是缺省的堆栈指针,它由 OS 内核、异常服务例程以及所有需要特权访问的应用程序代码来使用。
进程堆栈指针(PSP),或写作 SP_process。用于常规的应用程序代码
并不是每个应用都必须用齐两个堆栈指针。简单的应用程序只使用 MSP就够了。堆栈指针用于访问堆栈,并且 PUSH 指令和 POP 指令默认使用 SP。 汇编指令:(向下生长的满栈) 与数据结构里面的栈不同)
PUSH {R0} ; *(--R13)=R0。 R13 是 long*的指针
POP {R0} ; R0= *R13++
连接寄存器 R14: R14 是连接寄存器( LR)。在一个汇编程序中,你可以把它写作 both LR 和 R14。 LR 用于在调用子程序时存储返回地址。例如,当你在使用 BL(分支并连接, Branch and Link)指令时,就自动填充 LR 的值。
程序计数器 R15 R15 是程序计数器,在汇编代码中你也可以使用名字“PC”来访问它。因为 CM3 内部使用了指令流水线,读 PC 时返回的值是当前指令的地址+4。
0x1000: MOV R0, PC ; R0 = 0x1004
特殊功能寄存器组 它们只能被专用的 MSR 和 MRS 指令访问,而且它们也没有存储器地址
程序状态寄存器(PSRs 或曰 PSR): 程序状态寄存器在其内部又被分为三个子状态寄存器:
应用程序 PSR( APSR)
中断号 PSR( IPSR)
执行 PSR( EPSR)
中断屏蔽寄存器组( PRIMASK, FAULTMASK,以及 BASEPRI) PRIMASK 和 BASEPRI 对于暂时关闭中断是非常重要的。而FAULTMASK 则可以被 OS 用于暂时关闭 fault 处理机能
快速关中断指令:
CPSID I ;PRIMASK=1, ;关中断
CPSIE I ;PRIMASK=0, ;开中断
CPSID F ;FAULTMASK=1, ;关异常
CPSIE F ;FAULTMASK=0 ;开异常
控制寄存器( CONTROL)
控制寄存器用于定义特权级别,还用于选择当前使用哪个堆栈指针 M4:
2.操作模式 Cortex‐M3/4 支持 2 个模式和两个特权等级。
修改模式:CONTROL[ 0]只有在特权级下才能访问。用户级的程序如想进入特权级,通常都是使用一条“系统服务呼叫指令( SVC)”来触发“SVC 异常”,该异常的服务例程可以选择修改CONTROL[0]
3.FPU浮点单元 在M4中有一个可选的单精度FPU单元,如果使能了FPU单元就可以使用它来对单精度浮点数进行计算,双精度浮点数的运算仍要使用到C运行库