zoukankan      html  css  js  c++  java
  • 汇编指令:ldr和str,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地址)。

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

     

    (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后面的!的作用:R0的值在ldm过程中发生的增加或减少,最后写回到R0中去,也就是ldm时会改变R0的值

     

     
  • 相关阅读:
    微软的PDC2009开完了,上去淘Video喽,有不少好东西
    [摘要]Pushing the Limits of Windows: Paged and Nonpaged Pool From Mark Russinovich's blog
    [摘要]Pushing the Limits of Windows: Virtual Memory From Mark Russinovich's blog
    如何知道在Windbg中得到Memory type(也叫做caching type)
    用ImgBurn做了一张可以安装所有版本的Win7安装盘
    WF 工作流(5)
    ORACLE 綁定變量
    oracle inside(1)
    WF 工作流(1)
    WF 工作流(2)
  • 原文地址:https://www.cnblogs.com/icefree/p/7636125.html
Copyright © 2011-2022 走看看