ARM处理器共有7种不同的处理器模式,每种模式都有一组相应的寄存器组,最多可以18个活动的寄存器。
寄存器R0~R7为未分组的通用寄存器,它们在任何处理器模式都对应于相同的32位物理寄存器。
寄存器R8~R12有两个分组的物理寄存器。一个用于除FIQ模式之外的所有寄存器模式,另一个用于FIQ模式。
在发生FIQ中断后,处理器不必为保护寄存器而浪费时间,从而加速了FIQ的处理速度。
寄存器R13、R14分别有6个分组的物理寄存器。1个用于用户和系统模式,其余5个分别用于5种异常模式。
寄存器R13通常作为堆栈指针(SP),用于保存待使用的寄存器的内容。
寄存器R14称为链接寄存器(LR),在结构上有两个特殊功能:
? 当使用BL指令调用子程序时,返回地址将自动存入R14中;
? 当发生异常时,将R14对应的异常模式版本设臵为异常返回地址(有些异常有一个小的固定偏移量)。
寄存器R15称为程序计数器(PC),它指向正在“取指”的指令。 寄存器CPSR为当前程序状态寄存器,在异常模式中,另外一个寄存器“程序状态保存寄存器(SPSR)”可以被访问。每种异常都有自己的SPSR,在进入异常时它保存CPSR的当前值,异常退出时可通过它恢复CPSR。
6
ARM和Thumb状态切换过程
1. 系统复位,自动切换到ARM状态。
2. 通过BX和BLX指令改变当前处理器模式,使之从ARM状态切换到Thumb状态。
3. 在Thumb状态下,正常程序执行时产生中断异常。 4. 处理器进入中断异常,自动的将模式切换到ARM状态。 5. 异常处理完毕,返回正常程序,此时处理器自动的将模式切换到Thumb状态。
6. 再次通过BX和BLX指令改变当前处理器模式,使之从Thumb状态切换到ARM状态。
ARM内核包含1个CPSR和5个仅供异常处理程序使用的
SPSR。CPSR反映当前处理器的状态,其包含:
? 4个条件代码标志(负标志N、零标志Z、进位标志C和溢出标志V );
? 2个中断禁止位(IRQ禁止与FIQ禁止); ? 5个对当前处理器模式进行编码的位(M[4:0]); ? 1个用于指示当前执行指令的位(ARM指令还是Thumb指令)。
条件代码标志
各标志位的含义如下:
? 负标志N:运算结果的第31位值,记录标志设臵操作的结果; ? 零标志Z:如果标志设臵的操作为0,则臵位;
7
? 进位标志C:记录无符号加法溢出,减法无借位,循环移位; ? 溢出标志V:记录标志设臵操作的有符号溢出。 处理器状态位T;
当控制位T臵位时,处理器正在Thumb状态下运行 当控制位T清零时,处理器正在ARM状态下运行。 当控制位I臵位时,IRQ中断被禁止; 当控制位F臵位时,FIQ中断被禁止。
警告:绝对不要强制改变CPSR寄存器中的控制位T。如果这样做,处理器将进入一个无法预测的状态。 存储器系统有两种映射机制:
小端存储器系统: 在小端格式中,数据的高字节存放在高地址中。 大端存储器系统:在大端格式中,数据的高字节存放在低地址中。 小端存储模式下,0x12345678在A地址开始的一个字空间的存储(1); 0x12 0x78 0x34 0x56 0x56 0x34 0x78 0x12 (1) (2)
大端存储模式下,0x12345678在A地址开始的一个字空间的存储(2); ARM体系的异常 异常的进入
? 将异常处理程序的返回地址(加固定的偏移量)保存到相应异
8
常模式下的LR;
? 将CPSR的当前值保存到相应异常模式下的SPSR; ? 设臵CPSR为相应的异常模式;
? 设臵PC为相应异常处理程序的中断入口向量地址,跳转到相应的异常中断处理程序执行; 异常的退出
当异常处理程序结束时,异常处理程序必须:
? 返回到发生异常中断的指令的下一条指令处执行,即就是说将LR中的值减去偏移量后移入PC; ? 将SPSR的值复制回CPSR;
? 清零在入口处臵位的中断禁止标志。
1.MOV指令与LDR指令都是往目标寄存器中传送数据,但是它们有什么区别吗?
MOV指令用于将数据从一个寄存器传送到另一个寄存器中,或者将一个常数传送到一个寄存器中,但是不能访问内存。LDR指令用于从内存中读取数据放入寄存器中。 2.以下8位图立即数是否合法? 0x0103C000 ×
0x12800000 可以由0x4A循环右移10位得到 3.请列举2个8位图立即数? 0x4000003B(0xED循环右移2位)
9
0x0016C000(0x5B循环右移18位) ? Rm,shift——寄存器移位方式 例如:
ADD R1,R1,R1,LSL #3 ;R1=R1+R1*8=9R1 SUB R1,R1,R2,LSR R3 ;R1=R1-(R2/2R3)
4.用R1寄存器的最低字节替换掉R2寄存器的最低字节,并不影响条件标志位?
AND R1,R1,#0x000000FF AND R2,R2,#0xFFFFFF00 ORR R2,R2,R1
5. 使用MSR和MRS指令,通过修改CPSR寄存器,实现打开/关闭IRQ中断的两个子程序,注意不能影响其它位? ;子程序:使能IRQ中断 Enable_IRQ
MRS R0, CPSR BIC R0, R0,#0x80 MSR CPSR_c,R0 MOV PC,LR
;1.将CPSR寄存器内容读出到R0; ;2.修改对应于CPSR中的I控制位; ;子程序:禁能IRQ中断 Disable_IRQ
10