8.1 ARM指令有哪几种寻址方式?试分别说明。
ARM指令系统支持的常见寻址方式有:
寄存器寻址:
1. 操作数存放在寄存器中;
2.指令地址码字段给出寄存器编号(名);
3.指令执行时直接取出寄存器值来操作;
立即寻址:
1. 操作数包含在指令当中;
2. 指令地址码部分就是数据本身;
3. 取指时就取出了可立即使用的操作数;
寄存器间接寻址:
寄存器移位寻址
1. 操作数存放在寄存器中;
2.指令地址码字段给出寄存器编号(名)及移位表达式;
3.指令执行时取出寄存器值并移位,再将结果作为源操作数;
寄存器间接寻址:
1. 操作数存放在内存单元中;
2.指令地址码字段给出 [寄存器编号(名)];
3.指令执行时根据寄存器值(指针)找到相应的存储单元;
基址变址寻址
1. 操作数存放在内存单元中;
2.指令地址码字段给出 [寄存器编号(名)]和偏移量;
3.指令执行时将基址寄存器的内容与偏移量(<4K)相加/减,形成操作数的有效地址。
4. 常用于查表、数组操作、功能部件寄存器访问等。
多寄存器寻址/块复制寻址:
1. 操作数存放在内存单元中;
2.指令地址码字段给出 {寄存器编号(名)列表};
3.编号高的寄存器总是对应内存中的高地址单元;
4. 可完成存储块和16个寄存器或其子集之间的数据传送。
堆栈寻址:
1. 操作数存放在内存栈顶单元中;
2.指令地址码字段固定使用栈顶指针SP;
3.指令执行时同多寄存器/块寻址,可完成多个数据的入栈和出栈;
相对寻址:
1. 操作数为指令存放地址;
2.指令地址码字段为地址偏移量;
3.指令执行时同基址寻址,由PC提供基地址根据偏移量完成跳转;
8.2 指出下列指令操作数的寻址方式。
1)MOVE R1,R2 寄存器直接寻址
2)SUBS R0,R0, #2 立即寻址
3)SWP R1,R1,[R2] 寄存器间接寻址
4)STR R1,[R0,#-4]! 基址变址寻址