ARM微处理器的编程模型之:ARM寄存器组织
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。
③ 对于在操作数中包含移位操作的运算指令(非加/减法指令),C被设置成被移位寄存器最后移出去的位。
④ 对于其他非加/减法运算指令,C的值通常不受影响。
· V
下面分两种情况讨论V的设置方法。
① 对于加/减运算指令,当操作数和运算结果都是以二进制的补码表示的带符号的数时,V=1表示符号位溢出。
② 对于非加/减法指令,通常不改变标志位V的值(具体可参照ARM指令手册)。
尽管以上C和V的定义看起来颇为复杂,但使用时在大多数情况下用一个简单的条件测试指令即可,不需要程序员计算出条件码的精确值即可得到需要的结果。
注意 | 下面两种情况会对CPSR的条件标志位产生影响。 1.比较指令(CMN、CMP、TEQ、TST)。 2.目的寄存器不是r15的算术逻辑运算和数据传输指令。这些指令可以通过在指令末尾加标志“S”来通知处理器指令的执行结果影响标志位。 |
评论