Chinaunix首页 | 论坛 | 博客
  • 博客访问: 808665
  • 博文数量: 296
  • 博客积分: 5376
  • 博客等级: 大校
  • 技术积分: 2298
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-14 19:02
文章分类

全部博文(296)

文章存档

2023年(2)

2020年(2)

2018年(2)

2017年(26)

2016年(4)

2015年(19)

2014年(12)

2013年(26)

2012年(84)

2011年(50)

2010年(41)

2009年(28)

分类: 嵌入式

2013-02-26 14:21:36

STMFD和LDMFD指令个人理解分析  

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地址。


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

阅读(1707) | 评论(1) | 转发(1) |
给主人留下些什么吧!~~

狂奔的蜗牛_0012013-11-12 09:19:57

写得很好,受教了