ARM微处理器的编程模型之:ARM寄存器组织
保存到堆栈中。
STMFD SP!, {register>,LR}
在子程序返回时,使用如下相应的配套指令返回。
LDMFD SP!, {register>,PC}
(2)当异常中断发生时,该异常模式特定的物理寄存器r14被设置成该异常模式的返回地址,对于有些模式r14的值可能与返回地址有一个常数的偏移量(如数据异常使用SUB PC, LR,#8返回)。具体的返回方式与上面的子程序返回方式基本相同,但使用的指令稍微有些不同,以保证当异常出现时正在执行的程序的状态被完整保存。
R14也可以被用作通用寄存器使用。
注意 | 当嵌套中断被允许时(即异常可重入),r13和r14的使用要特别小心。例如,在用户模式下一个IRQ中断发生,这时两种模式分别使用不同的r13和r14,换句话讲,用户模式使用r13_usr和r14_usr,而IRQ模式使用r13_irq和r14_irq,这样不会造成寄存器使用冲突。但是,当程序运行在IRQ模式下,又有IRQ中断进入,此时,第二级中断使用r13_irq和r14_irq,冲掉了第一级IRQ的堆栈指针和返回地址,导致程序异常。 解决办法是在第二级中断发生前,将第一级中断用到的寄存器压栈。 |
3.3.2 程序计数器r15
程序计算器r15又被记为PC。它有时可以被和r0-r14一样用作通用寄存器,但很多特殊的指令在使用r15时有些限制。当违反了这些指令的使用限制时,指令的执行结果是不可预知的。
程序计数器在下面两种情况下用于特殊的目的。
· 读程序计数器。
· 写程序计数器。
1.程序计数器读操作
由于ARM的流水线机制,指令读出的r15的值是指令地址加上8个字节。由于ARM指令始终是字对齐的,所以读出的结果位[1∶0]始终是0(但在Thumb状态下,指令为2字节对齐,bit[0]=0)。
读PC主要用于快速地对临近的指令或数据进行位置无关寻址,包括程序中的位置无关分支。
需要注意的是,当使用指令STR或STM对r15进行保存时,保存的可能是当前指令地址加8或当前指令地址加12。到底是哪种方式,取决于芯片的具体设计方式。当然,在同一个芯片中,要么采用当前指令地址加8,要么采用当前指令地址加12,不可能有些指令采用当前地址加8,有些采用当前地址加12。程序开发人员应尽量避免使用STR或STM指令来对r15进行操作。当不可避免要使用这种方式时,可以先通过一小段程序来确定所使用的芯片是使用哪种方式实现的。例如:
SUB R1,PC,#4 ;r1中存放STR指令地址
STR PC,[R0] ;将PC=STR地址+offset保存到r0中
LDR R0,[R0]
SUB R0,R0,R1 ;offset=PC-STR地址
2.程序计数器写操作
当指令向r15写入地址数据时,如果指令成功返回,它将使程序跳转到该地址执行。由于ARM指令是字对齐的,写入r15的地址值应满足bit[1:0]=0b00,具体的规则根据ARM版本的不同也有所不同:
· 对于ARM版本3以及更低的版本,写入r15的地址值bit[1:0]被忽略,即写入r15的地址值将与0xFFFFFFFC做与操作。
· 对于ARM版本4以及更高的版本,程序必须保证写入r15寄存器的地址值的bit[1:0]为0b00,否则将会产生不可预知的结果。
对于Thumb指令集来说,指令是半字对齐的。处理器将忽略bit[0],即写入r15寄存器的值在写入前要先和0XFFFFFFFE做与操作。
有些指令对r15的操作有特殊的要求。比如,指令BX利用bit[0]来确定需要跳转到的子程序是ARM状态还是Thumb状态。
注意 | 这种读取PC值和写入PC值的不对称操作需要特别注意。 |
3.3.3 程序状态寄存器
当前程序状态寄存器CPSR(Current Program Status Register)可以在任何处理器模式下被访问,它包含下列内容。
· ALU(Arithmetic Logic Unit)状态标志的备份。
· 当前的处理器模式。
· 中断使能标志。
· 设置处理器的状态(只在4T架构)。
每一种处理器模式下都有一个专用的物理寄存器作备份程序状态寄存器SPSR(Saved Program Status Register)。当特定的异常中断发生时,这个物理寄存器负责存放当前程序状态寄存器的内容。当异常处理程序返回时,再将其内容恢复到当前程序状态寄存器。
注意 | 由于用户模式和系统模式不属于异常中断模式,所以它们没有SPSR。当在用户模式或系统模式中访问SPSR,将会产生不可预知的结果。 |
CPSR寄存器(和保存它的SPSR寄存器)中的位分配如图3.4所示。
注意
对于CMP指令,Z=1表示进行比较的两个数相等。
· C
下面分4种情况讨论C的设置方法。
① 在加法指令中(包括比较指令CMN),当结果产生了进位,则C=1,表示无符号数运算发生上溢出;其他情况下C=0。
② 在减法指令中(包括比较指令CMP),当运算中发生错位(即无符号数运算发生下溢出),则C=0,;其他情况下C=1。
③ 对于
微处理器 连接寄存器 ARM 分组寄存器 程序计数器 相关文章:
- 用8位微处理器实现数字低通滤波器设计(05-15)
- 如何构造嵌入式Linux系统(05-23)
- 基于嵌入式Linux的便携式RFID信息采集与处理系统(07-01)
- SPARC微处理器综述(05-29)
- Motorola32位嵌入式微处理器MPC860的开发应用(06-02)
- 基于ARM和uClinux的家庭网关系统(09-14)