考点21 ARM指令的寻址方式
- 立即寻址:也称为立即数寻址。操作数本身就在指令中给出,只寻取出指令也就取到了操作数。这个操作数称为立即数,要求以#为前缀。如MOV R0,#0x11
- 寄存器寻址:就是利用寄存器中的数值作为操作数,这种寻址方式是各类微处理器经常采用的方式,是执行效率较高的寻址方式。如ADD R0,R1,R2
- 寄存器间接寻址:就是以寄存器中的值作为操作数地址,而操作数本身存放在存储器中,用于间接寻找的寄存器必须用 [ ] 括起来。如TDR R5,[R4]
- 基址加变址寻址:就是将寄存器在(该寄存器一般称为基址寄存器)的内容与指令中给出的地址偏移量相加,从而得到一个操作数的有效地址。变址寻址方式常用于访问某基地址附近的地址单元。如LDR R0,[R1,#3]
- 相对寻址:与基址变址寻址方式相类似,相对寻址以程序计数器PC的当前值为基地址,指令中的地址标号作为偏移量,两者相加得到操作数的有效地址。
如, BL Subroutine_A ;跳转到子程序Subroutine_A执行
Subroutine_A
MOV PC,LR ;从子程序返回
6.堆栈寻址:堆栈是一种数据结构,按先进后出(FILO)的方式工作,使用一个称作堆栈指针的专用寄存器(比如R13)指示当前的操作位置,堆栈指针总指向栈顶。根据堆栈的生成方式,分为递增堆栈,递减堆栈。当堆栈由低地址向高地址生成,成为递增堆栈。反之为递减堆栈。
7.块拷贝寻址:又称为多寄存器寻址,采用多寄存器寻址方式,一条指令就可以完成多个寄存器的值的输送,这种寻址方式可以用一条指令完成传送最多16个通用寄存器的值。如,LDMIA R0,[R1,R2,R5,R9]
考点22 ARM指令集
1.数据处理类指令:分为数据传送指令、算术/逻辑运算指令、比较指令等,具体如下
2.程序状态寄存器访问指令:
- MRS —— 程序状态寄存器到通用寄存器的数据传送指令; 格式一般为MRS 【cond】Rd,<PSR>;PSR为CPSR/SPSR
- MSR —— 通用寄存器到程序状态寄存机的数据传送指令;
格式一般为 MRS 【cond】<PSR>_<fields>;fields为域
3.分支指令:
- B转移指令,是最简单的跳转指令,一旦遇到一个B指令,ARM处理器将立即跳转到给定目标地址,从那里继续执行。格式为B Label;Label为目标地址
- BX带状态切换的转移指令,BX指令跳转到指令中所指定的由寄存器Rn与0xFFFFFFFE相与后的结果所指示的目标地址,即Rn【0】并不作为目标地址,而是作为状态切换位,目标地址处理指令可以是ARM指令,也可以是Thumb指令。格式为BX{cond}<Rn>
- BL带返回的转移指令,跳转之前会在寄存器R14中保存当前PC的值。格式为BL{cond}Label
- BLX带返回且带状态切换的转移指令,从ARM指令集跳转到指令中所指定的目标地址,并将处理器的工作状态由ARM状态切换到Thumb状态,该指令同时将PC的当前内容保存到寄存器R14中。
4.加载/存储指令