LDMIA、LDMIB、LDMDB、LDMDA、STMIA、LDMFD、LDMFA、LDMED、LDMEA等指令详解
关于多寄存器加载存储指令
1.LDMIA指令、LDMIB指令、LDMDB指令、LDMDA指令
(1)LDMIA指令,IA表示每次传送后地址加4
(2)LDMIB指令,每次传送前地址加四
(3)LDMDB指令,每次传送前地址减4,这里还要注意程序中先给R5,还是先给R8,这里明显是先给R8
(4)LDMDA指令,每次传送后地址减4,这里也是先给R8,不是先给R5!!
2.下面来看看STMIA指令、STMIB指令、STMDB指令、STMDA指令
(1) STMIA指令, STMIA R0,{R1,R2,R3,R4} ;将R1—R4的数据存储到R0指向的地址上,R0的值不更新,IA传送后地址加4,所以这里内存当中的地址是从0x8004开始变化的
(2) STMIB指令, STMIB R0,{R1,R2,R3,R4} ;将R1—R4的数据存储到R0指向的地址上,R0的值不更新,IB每次传送前地址加4,所以内存中的值是从0x8008开始变化的
(3) STMDB指令, STMDB R0,{R1,R2,R3,R4} ;将R1—R4的数据存储到R0指向的地址上,R0的值不更新,DB每次传送后地址减4,所以内存中的值是从0x8010开始递减变化的,注意这里是先把表达式中的R4先给地址0x8010
(4) STMDA与上面STMDB指令类似,DA是每次传送后地址减4,我就不截图了。
下面看一下最TMD烦的的是堆栈寻址方式,依次讲解STMFD、STMED、STMFA、STMEA
1. STM加载指令
(1) STMFD意思是满堆栈递减指令,堆栈向下增长。如下图就是解释堆栈向下增长,向下增长,栈顶指针在内存中向低地址处移动,叫做向下增长,这里我为什么要先讲STMFD指令,怎么不讲LDMFD等指令呢,因为这里涉及到堆栈,向内存中写入寄存器中所存储的值,更能体现出进栈的动作,看完下面的例子,你会知道STM的后缀为什么是FD了。
关键代码:STMFDSP!,{R1-R3,R4},可以这么看,先把R4,R3,R2,R1依次压栈,至于为什么不是R1,R2,R3,R4依次压栈,因为做出的实验就不是这样的,所以R4准备进栈的时候,栈指针SP先减4,然后先把R4寄存器里面的值放到内存地址为0x803c里面,这里为什么SP要先减4呢,因为这里是满堆栈,所以要先把栈指针做出响应的变化以后,才能进行存储,至于什么是满堆栈和空堆栈,我这里就不解释了。程序效果看下图即可:
(2) 看了上面STMFD以后,现在看STMFA就很简单了:不过这里需要特别注意,这里并不是先操作R4寄存器的,而是操作R1寄存器,至于为什么,我也不知道,只是实验总结出来的,这种东西并没有什么规律可言,实验是怎么样就怎么样吧。同理的是,先把SP做相应的改变,也就是这里先SP+4=0x8044,然后把R1寄存器的值放到内存地址的0x8044处,然后R2,R3,R4依次放下去,最后改变SP的值,因为代码中多了一个感叹号STMFA SP!,{R1-R3,R4}
(3) STMED是空递减堆栈,可以看出堆栈指针一开始指在0x8040处,所以先把R4的寄存器的值放到内存单元0x8040中,这里其实也是先操作R4寄存器,至于为什么,只能说和STMFD对应的。
(4) STMEA空递增堆栈,这里我只贴图不说话,哈哈,看不懂,回家种田去
下面看看和STMFD指令相对应的LDMFD等指令,我依次讲解LDMFD、LDMFA、LDMED、LDMEA指令,至于我为什么按这种顺序讲,为了和上面的STMFD等指令联系在一起。
(1) 还记得我上面那些STM那些指令先将的是什么,对了,第一个讲的是STMFD指令,把内存中的数据批量放到寄存器中。FD为满递减堆栈。
这里值得注意的是,FD不是满堆栈递减吗,为什么程序执行完以后SP是增加的,在没有执行MOVR9, SP这条指令之前,FD确实代表是递减的意思,这里因为sp栈顶指针实际上是增加,至于为什么不写LDMFA,只不过这样LDMFD能和STMFD指令对应,看起来顺眼点吧,其实这里我要说明的是STMDB并不是和LDMDB对应,而是和LDMIA对应的,这里注意一下就行了,以后程序编多了,直接就记住了,不过你只要原理懂了,管它怎么写呢。
(2) 那自然地下面就讲LDMFA指令了:同理的嘛!!
(3) LDMED指令:依葫芦画瓢
(4) LDMEA指令:就不写了,吃饭去了!!!
最后注意的一点就是这里的SP指针是我假定的一个值,如果你以后写arm代码,调用C函数的时候,用到栈指针,系统会自动分配,就不存在sp是否非法的问题,什么是非法问题呢?先举个例子,看下图,这里对应的SP是0x8020,并且是满递减,把寄存器的值写到内存当中,我明明写的是STMFDSP!,{R1-R3,R4},把4个寄存器的内容写到内存中,可是最后就存了两个,因为你0x8018的地址处之前可能代码段的内容就存入在那里,所以你就不能改了,获取你这时候把这个不能写入的内存地址是可以读取到寄存器中的,我没试过,有兴趣可以试试。所以在用STM指令的时候要注意这点了!!
LDMIA、LDMIB、LDMDB、LDMDA、STMIA、LDMFD、LDMFA、LDMED、LDMEA等指令详解相关推荐
- ARM STMFD, STMFA, STMED, STMEA, LDMFD, LDMFA, LDMED, LDMEA
LDM是出栈指令,STM是入栈指令 ED表示empty descending空递减, FA表示full ascending满递增.同理可知其它组合 STMED表示空递减入栈,相当于STMDA指令,即d ...
- 秒懂 堆栈寻址 STMFA STMFD LDMFA LDMED( ARM中的汇编指令)
走过路过的朋友不要错过,看一看点个赞,如果评论更喜欢.
- ARM Cortex M3指令集
一.跳转指令 跳转指令用于实现程序流程的跳转,在ARM 程序中有两种方法可以实现程序流程的跳转: Ⅰ.使用专门的跳转指令. Ⅱ.直接向程序计数器PC 写入跳转地址值. 通过向程序计数器PC 写入跳转地 ...
- 【单片机】汇编指令入门学习|单片机启动代码汇编
目录 汇编指令入门学习 [汇编指令]MSP430汇编指令 IAR下的汇编/单片机启动代码汇编 ARM 汇编&ARM 指令集 学习笔记 汇编指令入门学习 在进行汇编程序设计时,MSP430 ...
- ir指令、立即数的作用_ARM-汇编指令集(总结)
ARM汇编指令集 指令.伪指令 (汇编)指令: 是机器码的助记符,经过汇编器编译后,由CPU执行. (汇编)伪指令:用来指导指令执行,是汇编器的产物,最终不会生成机器码. 有两种不同风格的ARM指令 ...
- 01 ARM体系结构与汇编指令
注:本文章是由笔者学习朱有鹏arm的学习笔记,特此感谢朱老师. 关于汇编: 1.汇编的实质是机器指令(机器码)的 助记符,是一款CPU的本质特征. 2.不同CPU的机器指令集设计不同,因此 汇编程序不 ...
- LDM与STM指令详解
title: LDM与STM指令详解 date: 2019/2/26 17:58:00 toc: true --- LDM与STM指令详解 指令形式如下,这里的存储方向是针对寄存器的 Load Mul ...
- LDMFA,LDMFD,STMFA,STMFD,LDMEA,LDMED,STMEA,STMED
多寄存器和堆栈寻址的用途: 多寄存器寻址:LDMIA,LDMIB,STMIA,STMIB,LDMDA,LDMDB,STMDA,STMDB: 堆栈寻址:LDMFA,LDMFD,STMFA,STMFD,L ...
- stmdb和ldmia
stmdb:db(decrease before)表示先减后存. 指令 stmdb sp!, { fp, ip, lr, pc} %% "!"表示sp等于最终被修改的sp的值. ...
最新文章
- iBatis自动生成的主键 (Oracle,MS Sql Server,MySQL)【转】
- 【转】Win7+Ubuntu12.04.1硬盘安装错误及解决方案----不错
- Java开发者 IntelliJ IDEA 转换 VScode 时的优缺点
- Android: 启动另外的APP及传递参数(转)
- Windows10下安装QT5.14.2并用VS2019打开
- Linux命令之乐--sed
- python赋值语句的作用_Python之语句与函数
- Idea下springboot+easyUI的下载与集成
- 美国知名DJ 3LAU以1160万美元出售全球首套音乐专辑NFT藏品
- 控制div的大小自适应_干货 | 浅谈模糊自适应PID控制
- 年审是当月还是当天_汽车年检提前检车的日期是按原始的还是按检车当月的?...
- 云网络被广泛应用 企业SaaS选型面临五大安全问题
- c语言答案计算鸡兔同笼,鸡兔同笼-题解(C语言代码,思路清晰,简单易懂)
- 知弥深度清理大师隐私政策
- Ubuntu 20.04换阿里源
- 关心一下开放源码的许可证
- 生成器之Send方法--python
- linux android V4l2 的一些精品文章连接
- 图显系统DRM GEM完全解析
- 一款小而实用的屏幕录制生成gif开源工具---ScreenToGif
热门文章
- comon lisp标准_common-lisp – Common Lisp的最新标准
- 高通骁龙765/骁龙765G芯片参数分析介绍
- 划水小老虎的mysql学习路线
- react中使用AlipayJSBridge 支付宝支付调用接口在H5网页的应用
- 真无线蓝牙耳机哪个延迟最低?低延迟蓝牙耳机推荐
- python基础选择题库_智慧树题库Python基础期末答案2020年免费
- HAKE笔记:Learning Hierarchy-Aware Knowledge Graph Embeddings for Link Prediction
- Testin云测平台
- 『Python核心技术与实战』pandas.DataFrame()函数介绍
- 腾讯云HiFlow场景连接器