STMFD和LDMFD指令个人理解分析

来源:互联网 发布:js 滚动字幕特效 编辑:程序博客网 时间:2024/06/05 14:55

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地址。
<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
阅读(37) | 评论(0) | 转发(0) |
0

上一篇:中断编程

下一篇:Nandflash学习

相关热门文章
  • 验证有效!Mac OS X 如何手动...
  • SAP validations and substitu...
  • 草榴社区,草榴社区最新地址,...
  • 让无数撸友欲罢不能的撸管神器...
  • OSX下面用ffmpeg抓取桌面以及...
给主人留下些什么吧!~~