ARM处理器的八种寻址
1. 立即数寻址
add,r0,r0,#1
2. 寄存器寻址
addr0, r1, r2
3. 寄存器间接寻址:以寄存器中的值作为操作数的地址
Ldrr0, [r1]
4. 寄存器移位寻址
movr1,#7
movr2,#1
addr0, r1, r2 ,lsl #2
5. 基址变址寻址: 将基址寄存器的内容与指令中给出的偏移量相加,得到一个有效的操作地址。通常用于访问连续的地址空间。
三种索引方式:
前索引 ldr r0, [r1, #4];将r0中的值传递给r1中的值+4的地址,r1中的值保持不变,示例代码如下:
ldrr1,=0x40000000
movr2,#0x1
strr2,[r1,#4]
自动索引 ldr r0, [r1, #4]!;将r0中的值传递给r1中的值+4的地址,r1中的值变为r1中的值+4,示例代码如下:
ldrr1,=0x40000000
movr2,#0x1
strr2,[r1,#4]!
后索引 ldr r0, [r1],#4;将r0中的值传递给r1中的值的地址,r1中的值变为r1中的值+4,示例代码如下:
str r2,[r1],#4
6. 多寄存器寻址:可以实现一条指令完成多个寄存器值的传送,最多一次传送16个通用寄存器的值,连续的寄存器用‘-’连接,否则用逗号分隔。Xx可以是ia,ib,da,db
ia 每次传递后地址+1
示例代码如下:
ldrr1,=0x40000000
movr2,#0x1
movr3,#0x2
movr4,#0x3
movr5,#0x4
stmiar1!,{r2-r5}
7. 相对寻址,如下代码:
blable
lable:
8. 堆栈寻址: 堆栈寻址是一种数据结构,按先进先出的方式操作,r13(sp)寄存器指示当前的栈顶位置,arm支持4种堆栈操作方式ia,ib,da,db。
入栈:stmfd sp!, {r0-r12}
出栈:ldmfd sp!,{r0-r12}
示例代码如下:
ldrsp,=0x40001000
movr1,#0x1
movr2,#0x2
movr3,#0x3
movr4,#0x4
stmfdsp!,{r1-r4}
示例:使用堆栈寻址实现保存调用函数时的返回地址和通用寄存器值。
area example,code,readonly
entry
start
;初始化堆栈值
ldrsp,=0x40001000
movr1,#0x1
movr2,#0x2
movr3,#0x3
movr4,#0x4
blfunc1
bover
func1
;保存返回地址和通用寄存器值到栈种
stmfdsp!,{r1-r4,lr}
mov r1,#0xf
movr2,#0xf
movr3,#0xf
movr4,#0xf
blfunc2
;将栈中值弹出到通用寄存器中,而且将lr值直接放在pc中,实现返回
ldmfdsp!,{r1-r4,pc}
func2
;如上
stmfdsp!,{r1-r4,lr}
mov r1,#0xe
movr2,#0xe
movr3,#0xe
movr4,#0xe
;如上
ldmfdsp!,{r1-r4,pc}
over
bover
end