寻址方式
数据都存在存储器中,寻址简单地说就是找到存储数据或指令的地址。存储器有很多存储单元,用于存储数据。或者说,寻址就是读取数据所在储存装置中对应地址编号中存储的内容;寻址方式是指某一个CPU指令系统中规定的寻找操作数所在地址的方式,或者说通过什么的方式找到操作数。寻址方式的方便与快捷是衡量CPU性能的一个重要方面.
1.立即数寻址:
操作数在指令中,如: ADD R0,R0,#10 —->R0 = R0 + 10
2.寄存器寻址:
利用寄存器中的值作为操作数,如:ADD R0,R1,R2 —->R0 = R 1 + R 2
3.寄存器移位寻址:
寄存器中的值移位后得到操作数,用到桶形移位器
介绍一下桶形移位器:
LSL:(逻辑左移),相当于无符号数x2;
ASR: (算术右移),相当于带符号的数除2;
LSR: (逻辑右移),相当于无符号数除2;
ROR:(循环右移),相当于位轮换;
RRX:(带扩展的循环右移),位轮换,从CF到MSB都参与;
如:ADD R0,R1,R2,LSL #2 ——–>R0 = R1 + R2<<2;
4.寄存器间接寻址:
寄存器中的值作为操作数的地址,操作数本身放在存储器中;
如:LDR R0,【R1】 —->R0 = 【R1】,取出R1存的地址中的值,赋给R0;
5.基址变址寻址:
基址寄存器的内容与指令中的偏移量相加,得到有效操作数的地址,然后访问该地址空间;
分三种:
1)、前索引:
如:LDR R0,【R1,#4】 —>R1存的地址+4,访问新地址里面的值,放到R0;
2)、自动索引:
如:LDR R0, 【R1,#4】! —>在前索引的基础上,新地址回写进R1;注:!表示回写地址:R1的存储地址在原来基础上加4;
3)、后索引:
如:LDR R0 【R1】,#4 —>R1存的地址的内容写进R0,R1存的地址+4再写进R1;
6.多寄存器寻址:
一条指令完成多个寄存器的传送,最多16个寄存器;
如:STMxx R0!,{R1-R5}
注:xx是IDAB的任意组合:I-增;D-减;A-后;B-先;
执行这类指令要考虑如下几个问题:
1)、基址寄存器指向原始地址有没有放一个有效值?
2)、寄存器列表哪个寄存器被最先传送?
3)、存储器地址增长方向?
4)、指令执行完成后,基址寄存器有没有指向一个有效值?
如:STMIA R0!,{R1-R5} 的答案分别是:有;R1;低-高;没有。
为什么要考虑这么多,因为涉及到数据还原的问题;
如:STMIB r0!,[r1-r5] <