通用寄存器组:
CM3有通用寄存器R0-R15和几个特殊功能寄存器。 R0-R12是最“通用目的”,但大多数16位指令只能使用R0-R7 (低位存储体寄存器),32位Thumb-2指令可以访问所有通用寄存器。 特殊功能寄存器中有预先定义的功能,必须通过专用指令访问。
ROR12为32位的通用寄存器;
大多数16位指令只能使用R0-R7 (低位存储区寄存器),但32位Thumb-2指令可以访问所有通用寄存器。
R0-R7也称为行组寄存器。 所有命令都可以访问。 这些字长都是32位,复位后的初始值无法预料;
R8-R12也称为高组寄存器。 这是因为只有16位Thumb指令可以访问,32位thumb-2指令不受限制。 这些也是32位的字长,无法预料复位后的初始值。
R13位堆栈指针寄存器SP,R13上有两个堆栈指针,随时只能使用一个
在异常处理例程(包括主堆栈指针(MSP )操作系统内核和中断服务例程)中使用的重置后默认堆栈指针
流程堆栈指针(PSP ) :用于用户的APP应用程序代码。 (堆栈指针的最低两位始终为0。 也就是说,堆栈总是以4字节对齐。 他们的地址必须是0x 4,0x 8,0xc,……)
堆栈指针用于访问堆栈,访问堆栈需要两个指令,推送核心POP,推送和POP指令默认使用SP。 通常,在进入子程序之后,第一件事是首先将寄存器的值推送至堆栈,并在子程序结束之前对推送的寄存器进行POP。 其汇编语言语法如下例所示;
推送{ r0 }; *--R13(=R0。 R13是长*的指针POP {R0}; R0=*R13 PUSH和POP也可以一次操作多个寄存器,如下所示。
subroutine_1PUSH {R0-R7,R12,R14}; 寄存器清单的保存…; 执行处理POP {R0-R7、R12、R14}; 恢复寄存器列表BX R14; 主调函数R14:连接寄存器LR;
当跳至子程序时,R14、即LR寄存器存储返回地址; 组件的使用方法如下
主要; 主程序…BL function1; 使用“分支并连接”命令调用function1; PC=function1且LR=main的下一个指令地址…Function1…; 函数1的代码BX LR; 函数返回(function1要使用LR,必须在使用前推送; 否则程序为——译注(R15:程序计数寄存器;
也称为PC指针寄存器,用于指向以下指令的地址,确保程序有序运行: CM3内部使用指令流水线,读取PC时返回的值为当前指令的地址4。 例如:
0x1000: MOV R0,PC; R0=0x1004 特殊功能寄存器必须通过专用的指令来访问
状态寄存器xPSR
记录ALU标志(0标志、进位标志、负标志、溢出标志)、执行状态以及当前服务的中断号,程序状态寄存器在其内部又分为三个子状态寄存器。
1.APP应用程序PSR(apsr ) )。
2 .中断号码PSR(ipsr ) )。
3 .执行3.PSR(epsr )
儒家黄蜂/MSR指令允许单独访问或组合访问这三个寄存器(也可以是两个组合、三个组合)。 如下图所示。
中断屏蔽寄存器
有PRIMASK、FAULTMASK和BASEPRI三个寄存器,用于控制异常的使能和禁用,仅在特权级别允许访问这三个寄存器。
1.PRIMASK
这是一个单位寄存器。 将其设置为1后,将消除所有可屏蔽的异常,只有NMI和硬件故障才能响应。 的默认值为0,表示没有中断
2 .故障掩码
这是一个只有1位的寄存器。 当它是1的时候,只有NMI能响应,其他所有的异常,甚至硬故障,都保持沉默。 默认值也为0,表示没有异常。
3 .基本pri
这个寄存器最多有9位。 由表示优先顺序的位数决定。 定义屏蔽优先级阈值。 如果设置为值,则关闭优先级编号大于或等于此值的所有中断。 优先级编号越大,优先级越低。 但是,如果设置为0,则不关闭任何中断,0也是默认值。
要访问PRIMASK、FAULTMASK和BASEPRI,请按如下方式使用儒家黄蜂/MSR命令:
儒教黄蜂R0,BASEPRI; 从BASEPRI到R0读取儒教的黄蜂R0,FAULTMASK; 儒雅般的黄蜂R0,PRIMASK; 上MSR BASEPRI,R0; 从R0向BASEPRI写入MSR故障掩码,R0; 上MSR PRIMASK,R0; 上控制寄存器(CONTROL)
控制寄存器有两种用途,一种用于定义权限级别,另一种用于选择当前使用哪个堆栈指针。 两个位行使这两个功能
控制[1]选择堆栈指针:
0=选择主堆栈指针MSP (复位后的默认值)
1=选择进程堆栈指针PSP
在Cortex-M3的处理程序模式下,只允许MSP,因此在这种情况下,不能在此位中写1。 控制[1]始终为0。 在线程模式下可以是0或1。
控制[0] :
0=特权级别线程模式
1=用户级线程模式
只有在特权级别操作时才允许写入此位。 一旦进入用户级别,返回特权级别的唯一方法是触发“软”中断并通过服务例程进行重写。 Handler模式始终是特权级别。 控制寄存器也由儒家黄蜂和MSR指令操作:
儒家黄蜂R0、控制MSR控制、R0