ARM汇编指令

1.ARM寄存器组

ARM 处理器一般共有 37 个寄存器,都是 32 位的寄存器,其中包括:
  • 31个通用寄存器,包括 PC(程序计数器)在内;
  • 6个状态寄存器。
ARM 处理器共有 7 种不同的处理器模式:
  • 用户模式(User):ARM处理器正常的程序执行状态;
  • 快速中断模式(FIQ):用于高速数据传输或通道处理;
  • 普通中断模式(IRQ):用于通用的中断处理;
  • 管理模式(Supervisor):操作系统使用的保护模式;
  • 数据访问中止模式(Abort):当数据或指令预取终止时进入该模式,可用于虚拟存储及存储保护;
  • 未定义指令中止模式(Und):当未定义的指令执行时进入该模式,可用于支持硬件协处理器的软件仿真;
  • 系统模式(System):运行具有特权的操作系统任务。

在每一种处理器模式中有一组相应的寄存器。在任意一种处理器模式下,可见的寄存器包括 15 个通用寄存器(R0~R14)、一个或者二个状态寄存器(CPSR)以及程序计数器(PC)。在所有的寄存器中,有些是各模式共用同一个物理寄存器,有些寄存器是各个模式自己拥有独立的物理寄存器。 


通用寄存器包括R0~R15,可以分为3类:
  • 未分组寄存器R0~R7
  • 分组寄存器R8~R14
  • 程序计数器PC(R15)
寄存器R13在ARM指令中常用作堆栈指针,用户也可使用其他的寄存器作为堆栈指针,而在Thumb指令集中,某些指令强制性的要求使用R13作为堆栈指针。
寄存器R14称为链接寄存器(Link Register),当执行子程序调用指令(BL)时,R14可得到R15(程序计数器PC)的备份。
寄存器R15用作程序计数器(PC),在ARM状态下,位[1:0]为0,位[31:2]用于保存PC,在Thumb状态下,位[0]为0,位[31:1]用于保存PC。由于ARM体系结构采用了多级流水线技术,对于ARM指令集而言,PC总是指向当前指令的下两条指令的地址,即PC的值为当前指令的地址值加8个字节。
寄存器R16用作CPSR(Current Program Status Register,当前程序状态寄存器),CPSR可在任何运行模式下被访问,它包括条件标志位、中断禁止位、当前处理器模式标志位,以及其他一些相关的控制和状态位。每一种运行模式下又都有一个专用的物理状态寄存器,称为SPSR(Saved Program Status Register,备份的程序状态寄存器),当异常发生时,SPSR用于保存CPSR的当前值,从异常退出时则可由SPSR来恢复CPSR。由于用户模式和系统模式不属于异常模式,它们没有SPSR,当在这两种模式下访问SPSR,结果是未知的。

2.寻址方式

处理器的寻址方式是通过指令给出的地址码字段来寻找真实操作数地址的方式,ARM处理器支持9种寻址方式:

1. 立即寻址:
   ADD R0,R0,#0x1 ; R0 <- R0 + 1 
   将寄存器R0的内容加1,结果存放在寄存器R0中,第二个源操作数为立即数,要求以“#”为前缀 。
2. 寄存器寻址
   ADD R0,R1,R2ADD R0,R1,R2 ;R0 <- R1 + R2  ;R0 <- R1 + R2 
   将寄存器 R1 和 R2 存放的内容相加,结果存放在寄存器 R0 中。 
3. 寄存器移位寻址
   MOV R0, R1,LSL #2 ;R0 <- R1 * 4
   和寄存器寻址类似,只是操作前需要对寄存器操作数进行移位操作。
4. 寄存器间接寻址
   LDR R0,[R1] ;R0 <- [R1] 
   将 R1 的值作为地址,取出此地址中的值赋值给R0。
5. 基址寻址
   LDR R0, [R1,#-4] ;R0 <- [R1 - 4]
   将R1的值减去4作为地址,取出此地址中的值赋值给R0。
6. 多寄存器寻址
   LDMIA R0,{R1,R2,R3,R4} ;R1 <- [R0];R2 <- [R0 + 4];R3 <- [R0 +8];R3 <- [R0 + 12] 
   这种寻址方式可以用一条指令完成传送最多16个通用寄存器的值。指令中的后缀 IA 表示在每次执行完加载/存储操作后,R0 按字长增加。
7. 堆栈寻址
   STMFD SP1, {R1-R7,LR}
   将R1-R7,LR入栈,多用于保存子程序现场。
8. 块拷贝寻址
       LDMIA R0,{R1-R3}
       STMIA R1,{R1-R3}
   实现连续地址数据从存储器的某一位置拷贝到另一位置(多寄存器寻址的组合)。以R0的值为起始地址的存储单元中读取3个字的数据,然后将读取的数据存入以R1的值为起始地址的存储单元中。
9. 相对寻址
       BEQ process1
       ......
       process1
       ......
   相对寻址以程序计数器PC的当前值为基地址,指令中的地址标号作为偏移量,将两者相加之后得到的操作数作为有效地址。
   
   
   

猜你喜欢

转载自blog.csdn.net/cztqwan/article/details/79428238