ARM寻址方式
ARM寻址方式
1、 ARM寻址方式比较灵活;ARM寻址方式比较多,根据不同情况来选择;
所谓ARM寻址方式就是处理器根据指令中给出的地址信息来寻找物理地址的方式;
立即寻址:
操作数本身就在指令中给出;只要取出指令也就是取到了操作数。这个操作数被称为立即数,对应的寻址方式也就叫做立即寻址。
例如:
ADD R0, R0, #1; R0<-R0+1
(R0+1的值赋给R0,#表示立即数);
ADD R0, R0, #0x3f;R0<-R0+0x3f
寄存器寻址:
寄存器寻址就是利用寄存器中的数值作为操作数,这种寻址方式是各类微处理器经常采用的一种方式,也是一种执行效率较高的寻址方式。
ADD R0,R1,R2; R0<-R0+R2
该指令执行的效果是将寄存器R1和R2的内容相加,其结果放在寄存器R0中;
寄存器间接寻址:
寄存器间接寻址就是以寄存器中的值作为操作数的地址,而操作数本身存放在存储器中。
例如:
ADD R0,R1,[R2] ;R0<-R1+[R2]
LDR R0,[R1]; R0<-[R1](将R1的值为地址的存储器中的数据传送到R0中。)
基址变址寻址:
基址变址寻址就是将寄存器(该寄存器一般称作基址寄存器)的内容与指令中给出的地址偏移量相加,从而得到一个操作数的有效地址;
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]
多寄存器寻址:
多寄存器寻址方式就是一条指令可以完成多个寄存器值的传送;这种寻址方式可以用一条指令完成传送最多16个通用寄存器的值、以下指令:
LDMIA R0, {R1,R2,R3,R4}; R1<-[R0]
; R2<-[R0+4]
; R3<-[R0+8]
; R4<-[R0+12]
该指令的后缀IA表示每次执行完加载/存储操作后,R0按字长度增加,因此,指令可将连续存储单元的值传送到R1~R4。
相对寻址:
相对寻址与基址变址方式相类似。相对寻址以程序计数器PC的当前值为基地址,指令中的地址标号作为偏移量,将两者相加之后得到操作数的有效地址。以下程序完成子程序的调用和返回,跳到指令BL采用了相对寻址方式:
BL NEXT ; 跳转到子程序NEXT处执行
…..
NEXT…..
…..
MOV PC, LR ;从子程序返回
堆栈寻址
堆栈是一种数据结构,按先进后出(First In Last Out,FILO)的工作方式,使用一个称作堆栈指针的专用寄存器指示当前的操作位置,堆栈指针总是指向栈顶。
递增堆栈:向高地址方向生长
递减堆栈:向低地址方向生长
满堆栈:堆栈指针指向最后压入堆栈的有效数据项
空堆栈:堆栈指针指向下一个要放入数据的空位置
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端