STMFD和LDMFD指令个人理解分析

转载 2013年12月02日 11:34:15
LDM/STM指令主要用于现场保护,数据复制,参数传送等。

根据ATPCS规则,我们一般使用FD(Full Descending)类型的数据栈(sp指向最后一个压入的值,数据栈由高地址向低地址生长)!所以经常使用的指令就有STMFD和LDMFD。

在STM、LDM指令中,寄存器列表与内存单元的对应关系:编号低的寄存器对应于内存中低地址单元;编号高的寄存器对应于内存中高地址单元。


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

STMFD和LDMFD指令分析

转自http://badcup.blog.sohu.com/48236376.html 指令STMFD和LDMFD分析; 根据ATPCS规则,我们一般使用FD(Full Descending)类型的数...
  • zoudaokou2006
  • zoudaokou2006
  • 2010年04月01日 23:18
  • 7687

指令STMFD和LDMFD分析

指令STMFD和LDMFD分析  根据ATPCS规则,我们一般使用FD(Full Descending)类型的数据栈(sp指向最后一个压入的值,数据栈由高地址向低地址生长)!所以经常使用的指令就...
  • yapingmcu
  • yapingmcu
  • 2012年01月10日 17:47
  • 6554

STMFD和LDMFD指令个人理解分析

转载地址http://blog.163.com/oy_mcu/blog/static/16864297220120193458892/   LDM/STM指令主要用...
  • w_ww_w
  • w_ww_w
  • 2013年04月01日 19:18
  • 526

STMFD和LDMFD指令个人理解分析

LDM/STM指令主要用于现场保护,数据复制,参数传送等。 STMFD指令 STMFD  Rn{!},{reglist}{^}    STMFD SP!,{R0-R...
  • Hokeo
  • Hokeo
  • 2013年12月15日 15:22
  • 546

STMFD和LDMFD指令个人理解分析

LDM/STM指令主要用于现场保护,数据复制,参数传送等。 STMFD指令 STMFD  Rn{!},{reglist}{^}    STMFD SP!,{R0-R...
  • liaoshengshi
  • liaoshengshi
  • 2014年10月23日 12:25
  • 277

STMFD和LDMFD指令个人理解分析

LDM/STM指令主要用于现场保护,数据复制,参数传送等。 STMFD指令 STMFD  Rn{!},{reglist}{^}    STMFD SP!,{R0-R7,LR} 对于...
  • yxnyxnyxnyxnyxn
  • yxnyxnyxnyxnyxn
  • 2014年01月15日 09:51
  • 1092

STMFD和LDMFD指令个人理解分析

任务级的任务切换函数分析(转)   关于__irq 的使用(转) STMFD和LDMFD指令个人理解分析   2012-01-19 17:07:03|  分类: ...
  • maochengtao
  • maochengtao
  • 2014年09月25日 10:55
  • 367

arm的LDMFD--4种堆栈方式

一开始,看到 STMFD sp!{R0-R5,LR} 这条命令时真是有点疑惑。现根据自己的理解记录一下。供大家分享! 我们先要理解一下关于堆栈的相关概念. 1,满堆栈:即入栈后堆栈指针sp...
  • csshuke
  • csshuke
  • 2014年09月07日 16:16
  • 820

Arm汇编学习笔记(二)——编写编译并执行依赖外部模块的汇编代码以及PIC代码分析

1. 编译依赖外部模块的汇编代码并执行 创建test.S汇编文件,并输入如下内容: .global main .extern printf .text main: stmfd sp...
  • beyond702
  • beyond702
  • 2016年08月12日 11:43
  • 554

ARM指令英文全称及功能

指令格式:  指令{条件}{S} {目的Register},{OP1},{OP2} "{ }"中的内容可选。即,可以不带条件只有目的寄存器,或 只有目的寄存器和操作数1,也可以同时...
  • Strokess
  • Strokess
  • 2016年10月27日 14:50
  • 1213
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:STMFD和LDMFD指令个人理解分析
举报原因:
原因补充:

(最多只允许输入30个字)