|
沙发

楼主 |
发表于 2009-8-1 22:14:57
|
只看该作者
ARM 指令寻址方式
1、立即数寻址
操作数就在指令中给出,只要取出指令也就取到了操作数,这个操作数被成为立即数。ADD R0, R0, #1 ; R0 <- R0 + 1
ADD R0, R0, #0x3A ; R0 <- R0 + 0x3A 上面指令中,第 2 个源操作数为立即数。
2、寄存器寻址
寄存器寻址,即利用寄存器中的数值作为操作数。ADD R0, R1, R2 ; R0 <- R1 + R2 该指令将寄存器 R1 和 R2 的内容想家,结果存在 R0 中。
3、寄存器间接寻址
寄存器间接寻址就是以寄存器中的值作为操作数的地址,而操作数本身存放在存储器中。
ADD R0, R1, [R2] ; R0 <- R1 + [R2]
LDR R1, [R1] ; R0 <- [R1]
第 1 条指令,以寄存器 R2 的内容作为操作数的地址,然后与 R1 相加,其结果存入寄存器 R0 中。
第 2 条指令,以 R1 的值为地址的寄存器中的内容送到 R0 中。
4、基址变址寻址
基址变址的寻址方式就是将寄存器 ( 该寄存器一般称作基址寄存器 )的内容与指令中给出的地址偏移量相加,从而得到一个操作数的有效地址。
LDR R0, [R1, #0x0A] ; R0 <- [R1 + 0x0A]
LDR R0, [R1, #0x0A]! ; R0 <- [R1 + 0x0A] , R1 <- R1 + 0x0A 第 1 条指令,将寄存器 R1 的内容加上 0x3A 形成操作数有效地址,然后将该地址处的操作数送往 R0 中。
第 2 条指令,将寄存器 R1 的内容加上 0x3A 形成操作数有效地址,然后将该地址处的操作数送往 R0 中,最后 R1 + 0x0A 的值还存往 R1中,R1得到更新。
5、多寄存器寻址
多寄存器寻址,一条指令可以完成多个寄存器值的传送。这种寻址方式可以用一条指令玩成传送最多 16 个通用寄存器的值。LDMIA R0, {R1, R2, R3,R4} ; R1 <- [R0]
; R2 <- [R0 + 4]
; R3 <- [R0 + 8]
; R4 <- [R0 + 12] 该指令的后缀 IA 是“ Increment After ” 之意,表示每次执行完加载/存储操作后,R0 按字长度增加,因此,指令可将连续存储单元的值传送到 R1~R4 。
6、相对寻址
与基址寻址方式相似,相对寻址以程序计数器 PC 的当前值为基地址,指令中的地址标号作为偏移量,将两者相加后得到的操作数作为有效地址。 BL NEXT ; 跳转到子程序 NEXT 处执行
... ...
NEXT
... ...
MOV PC, LR ; 从子程序返回
7、堆栈寻址
根据堆栈的生成方式,堆栈分为递增堆栈 (Ascending Stack),和递减堆栈 (Decending Stack),当堆栈由低地址向高地址生成时,称为递增堆栈;当堆栈由高地址向低地址生成时,称为递减堆栈。这样就有 4 种堆栈工作方式:
(1) 满递增堆栈:堆栈指针指向最后压入的数据,并且堆栈以递增方式向上生成。
(2) 满递减堆栈:堆栈指针指向最后压入的数据,并且堆栈以递减方式向下生成。
(2) 空递增堆栈: 堆栈指针指向下一个将要放入数据的空位置,且由低地址向高地址生成。
(3) 空递减堆栈: 堆栈指针指向下一个将要放入数据的空位置,且由高地址向低地址生成。 |
|