ARM体系结构与编程

时间:2022-06-14 19:08:27
ARM处理器的7中运行模式:usr、fiq、irq、svc、abt、und、sys。


ARM处理器共37个寄存器:31个通用寄存器(未备份寄存器R0-R7,在所有模式下指的都是同一个物理寄存器;备份寄存器R8-R12,每个寄存器对应两个不同的物理寄存器。对于R13[sp]和R14[lr]来说,每个寄存器对应6个不同的寄存器;程序计数器R15[pc]),6个状态寄存器(当前程序状态寄存器[cpsr];5个备份状态寄存器[spsr])。


ARM体系的异常中断:复位、未定义指令、软件中断、指令预取中止、数据访问中止、外部中断请求、快速中断请求。
ARM处理器响应异常中断的过程:
1.保存CPSR到将要执行的异常中断对应的SPSR。
2.设置CPSR,使处理器进入相应的模式。
3.将寄存器R14[lr_mode]设置成返回地址
4.将寄存器R15[PC]设置成该异常中断的中断向量地址。
从异常中断处理程序中返回的过程:
1.恢复SPSR_mode到CPSR。
2.复制R14[lr_mode]到R15[PC]。


ARM体系的存储系统:单一的平板地址空间,空间大小为2^32个8位,即2^32B,空间地址为0 到 2^32-1。存储格式分big-endian和little-endian。


ARM指令:ARM指令字长为固定的32位。一般编码格式如下:
|cond|001|opcode|S|Rn|Rd|shifter_operand|
cond:指令执行的条件编码
opcode:指令操作符的编码
S:决定指令的操作是否影响CPSR的值
Rn:目标寄存器编码
Rd:包含第一个操作数的寄存器编码
shifter_operand:第二个操作数的编码
ARM指令的寻址方式:数据处理指令的操作数的寻址方式、字及无符号字节的Load/Store指令的寻址方式[Load指令从内存中读取数据到寄存器中,Store指令将寄存器中的数据保存到内存]、杂类Load/Store指令的寻址方式、批量Load/Store指令的寻址方式[实现在一组寄存器和一块连续的内存单元之间传输数据]、协处理器Load/Store指令的寻址方式[实现在ARM处理器和协处理器之间传输批量数据]。


ARM指令集:
1.跳转指令:B、BL、BLX、BX。
<1>.B及BL:用于实现子程序调用,可跳转的地址范围大致为-32MB 至 32MB。B指令仅跳转,BL指令同时还将PC寄存器的值保存到LR寄存器,子程序的返回可以通过将LR寄存器的值复制到PC寄存器中来实现。
<2>.BLX:语法1:BLX target_address。
操作的伪代码:LR = address of the instruction after the BLX instruction
    T Flag = 1 (即表示切换到Thumb指令集)
    PC = PC + 跳转地址
语法2:BLX{<cond>} <Rm>。
操作的伪代码:if cond  then
            LR = address of the instruction after the BLX instruction
        T Flag = Rm[0] (是否切换指令集取决于寄存器Rm中的目标地址的bit[0])
        PC = Rm AND 0xfffffffe
<3>BX:语法:BX{<cond>} <Rm>。
操作的伪代码:if cond  then
        T Flag = Rm[0] (是否切换指令集取决于寄存器Rm中的目标地址的bit[0])
        PC = Rm AND 0xfffffffe
2.数据处理指令:数据传送MOV、比较CMP、位测试TST、相等测试TEQ、加法ADD、减法SUB、位清除BIC、异或EOR、或ORR等。
3.乘法指令:32位乘法MUL等。
4.状态寄存器访问指令:通常修改状态寄存器是通过“读取-修改-写回”的操作来实现的。
<1>MRS:状态寄存器 到 通用寄存器 的传送指令。语法:MRS{<cond>} <Rd>, CPSR 
<2>MSR:通用寄存器 到 状态寄存器 的传送指令。语法:MSR{<cond>} CPSR,<Rm> 或 MSR{<cond>} CPSR,#立即数
例如将处理器的模式切换到特权模式:
MRS R0, CPSR ;读取CPSR
BIC R0, R0, #0x1F;修改,去除当前处理器模式
ORR R0, R0, #0x13;修改,设置特权模式
MSR CPSR_c, R0;写回,仅仅修改CPSR中的控制位域
5.Load/Store内存访问指令:字数据读取指令LDR(从内存将一个32位的字读取到目标寄存器),字数据写入STR(将一个32位的字写入到指定的内存单元)等。
6.批量Load/Store内存访问指令:批量内存字数据读取指令LDM,批量内存字数据写入指令STM。
7.信号量操作指令:信号量用于进程间的同步和互斥,对信号量的操作要求是一个原子操作,不可被打断。ARM提供SWP(字交换指令)和SWPB(字节交换指令)来完成信号量的操作。
语法为:SWP{<cond>} <Rd>, <Rm>, [Rn]
功能:将一个内存单元[Rn]的内容读取到一个寄存器<Rd>中,同时将另一个寄存器<Rm>的内容写入到该内存单元[Rn]中。
8.异常中断产生指令:软中断指令SWI(ARM通过软中断实现在用户模式下对操作系统中特权模式的程序调用即系统调用)
语法为:SWI{<cond>} <immed_24>
功能:用于用户程序调用操作系统的系统服务,操作系统在SWI的中断服务程序中提供相关的系统服务,并定义了参数传递的方法,通常参数传递方法如下两种<1>指令中的24为立即数用于指定用户请求的服务类型,参数通过通用寄存器传递。<2>指令中的24位立即数被忽略,用户请求的服务类型由寄存器R0的数值来决定,参数通过其他的通用寄存器来传递。
9.ARM协处理器指令:ARM支持16个协处理器。ARM协处理器指令包括以下3类:<1>用于ARM处理器初始化ARM协处理器的数据处理操作<2>用于ARM处理器的寄存器和ARM协处理器的寄存器间的数据传送操作<3>用于在ARM协处理器的寄存器和内存单元之间传送数据。一共五条指令如下:
<1>CDP:协处理器数据操作指令
例如:CDP p5, 2, c12, c10, c3, 4;协处理器p5的操作初始化。其中,操作码1为2,操作码2为4,目标寄存器为c12,源操作数寄存器为c10和c3。
<2>LDC:协处理器数据读取指令
例如:LDC p6, CR4, [R2, #4];R2为ARM寄存器,指令读取内存单元[R2, #4]的字数据,传送到协处理器p6的CR4寄存器中。
<3>STC:协处理器数据写入指令
例如:STC p8, CR8, [R2, #4]!;R2为ARM寄存器,指令将协处理器p8的CR8寄存器中的字数据写入到内存单元[R2, #4]中,指令执行后R2=R2+4。
<4>MCR:ARM寄存器到ARM协处理器的数据传送指令
例如:MCR p14, 3, R7, c7, c11, 6;指令从ARM寄存器中将数据传送到协处理器p14的寄存器中。其中R7为ARM寄存器,存放源操作数;c7和c11为协处理器寄存器,为目标寄存器;操作码1为3,;操作码2为6。
<5>MRC:ARM协处理器到ARM寄存器的数据传送指令
例如:MRC p15, 2, R5, c0, c2, 4;指令将协处理器p15寄存器中的数据传送到ARM寄存器中。其中R5为ARM寄存器,是目标寄存器;c0和c2为协处理器寄存器,存放源操作数;操作码1为2,操作码2为4。