zoukankan      html  css  js  c++  java
  • STMFD 和LDMFD指令

    http://blog.163.com/oy_mcu/blog/static/16864297220120193458892/

    LDM/STM指令主要用于现场保护,数据复制,参数传送等。

    STMFD指令

    STMFD  Rn{!},{reglist}{^}

    STMFD和LDMFD指令个人理解分析 - L -

     STMFD SP!,{R0-R7,LR}

    对于这条指令伪代码的解释,网上是这么说的:

    SP = SP - 9×4;

      address = SP; 

     for i = 0 to 7

        Memory[address] = Ri;

        address  = address + 4;

    Memory[address] = LR;

    经过我在keil4的多次调试,个人理解如下:

    sp = address;

    sp = sp - 4;

    Memory[address] = LR;

    for( i=7;i>0;i--)

    {

     sp = sp-4;

       Memory[address] = Ri;

    }

    由于ARM堆栈结构是从高向低压栈的,此时SP即是栈顶。

    这里的sp = sp-4,是因为处理器是32位的ARM,所以每次压一次栈SP就会移动4个字节(32位)。

    假设此时SP地址为: 0x40000460,由前面解释伪代码可得下图(蓝色填充区为地址):

    STMFD和LDMFD指令个人理解分析 - L -
     
    蓝色标注的SP为执行指令前的SP地址,红色标注的SP是执行指令后的SP地址,由此看出STMFD指令是向下压栈的。
     
     

     LDMFD 指令

    LDMFD  Rn{!},{reglist}{^}

    这条指令的意思是以Rn为基址(起始地址),取值写入寄存器列表。

     STMFD和LDMFD指令个人理解分析 - L -

    LDMFD SP!,{R0-R7,PC}^

    对于这条指令,网上的伪代码解释是:

    address = SP;

      for i = 0 to 7

         Ri = Memory[address ,4]

        address = address + 4;

      SP = address;

    个人理解与之相同。。
    假设此时SP地址为: 0x4000043C,由前面解释伪代码可得下图(蓝色填充区为地址):

    STMFD和LDMFD指令个人理解分析 - L -

     蓝色标注的SP为执行指令前的SP地址,红色标注的SP是执行指令后的SP地址。

  • 相关阅读:
    My first blog in cnblog
    浅析JavaScript中this储存
    input 文本框密码框的只读属性
    Js 数组——filter()、map()、some()、every()、forEach()、lastIndexOf()、indexOf()
    jquery使用$.getJson()跨域大数据量请求方法
    JS中关于clientWidth offsetWidth scrollWidth 等的含义及区别
    JS性能优化
    npm 创建 node.js 项目
    css 垂直居中的几种方法
    字符串转数组
  • 原文地址:https://www.cnblogs.com/njseu/p/6029226.html
Copyright © 2011-2022 走看看