ARM处理器的八种寻址方式:
前言:1.什么是寻址?数据都存在存储器中,寻址简单地说就是找到存储数据或指令的地址。存储器有很多存储单元,用于存储数据。或者说,寻址就是读取数据所在储存装置中对应地址编号中存储的内容。以存储单位寻址分为位,字,节,字,双字寻址。以功能寻址分为直接寻址,间接寻址,寄存器寻址。寻址就是为运算和执行命令。
2.什么是寻址方式?通常是指某一个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;
注:!表示回写地址
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]
LDMda r0! , [r1-r5] ------还原
7.相对寻址:
pc当前值位基址,指令中值为偏移量,相加作为操作数的地址;
如 B/BL 不过有范围限制 pc+-32Mbytes
8.堆栈寻址:
先进先出的原则;
如:STMxx SP! (r0 - r12) --- xx是FEAD的任意组合,不过规定只用fd;
4中堆栈方式:F-满;E-空;A-后;B-先;
如:入栈:STMfd SP!,(r0-r12)
出栈:LDMfd SP! ,(r0-r12)