我是靠谱客的博主 悲凉鞋垫,最近开发中收集的这篇文章主要介绍ARM汇编指令-STMFD和LDMFD,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

STMFD指令

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

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,由前面解释伪代码可得下图(蓝色填充区为地址):

蓝色标注的SP为执行指令前的SP地址,红色标注的SP是执行指令后的SP地址,由此看出STMFD指令是向下压栈的。

蓝色标注的SP为执行指令前的SP地址,红色标注的SP是执行指令后的SP地址,由此看出STMFD指令是向下压栈的。

LDMFD 指令

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

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

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

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

address = SP;

  for i = 0to 7

    Ri = Memory[address ,4]

   address = address + 4;

  SP =address;

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

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

最后

以上就是悲凉鞋垫为你收集整理的ARM汇编指令-STMFD和LDMFD的全部内容,希望文章能够帮你解决ARM汇编指令-STMFD和LDMFD所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(57)

评论列表共有 0 条评论

立即
投稿
返回
顶部