寄存器地址和功能码:DIYOS-
寄存器地址和功能码:DIYOS-R13 堆栈指针,而在CM3 中R13 却是指向两个空间。R13 SP 指针介绍第二组:通用目的寄存器 R8 - R12高组寄存器。有很少的16位Thumb指令能访问,32位指令都可以访问。字长是32位,复位初始值不定。对于通用寄存器,其实用起来还是比较简单的。而我们真正想去关注的还是 R13 - R15 寄存器。因为这几个寄存器是有复用功能的。R13 SP 指针、R14 LR 寄存器 、R15 PC 指针。好了,详细说一下。
这一节我们来介绍通用寄存器,通用寄存器是我们必须用到的寄存器一部分。好了,还是以往的风格,直接上干货。
R0 - R7 R8 - R12 寄存器介绍
第一组:通用目的寄存器 R0 - R7
低组寄存器。所有指令都可以访问,字长是32位,复位的初始值不定。
第二组:通用目的寄存器 R8 - R12
高组寄存器。有很少的16位Thumb指令能访问,32位指令都可以访问。字长是32位,复位初始值不定。
对于通用寄存器,其实用起来还是比较简单的。而我们真正想去关注的还是 R13 - R15 寄存器。因为这几个寄存器是有复用功能的。R13 SP 指针、R14 LR 寄存器 、R15 PC 指针。好了,详细说一下。
R13 SP 指针介绍
R13 堆栈指针,而在CM3 中R13 却是指向两个空间。
第一个:主堆栈指针(MSP) 用于:OS 内核、异常服务、特权访问的应用程序使用。
第二个:进程堆栈指针(PSP) 用于:常规的应用程序代码
访问此寄存器的指令是(MRS MSR)。但是我们也可以不直接对SP 进行访问处理。还有一个方式就是 PUSH 和 POP 。堆栈由一块连续的内存和一个栈顶指针组成。实现先进后出的缓冲区。使用图示如下:
执行PUSH和 POP 操作时,SP 指针会被自动调整。大家看完上面简短的介绍,应该可以想到若是我们使用这个寄存器进行任务切换时应该怎么做了。若是还是不知道,那就当作一个悬念吧!且听后续。
R14 LR 寄存器介绍
LR 用于在调用子程序时存储返回地址。比如在主程序中调用了一个函数,此时LR 保存的是函数执行完之后,返回到主程序调用前地址的下一条地址。比如:
main
BL FUN PC = FUN LR 指向FUN 返回后的执行地址
FUN
BX LR
SP 是4 字节对齐的,也就是说R13 的最低两位是硬件链接到 0.总是读出来 0 。但是LR 不是,LR 为了适用 ARM/Thumb 两种状态切换的历史事件。最低两位可以读也可以写。
R15 PC 寄存器介绍
程序计数器。PC 存放的是当前指令的下一条指令的地址。比如当前指令地址是0x100 则PC = 0x104 。如果直接通过MRS MSR 操作PC ,此时不影响 LR 寄存器,因为没有链接的过程。BL 指令是即跳转又链接,所以会操作LR 寄存器。我们上面提到LR 寄存器的低位可以读写。问题来了,PC 指针呢??? PC 的LSB 总是读回 0的。但是在写PC 时,必须保证最低位为 1.这里的写包括直接操作PC 和通过跳转等指令。因为最低位是来切换ARM 和Thumb 指令状态的。而CM3 是工作在Thumb状态的。所以必须为 1.为0 就是为切换到ARM 。会出现fault 异常。