寻址方式是指根据指令中给出的地址码字段来实现寻找真实操作数地址的方式. ARM处理器共有8中基本寻址方式
1. 立即数寻址
立即寻址中, 操作码字段后面不是操作数地址而是操作数本身.
MOV R0,#0xAA
将立即数0xAA存放到寄存器R0中.

2. 寄存器寻址
操作数的值放在寄存器中, 指令中的地址码字段指出的是寄存器编号, 指令执行时直接去除寄存器的值来操作.
MOV R1,R2
将R2寄存器的值存放到R1寄存器中

3. 寄存器移位寻址
操作数先进行移位操作, 然后再与第一个操作数进行操作
MOV R0, R1, LSL #3
将R1寄存器的值左移3位, 然后放入R0寄存器中,R0=R1*23

4. 寄存器间接寻址
指令中的地址码给出的是一个通用寄存器的编号, 指令所需的操作数保存在寄存器指定地址的存储单元中, 即寄存器为操作数的地址指针.
LDR R1,[R2]
将R2指向的存储单元中的数据读出保存在R1中.

5. 基址寻址
基址寻址就是将基址寄存器的内容与指令中给出的偏移量相加, 形成操作数的有效地址. 基址寻址用于访问基址附件的存储单元, 常用于查表和数组操作.
LDR R2,[R3, #0x0C]
读取R3+0x0C地址处的数据存放到R2寄存器中.

6. 多寄存器寻址
多寄存器寻址一次可传送n个寄存器值, 允许一条指令传送16个寄存器的任何子集或所有寄存器.
LDMIA R1!,{R2-R4,R6}
将R1和R1之后寄存器中的值读出保存到R2-R4和R6中,其中R1每次自加一

7. 堆栈寻址
堆栈寻址地址是隐含的, 它使用一个专门的寄存器(堆指针)指向一块存储区域(堆栈).指针所指向的存储器单元即是堆栈的栈顶.
存储器堆栈可分为两种:
(1) 向上生长: 向高地址方向生长, 称为递增堆栈
(2) 向下生长: 向低地址方向生长, 称为递减堆栈
按堆栈指针的执行顺序分为:
(1) 满堆栈: 堆栈指针指向最后压入堆栈的有效数据 ->即当有数据入堆栈时,栈顶指针先加一, 然后数据入栈
(2) 空堆栈: 堆栈指针指向下一个待压入数据的空位置 -> 即当有数据入堆栈时,数据先入栈, 然后栈顶指针再加一

8. 相对寻址
相对寻址是基址寻址的另一种形式. 由程序计数器PC提供基准地址, 指令中的地址码字段作为偏移量, 两者相加后得到的地址即为操作数的有效地址.
浙公网安备 33010602011771号