ARM的九种寻址方式
文章目录
- 1.立即数寻址
- 2.寄存器寻址
- 3.寄存器间接寻址
- 4.寄存器偏移寻址
- 5.寄存器基址变址寻址
- 6.批量寄存器寻址
- 7.相对寻址
- 8.堆栈寻址
- 9.块拷贝寻址
寻址方式就是CPU根据指令中的地址信息,找出物理地址也就是内存地址的方式,通俗理解就是ARM指出内存地址的方式。
寻址的目的就是找出操作数,比如ARM要做一个除法运算,就需要除数和被除数,除数和被除数都是除法指令的操作数,要找到这些操作数,可以有多种方法,寻找操作数的过程就叫做寻址。(我个人理解)
ARM支持九种寻址方式:
- 立即数寻址
- 寄存器寻址
- 寄存器偏移寻址
- 寄存器间接寻址
- 寄存器基址变址寻址
- 多寄存器寻址
- 相对寻址
- 堆栈寻址
- 块拷贝寻址
1.立即数寻址
立即数寻址就是直接将内存中的数据发给CPU作为操作数。注意,由于ARM是32位指令集,所以立即数的范围不可以超出0255,也就是说立即数的范围只能是0255。
格式:就是在立即数前面加上 # 来作为操作数
典型的例子就是直接对寄存器进行写值:
ldr r0, #254 ;将254写入r0寄存器
add r1, r2, #3 ;将r2寄存器中的值与3相加后,在写入r1寄存器
2.寄存器寻址
寄存器寻址就是直接将寄存器中的数值作为操作数:
ldr r1, r0 ;将r0寄存器中的值写到r0
add r3, r2, r1 ;将r1、r2寄存器的值相加,结果写入r3寄存器
3.寄存器间接寻址
还是利用了寄存器,只不过操作数不是寄存器中的值了,操作数在内存中,那怎么办?没事,操作数的地址就在寄存器中。所以寄存器间接寻址相当于以寄存器中的值作为内存地址,去内存中寻找操作数。
格式:在提供操作数地址的寄存器上加上[],比如[r0]
mov r0, #0X54000032
ldr r1, [r0] ;将地址为0X54000032的数据写入r1寄存器中
4.寄存器偏移寻址
以寄存器寻址为本,将寄存器中的数移位后作为操作数。
一共有6中移位操作:
LSL:逻辑左移(Logical Shift Left),寄存器中字的低端空出的位补0。
LSR:逻辑右移(Logical Shift Right),寄存器中字的高端空出的位补0。
ASL:算术左移(Arithmetic Shift Left),和逻辑左移LSL相同。
ASR:算术右移(Arithmetic Shift Right),移位过程中符号位不变,即如果源操作数是正数,则字的高端空出的位补0,否则补1。
ROR:循环右移(Rotate Right),由字的低端移出的位填入字的高端空出的位。
RRX:带扩展的循环右移(Rotate Right eXtended),操作数右移一位,高端空出的位用进位标志C的值来填充,低端移出的位填入进位标志位。
格式:rx, 移位命令 移位操作数
ldr r0, r1, lsl #3 ;将r1的值逻辑左移3位后写入r0
ldr r0, r1, ror r2 ;将r1的值循环右移r2中的值对应位后,写入r0
5.寄存器基址变址寻址
基址变址寻址是基于寄存器间接寻址的,只不过地址不再是寄存器中的值了,而是偏移后的值,这里的偏移值可以理解为地址相加值。
加上感叹号应该有优先执行的意思吧(个人理解)
格式:[rx, n],表示在rx寄存器所指向的地址上,再偏移(相加)n字节
ldr r0, [r1, #3] ;地址为:r1值+3字节,指令执行完r1不变
ldr r0, [r1, #3]! ;地址为:r1值+3字节,指令执行完r1+3
ldr r0, [r1, #-1] ;地址为:r1值-1字节,指令执行完r1不变
ldr r0, [r1, r2] ;地址为:r1值+r2值
ldr r0, [r1], #4 ;地址为:r1值,但指令执行完后,r1值+4字节
6.批量寄存器寻址
批量寄存器寻址就是使用一个大括号{}包含多个寄存器
ldmia r0, {r1, r2, r3, r4} ;将r1,r2,r3,r4中的数据依次放入R0指向的内存地址,r0+4指向的内存地址...
ldmia r0, {r1-r4} ;同上。
7.相对寻址
通过标号进行寻址,经常与跳转指令相配合使用
bl heihei heihei: ;跳转到heihei执行
8.堆栈寻址
堆栈即Stack,因为CPU的寄存器总是及其有限的,很多时候我们不得不使用内存来存储数据,比如进行多级跳转的时候,这时候堆栈就是一个很好的工具,每次跳转就将当前函数的返回地址存储到内存,最底层被调用的子函数会最先返回,就先将压入栈的现场返回,以此类推…,ARM使用SP(R13)作为栈指针,ARM设计的内存栈模型有2×2=4种
按照栈在内存增长的方向分为递增栈和递减栈 :
递增(Increase) 堆栈:向堆栈写入数据时,堆栈由低地址向高地址生长。
递减(Descend) 堆栈:向堆栈写入数据时,堆栈由高地址向低地址生长。
根据堆栈指针SP指向的位置,又可以把堆栈分为满堆栈和空堆栈两种。
满堆栈(Full Stack):SP始终指向栈顶元素,压栈的时候先移动SP,再将数据放入SP指向的地址。
空堆栈(Empty Stack):SP始终指向下一个将要放入元素的位置,压栈时先将数据放入SP指向的地址,再移动SP
最后,可以得到4种基本的堆栈类型:
满增栈(FA):堆栈指针指向最后压入的数据,且由低地址向高地址生长。
满减栈(FD):堆栈指针指向最后压入的数据,且由高地址向低地址生长。常用这种
空增栈(EA):堆栈指针指向下一个将要压入数据的地址,且由低地址向高地址生长。
空减栈(ED):堆栈指针指向下一个将要压入数据的地址,且由高地址向低地址生长。
stmfd sp!, {r1-r7, lr} ;将r1到r7和lr的数据压入fd栈
9.块拷贝寻址
块拷贝寻址提供了一块内存和一组寄存器之间的拷贝,按照内存使用方式的不同,可以分为2×2=4种。地址增方向/地址减方向×先偏移/后偏移。堆栈寻址就可以看作是块拷贝寻址的的一个实例。
即:
IB:Increment Before Operating
IA:Increment After Operating
DB:Decrement Before Operating
DA:Decrement After Operating
STMIA R0!,{R1—R7} ;将R1-R7的寄存器中的值放入R0指向的地址,R0自动更新,指向操作后的地址
参考
ARM的九种寻址方式相关推荐
- ARM处理器9种基本寻址方式,和单片机微机原理寻址方式截然不同,(例如没有直接地址寻址,只能间接指针寻址或者寄存器变址寻址,立即数寻址,不是所有立即数都可直接寻址)不可套用理解。需独立学习
基本寻址方式 寻址方式是根据指令中给出的地址码字段来实现寻找真实操作数地址的方式,ARM处理器有9 种基本寻址方式. 1.寄存器寻址 操作数的值在寄存器中,指令中的地址码字段给出的是寄存器编号,寄存器 ...
- Cortex-A7 MPCore 架构详细介绍(九种运行模式、内核寄存器组R0~R15,有特定的名字和功能)
目录 0.ARM架构的历史简介 1.Cortex-A7 MPCore(即多核) 简介 2.Cortex-A 处理器九种运行模式 3.Cortex-A 寄存器组(内核寄存器) 3.1通用寄存器 3.1. ...
- uml的九种图例分析
UML图中类之间的关系:依赖,泛化,关联,聚合,组合,实现 类与类图 1) 类(Class)封装了数据和行为,是面向对象的重要组成部分,它是具有相同属性.操作.关系的对象集合的总称. 2) 在系统中, ...
- UML的九种图例详解
UML图中类之间的关系:依赖,泛化,关联,聚合,组合,实现 类与类图 1) 类(Class)封装了数据和行为,是面向对象的重要组成部分,它是具有相同属性.操作.关系的对象集合的总称. 2) 在系统中, ...
- 【转】UML的九种图例详解
UML图中类之间的关系:依赖,泛化,关联,聚合,组合,实现 类与类图 1) 类(Class)封装了数据和行为,是面向对象的重要组成部分,它是具有相同属性.操作.关系的对象集合的总称. 2) 在系统中, ...
- 机器学习博士在获得学位之前需要掌握的九种工具!
Datawhale干货 作者:Aliaksei Mikhailiuk,编辑:机器之心 无论你在创业还是在做学术研究,这些工具都将使你的技能更上一层楼. 学术界在推进技术方面发挥了巨大作用,但学术界和工 ...
- AI时代人类需要具备的九种软技能,你get了几个?
在当今这样一个人工智能.大数据和自动化的时代,技术技能和数据素养显然非常重要.但是这并不意味着我们应该忽略工作中的人的因素--机器无法很好实现的各种技能.我相信,随着工作本质的发展变化,机器承担了更多 ...
- 九种将元器件从PCB上拆焊下的方法
Proto-G 2021-01-09 Saturday 在Proto-G 的博文9 Different Desoldering Techniques 中介绍了九种从电路板上拆下元器件的方法,可以用于维 ...
- 九种食物帮你赶走忧郁
[装载] 九种食物帮你赶走忧郁 个人的喜怒哀乐与饮食有着密切的关系,有的食品能够使人快乐.安宁,有的食品则使人悲伤.忧愁.焦虑.愤怒.原因就是人体中一种称为血清素的物质有助于镇定情绪.解除焦虑,有的食 ...
- 九种浏览器端缓存机制知多少(转)
浏览器缓存(Browser Caching)是浏览器端保存数据用于快速读取或避免重复资源请求的优化机制,有效的缓存使用可以避免重复的网络请求和浏览器快速地读取本地数据,整体上加速网页展示给用户.浏览器 ...
最新文章
- Python 使用 Flask框架记录
- OpenCV中导向滤波介绍与应用
- ubuntu下使用SVN
- HBase原理解析(转)
- Win32 像素格式描述符学习
- 我为什么要这么功利?
- 使用工具快速找出custom work center使用的ui component
- HBase编程 API入门系列之create(管理端而言)(8)
- MySQL还是h5储存数据_h5中五大存储方式
- 基于TCP的Socket网络编程,有图有代码
- ASP.Net学习笔记006--Get和Post的区别
- B站在美上市 A站却为融资心塞
- 特殊时期,找工作的 9 点建议!
- 论文阅读-多任务(2020)-KL4MTL:用于多任务学习的知识蒸馏方法
- polyfit线性拟合函数
- css定义文字加粗,css文字加粗font-weight
- 读headFirst设计模式 - 装饰者模式
- 朱晔的互联网架构实践心得S2E4:小议微服务的各种玩法(古典、SOA、传统、K8S、ServiceMesh)...
- PRML读书会第五章 Neural Networks(神经网络、BP误差后向传播链式求导法则、正则化、卷积网络)...
- Windows桌面端录屏采集实现
热门文章
- 在Excel中批量生成条形码
- 文献阅读(167)NoC神经网络加速器
- Ubuntu下搜狗拼音突然无法输入中文的解决办法
- CTO也糊涂的常用术语:功能模块、业务架构、用户需求、文档……
- matlab两个力的合成与分解,[转帖]小波图像分解与合成(例子) - Matlab讨论区 - 振动论坛 动力学,噪声 -......
- vue读取服务器文件,vue读取txt文件
- Cesium中获取坐标点地形高程的方法
- 温控-Thermal
- [4G/5G/6G专题基础-157]: 无线数据承载DRB与无线信令承载SRB
- sp 导出unity哪个_SP与Unity的效果差异分析