ARM嵌入式系统开发:软件设计与优化--第二章ARM处理器基础

注:本文资料全部来源于网络或书籍,同时加上个人理解。若有侵权,告知即删。若有错误,留言商讨。

1、寄存器:

总共有37个寄存器,最多可以有17个活动寄存器(16个数据寄存器,2个状态寄存器:CPSR和SPSR)

ARM嵌入式系统开发:软件设计与优化--第二章ARM处理器基础_第1张图片

R13:堆栈指针:指向当前处理器模式的堆栈栈顶

R14:链接寄存器,保存子程序的返回地址。【当执行子程序调用指令(BL)时,R14可得到R15(程序计数器PC)的备份】

R15:程序技术器,处理器下一条要取出的指令地址。【ARM状态下,指令4字节对齐,位[1:0]为0。位[31:2]保存PC】

【注】快速中断的r8-r12是分组寄存器,r13-r14每种模式都有自己的分组寄存器。r15没有分组寄存器。用户模式和系统模式没有分组寄存器

2、当前程序状态寄存器CPSR:

ARM嵌入式系统开发:软件设计与优化--第二章ARM处理器基础_第2张图片

3、处理器模式:

除了用户模式外,每一种模式可以改写cpsr中的模式位来改变。当一个异常或中断发生的时候cpsr寄存器被保存到相应模式的spsr寄存器中,但是当用户程序改写cpsr寄存器切换模式的时候,cpsr不会被自动保存。系统上电:从管理模式开始,ARM指令状态。

  • 除了USR和SYS外都是异常模式
  • 除了USR外都是特权模式 , 特权模式可以通过直接修改CPSR中相应的位来切换到USR,但是USR不能直接修改CPSR,只能通过指令,
  • OS的内核态程序工作在SVC模式, 用户态程序工作在USR模式
  • ARM的CPU复位就处于SVC模式,执行完启动代码后就需要切换到USR模式

 

4、Thumb指令

指令的操作数仍然是32位,寻址地址是32位。

该状态下,读取R15(PC)位0为0,位31-1保存了程序计数器的地址。写入R15时,位0被忽略,位31-1保存了程序计数器要写入的值。即:PC的位0一直保持为0,前面31位保存了下一条指令的地址。

ARM指令:字对齐,地址的最后两位为0;thumb指令:半字对齐,地址的最后一位为0。【因此最后一位不可能是有用地址

可以使用R0-R7寄存器。有些指令还可以使用PC、lr、sp寄存器。

ARM嵌入式系统开发:软件设计与优化--第二章ARM处理器基础_第3张图片

ARM嵌入式系统开发:软件设计与优化--第二章ARM处理器基础_第4张图片

【解释】:BX跳转到,最后一位为0时,表示thumb指令的地址。于是编译器自动加上状态切换指令、并且和0xfffffffe进行与操作。然后得到真正的指令地址,并复制给PC寄存器。

【加1操作,由编译器完成。去1 -- 可能是硬件自动完成,并不产生指令】

arm与thumb间的切换

  1,由arm状态切换到thumb

  状态将寄存器的最低位设置为1

       BX指令:R0[0]=1,则执行BX  R0指令将进入thumb状态

  2,由thumb状态切换到ARM状态

寄存器最低位设置为0

    BX指令:R0[0]=0,则执行BX  R0指令将进入arm状态

当处理器进行异常处理时,则从异常向量地址开始执行,将自动进入ARM状态。
        注意:ARM处理器复位后开始执行代码时总是只处于ARM状态;

                  Cortex-M3只有Thumb-2状态和调试状态;

                  由于Thumb-2具有16位/32位指令功能,因此有了thumb-2就无需Thumb了。

                  另外,具有Thumb-2技术的ARM处理器也无需再ARM状态和Thumb-2状态间进行切换了,因为thumb-2具有32位指令功能。

    总的说,arm状态与Thumb状态的本质区别就是指令的位数不同,arm是32位的指令状态,而thumb是16位 的指令状态,而thumb-2状态是arm状态和thumb状态的结合和优化。

 

你可能感兴趣的:(ARM体系结构)