寄存器寻址方式
目前ARM处理器支持9种寻址方式,分别是立即数寻址、寄存器寻址、寄存器偏移寻址、寄存器间接寻
址、基地址变址寻址、多寄存器寻址、相对寻址、堆栈寻址和块拷贝寻址。
3.1 立即数寻址
也叫立即寻址,操作数包含在指令中,只要取到了指令也就取到了操作数。如:
mov r0, #64
add r0, r0, #1 等等
要求立即数以“#”为前缀。
3.2 寄存器寻址
类似立即数寻址,寄存器寻址的方式就是寄存器编号包含在指令中,取到寄存器编号再到相应寄存器取
到操作数。如:
mov r0, #64 立即数寻址
mov r1, r0 寄存器寻址
3.3 寄存器偏移寻址
在寄存器寻址得到操作数后再进行位移操作,得到最终的操作数。
LSL(逻辑左移):寄存器中字的低端空出的位补0
LSR(逻辑右移):寄存器中字的高端空出的位补0
ASL(算术左移):寄存器中字的低端空出的位补0,与逻辑左移相同
ASR(算术右移):符号位不变,如果是正数则高端空出的位补0,否则补1
ROR(循环右移):字的低端移出的位填入字的高端空出的位
RRX(带扩展循环右移):操作数右移一位,高端空出的位用进位标志C的值来填充,低端溢出的位填入进位标志。
如:
mov r0, r2, lsr #3 //r2的值右移3位然后赋值给r0,lsr和#3之间没有逗号
mov r0, r2, lsl r1 //r2的值左移r1位,然后放入r0
3.4 寄存器间接寻址
使用寄存器中的值作为地址,通过地址取得操作数
str:存储
ldr:加载
str r1, [r2] // [r2]<-r1,*(int *)r2 = r1 把r1的值放入到r2的值表示的地址空间中
ldr r1, [r2] // r1<-[r2],r1 = *(int *)r2 把r2的值作为地址的空间内容赋给r1
3.5 寄存器基址变址寻址
将寄存器(基址寄存器)中的值与指令中给出的地址偏移量相加,得到一个新的地址,通过这个地址取得操作数。
str r1, [r2, #4] // *((int *)(r2+4)) = r1 把r1的值放入到r2+4的值作为地址的空间中去
ldr r1, [r2, #4]! // r1 = *((int *)(r2+4)) 把r2的值加上4作为地址,该空间里面的内容赋给r1寄存器,并且最 后r2的内容也要被修改为原内容加4(带感叹号的作用),不带感叹号就不改变参与变址运算的寄存器内容数组遍历的时候经常用到,如果往前遍历只需要[r1, #-4]!
注:32位寄存器就是4字节,就是int *
3.6 多寄存器寻址
一次完成多个寄存器值的传送。
LDM/STMxx 表示加载/存储多个寄存器内容,xx有多种类型
如:ldmia r0, {r1, r2, r3} //r1<-[r0], r2<-[r0+4], r3<-[r0+8]
该指令IA表示每次执行完加载操作后,r0是基地址,并且r0按字长度增加,所以指令可将连续存储单元
的值传送到r1~r3
ldmia r0, {r1-r3} //操作同上,方便处理很多个寄存器
一般的出入栈:
关于堆栈:
LDM/STMxx中,xx的8种类型:
\1. IA 每次传送后地址加4
\2. IB 每次传送前地址加4 //1 2的处理先后顺序不同
\3. DA 每次传送后地址减4
\4. DB 每次传送前地址减4
\5. FD 满递减堆栈
\6. FA 满递增堆栈
\7. ED 空递减堆栈
\8. EA 空递增堆栈
#存 = 入栈,取 = 出栈
可以认为:STMFD等价于STMDB
ldmfd sp!, {r0,r1,r2} //表示将sp指向空间内容赋给r0到r2,sp参与运算后自行递增(入栈
减出栈增)
stmfd sp!, {r0-r7,r9-r12} //表示将r0到r12除了r8的寄存器内容入栈,sp参与运算后自行递减
递减栈:入栈时,栈顶指针的移动方向是从高地址到低地址;出栈时,栈顶指针从低到高地址移动
递增栈:入栈时,栈顶指针的移动方向是从低地址到高地址;出栈时,栈顶指针从高到低地址移动
栈的生长方向不同
满栈:栈顶指针指向有内容的地址,所以入栈时需要先移动指针再存数据,出栈时先出数据再移动指针
空栈:栈顶指针指向无内容的地址,所以如展示需要先存放数据再移动指针,出栈时先移动指针再存放数据
#栈顶指针何时移动的次序不同#
满增栈(FA):sp指针指向最后一个内容的空间,栈的生长方向是从低地址到高地址
满减栈(FD):sp指针指向最后一个内容的空间,栈的生长方向是从高地址到低地址
空增栈(EA):sp指针指向下一个数据要存放的地址,栈的生长方向是从低地址到高地址
空减栈(ED):sp指针指向下一个数据要存放的地址,栈的生长方向是从高地址到低地址
#满减栈经常使用#
4.伪指令
不是CPU自带的
mov r0, #0xfff00000 // mov r0, #0xff000000
// add r0, r0, #0xf00000
ldr r0, =0xfff00000
本文介绍了ARM处理器的9种寻址方式,包括立即数寻址、寄存器寻址、寄存器偏移寻址、寄存器间接寻址、基址变址寻址、多寄存器寻址、相对寻址、堆栈寻址和块拷贝寻址。特别讨论了寄存器偏移寻址中的位移操作和寄存器基址变址寻址中的地址计算,以及多寄存器传输在堆栈操作中的应用,如满递减栈和空递增栈的概念。此外,还提到了伪指令在编程中的作用。

被折叠的 条评论
为什么被折叠?



