https://blog.csdn.net/q75197694/article/details/48287781

这里比较下容易混淆的四条指令,已经在这4条指令的混淆上花费了很多精力,现在做个小结,LDR,STR,LDM,STM这四条指令,关于LDM和STM的说明,见另外一个说明文件,说明了这两个文件用于栈操作时的注意事项。

(1)LDR:L表示LOAD,LOAD的含义应该理解为:Load from memory into register。下面这条语句就说明的很清楚:

LDR   R1,     [R2]

R1<——[R2]

就是把R2所指向的存储单元的内容的值(一个memory地址内的值),读取到R1中(一个register)

(2)STR:S表示STORE,STORE的含义应该理解为:Store from a register into memory。下面这条语句表示的很清楚:

STR    R1,     [R2]

R1——>[R2]

就是把寄存器R1中的内容“保存”到R2所指向的存储的单元中(一个memory地址)。

显然,这两条语句都有个特点,就是寄存器写在前面(左边)而内存地址写在后面(右边),数据传送的方向则是恰好相反的。

下面对LDM和STM介绍,使用sp来介绍,因为实际使用中,和sp一起使用更多。

(3)LDM:L的含义仍然是LOAD,即是Load from memory into register。

虽然貌似是LDR的升级,但是,千万要注意,这个指令运行的方向和LDR是不一样的,是从左到右运行的。该指令是将内存中堆栈内的数据,批量的赋值给寄存器,即是出栈操作;其中堆栈指针一般对应于SP,注意SP是寄存器R13,实际用到的却是R13中的内存地址,只是该指令没有写为[R13],同时,LDM指令中寄存器和内存地址的位置相对于前面两条指令改变了,下面的例子:

LDMFD     SP! ,   {R0, R1, R2}

实际上可以理解为:    LDMFD     [SP]!,    {R0, R1, R2}

意思为:把sp指向的3个连续地址段(应该是3*4=12字节(因为为r0,r1,r2都是32位))中的数据拷贝到r0,r1,r2这3个寄存器中去(如果这个地方还不懂的话,可以参看我文章开头提到的链接,里面有详细的图解)

(4)STM:S的含义仍然是STORE,与LDM是配对使用的,其指令格式上也相似,即区别于STR,是将堆栈指针写在左边,而把寄存器组写在右边。

STMFD      SP!,   {R0}

同样的,该指令也可理解为:  STMFD      [SP]!,   {R0}

意思是:把R0保存到堆栈(sp指向的地址)中。

显然,这两个堆栈操作指令也有个特点,就是寄存器组写在后面(右边)而堆栈指针写在前面(左边),而且实际上使用的是堆栈指针中的内存地址,这一点与前面两条指令是有区别的。

(补充:sp后面的!,作用是指命令执行完后,对应的地址值赋给sp,对于例程的SDM,是说最后sp的值应该是sp+3*4=sp+12)

这四条指令中,前面两条和后面两条其实联系不多,反而是差别很大,因此,可以直接把这两组指令区分开来,认为它们之间没有联系,这样避免误解。

arm汇编中ldr、str、stm、ldm的用法相关推荐

  1. 汇编指令ldr str stm ldm

    ldr命令:把数据从内存加载到寄存器 ldr r0, =addr ;r0 = addr ldr r1, [r0] ; r1 = *r0 ldr r1, [r0, #4] ; r1 = *(r0+4) ...

  2. ARM汇编中ldr伪指令和ldr指令(转载)

    转自:http://blog.csdn.net/ce123_zhouwei/article/details/7182756 ARM是RISC结构,数据从内存到CPU之间的移动只能通过L/S指令来完成, ...

  3. ARM汇编中的ldr和adr的区别及其在uboot中相关源码的分析

    ARM汇编有ldr指令以及ldr.adr伪指令,它们都可以将标号表达式作为操作数,下面通过分析一段代码以及对应的反汇编结果来说明它们的区别. ldr r0, _start adr r0, _start ...

  4. 伪指令相当于c语言的什么,ARM汇编中关于“.word”伪指令的概念(转)

    PS:在u-boot源码时遇到_armboot_start._bss_start等这些变量,不知道指向什么地址,于是查了一下,弄清了ARM汇编中".word"这个伪指令是什么意思了 ...

  5. arm汇编中DCB、DCW、DCD、DCQ指令

    背景 在ida中进行分析so文件,就是elf文件,它所对应的arm汇编,在汇编中会时常碰到一些下面的汇编指令.DCB是arm汇编中的伪指令,下面就针对这个指令相关做下小记录. 伪指令及DC系列指令 A ...

  6. arm汇编中mov、movs、movw、movl、movb解析

    arm汇编中mov指令 mov 指令在汇编中表示传送含有 movl mov long : 传送字长 : 32位:把32位立即数放到寄存器 movw mov word:传送字 :16位: 把 16 位立 ...

  7. 大脸猫讲逆向之ARM汇编中PC寄存器详解

    i春秋作家:v4ever 近日,在研究一些开源native层hook方案的实现方式,并据此对ARM汇编层中容易出问题的一些地方做了整理,以便后来人能有从中有所收获并应用于现实问题中.当然,文中许多介绍 ...

  8. GUN ARM汇编中标号的引用在汇编和C语言中区别(monitor_flash_len = _bss_start - _armboot_start;)

    u-boot/cpu/xx/start.S中: _TEXT_BASE:  .word TEXT_BASE /*uboot映像在SDRAM中的重定位地址,我设置为0xa170 0000 */ .glob ...

  9. 【ARM】ARM汇编程序设计(五) str和ldr

    00. 目录 文章目录 00. 目录 01. ldr伪指令 02. ldr指令 03. adr指令 04. str指令 05. 附录 01. ldr伪指令 ldr示例一: .section .roda ...

最新文章

  1. 七牛云中带前缀的路径斜杆是怎么写的_关于小程序上传图片到七牛的总结
  2. linux视频学习6(mysql的安装/)
  3. python培训学校-如何找到靠谱的Python培训学校?
  4. 9.1 mnist_softmax 交叉熵多分类器
  5. access开发精要(7)-定位记录、查找空值
  6. 【Boost】boost库asio详解6——boost::asio::error的用法浅析
  7. MATLAB – TreeBagger example
  8. OpenCL用于计算机领域的13个经典案例
  9. Http请求中Content-Type讲解以及在Spring MVC中的应用
  10. HALCON 20.11:如何处理标定助手品质问题
  11. 什么是TOGAF?TOGAF初学者指南
  12. linux画板软件下载,Drawing画图软件
  13. 转行it学python_转行IT行业为什么要学习Python开发
  14. grpc-go源码剖析二十之grpc客户端帧接收器是如何处理不同的帧的?
  15. 固态硬盘与机械硬盘数据迁移
  16. 18966 两两配对差值最小
  17. linux服务器安装字体库
  18. Python字符串的转义字符
  19. 希尔伯特23个数学问题及其解决情况
  20. 实现微信定时发送消息解决工作订餐的问题

热门文章

  1. 张爱玲的,,,10大爱情,名言
  2. 计算机控制系统如图所示 采样周期,整理后的计算机控制系统复习题答案
  3. python入门编程100例(021-030)
  4. linux系统的电视怎么安装直播,Linux下nginx的安装及点直播使用示范
  5. Java基础——Arrays类
  6. 关于清空表数据的几种sql语句及区别
  7. 计算机的快捷键以及Dos命令
  8. Linux firewall(防火墙)相关命令
  9. 移动电源PSE测试项目
  10. 天气APP的实战(1)