ARM公司定义了ARMV1~ARMV8共8套指令集,在每个指令集下有众多版本的ARM核心,ARM芯片会在其芯片内部包含一个或多个ARM核心并配以外围模块。
参考《ARM架构参考手册》
User | 普通用户模式,linux应用程序运行在该模式 |
:------- | :---: |
FIQ | 快速中断模式 |
IRQ | 通用中断模式 |
SVC | 管理模式,上电之后默认的模式,用于操作系统运行,比如Linux内核 |
Abort | 终止模式,用于虚拟内存管理和内存数据访问保护,当用户访问非法地址时会进入该模式,比如segment fault |
Undefined | 未定义模式,用于支持硬件协处理器的软件仿真,CPU在指令的译码阶段不能识别该指令操作时,会进入该模式 |
System | ARMv4及以上才有,运行特权级别的操作系统任务 |
ARM共有7组共37个寄存器,其中有31个通用状态寄存器,以及6个程序状态寄存器。
R13通常用来保存栈地址(SP),R14用来保存子函数的返回地址(LR),或是异常发生时的异常跳转地址。
CPSR程序状态寄存器,SPSR用于在异常模式下保存CPSR的值,便于在异常结束后恢复CPSR的值。
根据指令中给出的信息来找到指令所需要操作数的方式。
操作数本身就在指令中,以#号开头
ADD R0, R0, #0x3f ;R0<-R0 + 03f |
操作数放在寄存器中,效率较高
ADD R0, R1, R2 ;R0<-R1 + R2 |
寄存器中存放的是操作数在内存中的地址
LDR R0, [R2] ;R0<-[R2] |
将寄存器中的内容(基地址)与指令中给出的地址偏移量相加,从而得到操作数在内存中的地址
LDR R0, [R1, #4] ;R0<-[R1 + 4] |
PC指针的当前值作为基地址,指令中的地址标号作为偏移量,将两者相加之后得到操作数的有效地址
BL NEXT ;跳转到子程序NEXT处执行 ... NEXT: ... MOV PC, LR ;从子程序返回 |