ARM架构处理器
ARM架构处理器的工作模式:
- USR(User):普通应用程序的运行模式
- FIQ (Fast Interrupt):快速中断模式,用于处理快速的事件,例如高速数据传输
- IRQ (Interrupt):外部中断模式,用于处理通用中断事件
- SVC(SuperVisor):又称保护模式,操作系统使用的特权模式
- ABT(Abort):数据访问中止模式,用于虚拟存储和存储保护
- UND(Undefined):未定义指令终止模式,用于支持通过软件仿真硬件的协处理器
- SYS(System):系统模式,用于运行特权级的操作系统任务
注意:Usr为普通模式,其他六个模式为特权模式;除了Usr和Sys模式,其他的五个模式为异常模式
ARM架构处理器的寄存器:
- 通用寄存器(31)
1. 不分组寄存器(R0-R7)
2. 分组寄存器(R8-R14)
3. PC指针(R15) - 状态寄存器(6)
1. CPSR->Current Program States Register(1)
2. SPSR->Saved Program States Register(5)
具体分布如下表:
寄存器的作用
不分组寄存器(R0-R7)
在所有的运行模式下都可以使用的同一组物理寄存器,他们没有被系统用作特殊寄存器处理,因此在中断或者异常处理进行模式切换的时候,由于不同处理模式使用的是统一组的物理寄存器,所以会造成寄存器中的数据被破坏。
分组寄存器(R8-R14)
a)对于R8-R12,当使用FIQ(Fast Interrupt)快速中断模式是访问的是R8_fiq-R12_fiq,在使用其他模式的时候访问的是R8-R12
b)对于R13-R14,每个寄存器都对应6个不同的物理寄存器;在USR(User)用户模式和SYS(System)使用的是同一组物理寄存器R13-R14;
在SVC(SuperVisor)管理模式下使用R13_svc-R14_svc;
在IRQ(Interrupt)外部中断模式下使用R13_irq-R14-irq;
在ABT(Abort)数据访问中止模式下使用R13_abt-R14_abt;
在UND(Undefined)未定义指令终止模式下使用R13_und-R14_und。
① R13在ARM指令中常被用作SP(Stack Pointer)堆栈指针;
Note:由于每一种模式都有自己的R13,所以我们在自己做初始化的时候一般都要初始化每一种模式下的R13,使它们都指向该运行模式的栈空间。
② R14被称为子程序链接寄存器,有两种特殊的功能,一种是每一种模式都可以用于保存函数的返回地址,另外就是异常处理后的返回地址,例如中断。PC指针(R15)
R15用作程序计数器(Program Counter,Not Person Computer),在任何的模式下都对应同一个物理寄存器,由于ARM体系采用了多级流水线技术,所以PC的值存的是当前取指令操作对应的地址;(流水线总共有三个动作:取指令 –>译码 –>执行)即PC存的值为当前执行指令的后两条指令的地址,在ARM指令集中,当前执行指令的地址为PC-8;在Thumb指令集的地址为PC-4。
CPSR(Current Program States Register)
31 30 29 28 27 26-25 24 23-20 19-16 15-10 9 8 7 6 5 4-0 N Z C V Q Res J RESERVED GE[3:0] RESERVED E A IF T M[4:0] N:Negative/Less Than
Z:Zero
C:Carry/Borrow/Extend
V:Overflow
I:IRQ disable
F:FIQ disable
T:State bit
M[4:0]: Mode bits
1)条件码标志位
N、Z、C、V、Q均为条件标志位,它们的内容可以被算术或逻辑运算的结果所改变,并且可以决定某条指令是否被执行,条件标志位的含义如下:标志位 含义 N 当两个补码表示带符号数进行计算时,N=1表示运算结果为负数;N=0表示运算结果为整数或者为零 Z Z=1 表示运算结果为零,Z=0表示运算结果非零 C 可以有4种方法设置的C的值:①加法运算(包括CMP):当运算结果产生了进位时(无符号溢出),C=1,否则C=0。②减法运算(包括CMP):当运算产生了借位时(无符号数溢出),C=0,否则C=1。③对于包含移位操作的非加减运算指令,C为移出值的最后一位。④对于其他的非加减运算指令,C的值通常不会改变。 V 可以有两种方法设定V的值:①对于加减运算指令,当操作数和运算结果为二进制的补码表示带符号数时,V=1表示符号溢出,否则V=0;②对于其他非加减运算指令,V的值通常不会改变。 Q 在ARM V5 及以上版本的E系列处理器中,用Q标志位表示增强的DSP运算指令是否发生了溢出。在其他版本的处理器中,Q标志位无定义。 2)模式标志位
M[4:0] 处理器模式 ARM模式下可访问的寄存器 THUMB模式下可访问的寄存器 0B10000 用户模式 PC,CPSR,R0-R14 PC,CPSR,R0-R7,LR,SP 0B10001 FIQ模式 PC,CPSR,SPSR_fiq,R14_fiq-R8_fiq,R0-R7 PC,CPSR,SPSR_fiq,LR_fiq,SP_fiq,R0-R7 0B10010 IRQ模式 PC,CPSR,SPSR_irq,R14_irq-R13_irq,R0-R12 PC,CPSR,SPSR_irq,LR_irq,SP_irq,R0-R7 0B10011 管理模式 PC,CPSR,SPSR_svc,R14_svc-R13_svc,R0-R12 PC,CPSR,SPSR_svc,LR_svc,SP_svc,R0-R7 0B10111 中止模式 PC,CPSR,SPSR_abt,R14_abt-R13_abt,R0-R12 PC,CPSR,SPSR_abt,LR_abt,SP_abt,R0-R7 0B11011 未定义模式 PC,CPSR,SPSR_und,R14_und-R13_und,R0-R12 PC,CPSR,SPSR_und,LR_und,SP_und,R0-R7 0B11111 系统模式 PC,CPSR,R0-R14 PC,CPSR,LR,SP,R0-R7
ARM架构处理器常用指令介绍:
ARM寻址方式
1)立即数寻址
ADD R0,R0,#0x01; R0 = R0 + 0x01
2)寄存器寻址
ADD R1,R2,R3; R1 = R2 + R3
3)寄存器间接寻址
LDR R0,[R1]; 将R1里面的值作为数据的地址,将该地址对应的数据赋值给R0,R0 = [R1]
STR R0,[R1]; 将R0的值存放在R1的值的地址处;[R1] = R0
4)多寄存器寻址
LDMIA R0,{R1,R2,R3,R4}; R1 = [R0],R2 = [R0 + 4],R3 = [R0 + 8],R4 = [R0 + 12]ARM汇编指令
格式:
{operate} {condition} {S} {Rd},{Rn},{operand2}
{operate} : 指令操作编码,例如LDR,STR
{condition} : 指令执行的条件编码,如EQ,NE等
{S} : 决定指令的执行是否影响CPSR的值
{Rd} : (Register Destination)目标寄存器编码
{Rn} : 包括第一个源操作数的寄存器编码
{operand2} : 第二个操作数
条件码是在ARM指令执行之前,判断是否符合条件,如果符合则执行该指令。
条件码如下表所示:
操作码 条件助记符 判断的标志位 含义 0000 EQ(Equal) Z = 1 相等 0001 NE(Not Equal) Z = 0 不相等 0010 CS/HS(Carry Set/High or Same) C = 1 无符号数大于或者等于 0011 CC/LO(Carry Clear/LOwer) C = 0 无符号数小于 0100 MI(MInus) N = 1 负数 0101 PL(PLus) N = 0 正数或者零 0110 VS(oVerflow Set) V = 1 溢出 0111 VC(oVerflow Clear) V = 0 没有溢出 1000 HI(Lower or Same) C = 1,Z = 0 无符号数大于 1001 LS(Lower or Same) C = 0,Z = 1 无符号数小于或等于 1010 GE(Greater or Equal) N = V 有符号数大于或等于 1011 LT(Less Than) N != V 有符号数小于 1100 GT(Greater Than) Z = 0,N = V 有符号数大于 1101 LE(Less or Equal) Z = 1,N != V 有符号数小于或等于 1110 AL(ALL) 任何条件 无条件执行(默认情况) 1111 NV 任何条件 从不执行
1)数据处理指令
Move: MOV R1,R0; R1 = R0
Move Not: MVN R1,R0; R1 = ~R0
Compare: CMP R1,#100; R1 - 100 影响CPSR的条件码标志位
Compare Negative: CMN R1,R0; R1 + R0 影响CPSR的条件码标志位
Test: TST R1,#0xfffe; R1 & 0xfffe 影响CPSR的条件码标志位
Test Equalvalence: TEQ R1,R0; R1^R0 影响CPSR的条件码标志位
Add: ADD R0,R1,R2; R0 = R1 + R2
Add with Carry: ADC R0,R1,R2; R0 = R1 + R2 + CPSR->C
Subtract: SUB R0,R1,R2; R0 = R1 - R2
Reverse Subtract: RSB R0,R1,R2; R0 = R2 -R1
Multiply: MUL R0,R1,R2;R0 = R1*R2
And: AND R0,R0,#3; R0 = R0 & 3
OR :ORR R0,R0,#3; R0 = R0 | 3
Bit clear: BIC R0,R0,#0xfe; R0 = R0 | 0xfe
Load Word: LDR R0,{R1,R2}; 将存储地址为R1+R2的字数据读入到寄存器R0
LDR R0,{R1,R2}!;将存储地址为R1+R2的字数据读入到寄存器R0,并将新地址写入到R1
Store: STR R0,[R1],#8;将R0中的字数据写入到R1+8的地址
Move PSR to Register: MSR CPSR,R0;将R0的内容写入到CPSR中
Move Register to PSR: MRS R0,CPSR;传送CPSR的内容到寄存器R0
2)跳转指令
Branch: B Label; 程序无条件跳转到标号Label处执行
Branch with Link: BL Label;当程序无条件跳转到Label处执行时,同时将当前的PC值保存到R14中(Link Register)
Branch with Link and exchange: BLX Label;从ARM指令集跳转到Label所指定的目标地址,并将处理器的工作状态由ARM状态切换到Thumb状态,该指令同时将PC的当前内容保存到寄存器R14中
Branch and exchange: BX Label;跳转到Label所指定的目标地址,目标地址的指令既可以是ARM指令也可以是Thumb指令