关于多寄存器加载存储指令

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等指令详解相关推荐

  1. ARM STMFD, STMFA, STMED, STMEA, LDMFD, LDMFA, LDMED, LDMEA

    LDM是出栈指令,STM是入栈指令 ED表示empty descending空递减, FA表示full ascending满递增.同理可知其它组合 STMED表示空递减入栈,相当于STMDA指令,即d ...

  2. 秒懂 堆栈寻址 STMFA STMFD LDMFA LDMED( ARM中的汇编指令)

    走过路过的朋友不要错过,看一看点个赞,如果评论更喜欢.

  3. ARM Cortex M3指令集

    一.跳转指令 跳转指令用于实现程序流程的跳转,在ARM 程序中有两种方法可以实现程序流程的跳转: Ⅰ.使用专门的跳转指令. Ⅱ.直接向程序计数器PC 写入跳转地址值. 通过向程序计数器PC 写入跳转地 ...

  4. 【单片机】汇编指令入门学习|单片机启动代码汇编

     目录 汇编指令入门学习 [汇编指令]MSP430汇编指令 IAR下的汇编/单片机启动代码汇编 ARM 汇编&ARM 指令集 学习笔记 汇编指令入门学习   在进行汇编程序设计时,MSP430 ...

  5. ir指令、立即数的作用_ARM-汇编指令集(总结)

    ARM汇编指令集 指令.伪指令 (汇编)指令: 是机器码的助记符,经过汇编器编译后,由CPU执行. (汇编)伪指令:用来指导指令执行,是汇编器的产物,最终不会生成机器码. 有两种不同风格的ARM指令 ...

  6. 01 ARM体系结构与汇编指令

    注:本文章是由笔者学习朱有鹏arm的学习笔记,特此感谢朱老师. 关于汇编: 1.汇编的实质是机器指令(机器码)的 助记符,是一款CPU的本质特征. 2.不同CPU的机器指令集设计不同,因此 汇编程序不 ...

  7. LDM与STM指令详解

    title: LDM与STM指令详解 date: 2019/2/26 17:58:00 toc: true --- LDM与STM指令详解 指令形式如下,这里的存储方向是针对寄存器的 Load Mul ...

  8. LDMFA,LDMFD,STMFA,STMFD,LDMEA,LDMED,STMEA,STMED

    多寄存器和堆栈寻址的用途: 多寄存器寻址:LDMIA,LDMIB,STMIA,STMIB,LDMDA,LDMDB,STMDA,STMDB: 堆栈寻址:LDMFA,LDMFD,STMFA,STMFD,L ...

  9. stmdb和ldmia

    stmdb:db(decrease before)表示先减后存. 指令 stmdb sp!, { fp, ip, lr, pc}  %% "!"表示sp等于最终被修改的sp的值. ...

最新文章

  1. iBatis自动生成的主键 (Oracle,MS Sql Server,MySQL)【转】
  2. 【转】Win7+Ubuntu12.04.1硬盘安装错误及解决方案----不错
  3. Java开发者 IntelliJ IDEA 转换 VScode 时的优缺点
  4. Android: 启动另外的APP及传递参数(转)
  5. Windows10下安装QT5.14.2并用VS2019打开
  6. Linux命令之乐--sed
  7. python赋值语句的作用_Python之语句与函数
  8. Idea下springboot+easyUI的下载与集成
  9. 美国知名DJ 3LAU以1160万美元出售全球首套音乐专辑NFT藏品
  10. 控制div的大小自适应_干货 | 浅谈模糊自适应PID控制
  11. 年审是当月还是当天_汽车年检提前检车的日期是按原始的还是按检车当月的?...
  12. 云网络被广泛应用 企业SaaS选型面临五大安全问题
  13. c语言答案计算鸡兔同笼,鸡兔同笼-题解(C语言代码,思路清晰,简单易懂)
  14. 知弥深度清理大师隐私政策
  15. Ubuntu 20.04换阿里源
  16. 关心一下开放源码的许可证
  17. 生成器之Send方法--python
  18. linux android V4l2 的一些精品文章连接
  19. 图显系统DRM GEM完全解析
  20. 一款小而实用的屏幕录制生成gif开源工具---ScreenToGif

热门文章

  1. comon lisp标准_common-lisp – Common Lisp的最新标准
  2. 高通骁龙765/骁龙765G芯片参数分析介绍
  3. 划水小老虎的mysql学习路线
  4. react中使用AlipayJSBridge 支付宝支付调用接口在H5网页的应用
  5. 真无线蓝牙耳机哪个延迟最低?低延迟蓝牙耳机推荐
  6. python基础选择题库_智慧树题库Python基础期末答案2020年免费
  7. HAKE笔记:Learning Hierarchy-Aware Knowledge Graph Embeddings for Link Prediction
  8. Testin云测平台
  9. 『Python核心技术与实战』pandas.DataFrame()函数介绍
  10. 腾讯云HiFlow场景连接器