三、ARM寻址方式

0、寻址方式
寻址方式就是 处理器根据指令中给出的地址信息来寻找物理地址的方式。

1、立即寻址
立即寻址也叫立即数寻址,这是一种特殊的寻址方式,操作数本身就在指令中给出,只要取出指令也就去到了操作数。这个数被称为立即数,对应的寻址方式也叫做立即寻址。例如:
        ADD R0, R0, #1 ;R0<--R0 + 1
        ADD R0, R0, #0x3f ;R0 <--R0 + 0x3f
以上两条指令中,第二个源操作数即立即数,要求以“ # ”位前缀,对于以十六进制表示的立即数,还要求在“ # ”后加上“ 0x ”或“ & ”

2、立即寻址
寄存器寻址就是 利用寄存器中的数值作为操作数 ,这种寻址方式是各类微处理器经常采用的一种方式,也是一种执行效率较高的寻址方式。
        ADD R0, R1, R2 ; R0 <-- R1 + R2
该指令的执行效果是将寄存器R1和R2的内容相加,其结果存放在R0中。

3、寄存器间接寻址
寄存器间接寻址就是 以寄存器中的值作为操作数的地址,而操作数本身存放在 存储器
例如以下指令:
        ADD R0, R1, [R2] ; R0 <-- R1 + [R2]
        LDR R0, [R1] ; R0 <-- [R1]
在第一条指令中,以寄存器R2的值作为操作数的地址,在存储器中取得一个操作数后与R1相加,结果存在寄存器R0中。
第二条指令将以R1的值为地址的存储器中的数据传送到R0中。

4、基址变址寻址
基址变址寻址就是 将寄存器(该寄存器一般称作基址寄存器)的内容与指令中给出的地址偏移量相加,从而得到一个操作数的有效地址L
        LDR R0, [R1, #4] : R0 <-- [R1 + 4]
        LDR R0, [R1, #4] ! : R0 <-- [R1 + 4]、 R1 <-- R1 + 4
        LDR R0, [R1], #4 : R0 <-- [R1] 、R1 <-- R1 + 4
        LDR R0, [R1, R2] : R0 <-- [R1 + R2]

5、多寄存器寻址
采用多寄存器寻址方式, 一条指令可以完成多个寄存器值的传送 。这寻址方式可以用一条指令完成传送最多16个通用寄存器的值。以下指令:
        LDR IA R0, {R1, R2, R3, R4} ; R1 <-- [R0]
         ; R2 <-- [R0 + 4]
         ; R3 <-- [R0 + 8]
         ; R4 <-- [R0 + 12]
该指令的后缀 IA 表示在每次执行完加载/存储操作后,R0按字长度增加,因此,指令可将连续存储单元的值传送到R1 ~ R4。

6 、相对寻址
与基址变址寻址方式类似,相对寻址 以程序计数器 PC 的当前值为基地址,指令中的地址标号作为偏移量,将两者相加之后得到操作数的有效地址 。以下程序段完成子程序的调用和返回,跳转指令 BL 采用了相对寻址方式:
        BL NEXT ; 跳转到子程序NEXT处执行
        ......
        NEXT
        ......
        MOV PC, LR ;从子程序返回

7、堆栈寻址
堆栈是一种数据结构,按先进后出( First In Last Out,FILO )的方式工作,使用一个称作堆栈指针的专用寄存器指示当前的操作位置,堆栈指针总是指向栈顶。
        递增 堆栈:向 高地址 方向生长
        递减 堆栈:向 低地址 方向生长
        满 堆栈:堆栈指针指向 最后压入堆栈的有效数据项
        空 堆栈:堆栈指针指向下一个要放入数据的 空位置

猜你喜欢

转载自blog.csdn.net/life_hello/article/details/79992926