6530|10

2

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

向各位大哥请教对加载/存储指令 LDM 和 STM [复制链接]

请教:
LDMIA   R0!,{R3-R9}     ;加载 R0 指向的地址上的多字节数据,保存到 R3-R9 中,R0 值更新
STMIA   R1!,{R3-R9}     ;将 R3-R9 的值存储到 R1 指向的地址上,R1 值更新
STMFD   SP!,{R0-R7,LR}  ;现场保护,将 R0-R7,LR 入栈
LDMFD   SP!,{R0-R7,PC}^ ;恢复现场,异常处理返回

这里有几个问题向各位大哥请教:

问题一:
LDMIA   R0!,{R3-R9} ;加载 R0 指向的地址上的多字节数据,保存到 R3-R9 中,R0 值更新

小问题1:
假设 R0 的初值是 0x11,R0 又不是指针,怎么能说 R0 指向的地址呢?
还有又怎么知道 R0 指向的地址值是多少呢?

小问题2:
假设 R0 的初值是 0x11 ,是不是给 R3-R9 中的每个寄存器都赋值 0x11 啊?

小问题3:
假设 R0 的初值是 0x11 ,那么 R0 值更新后,R0 值是多少啊?


问题二:

STMFD   SP!,{R0-R7,LR}  ;现场保护,将 R0-R7,LR 入栈

小问题1:
这句话的意思能不能理解为:将 R0-R7,LR 的数据存储到 SP 指向的地址上?

小问题2:SP 的值要不要更新,如果会更新的话,那么和原来的值相比,是
        增加多少?或者减少多少?
小问题3:
        现场保护 为什么要把 LR 也入栈呢?

问题三:
      LDMFD   SP!,{R0-R7,PC}^ ;恢复现场,异常处理返回
      
小问题1:
       PC 得到的值,是 STMFD   SP!,{R0-R7,LR} 的
       LR 的值吗?

       SP 的值要不要更新,如果会更新的话,那么和原来的值相比,是
        增加多少?或者减少多少?

最新回复

楼上回答的很清楚了。 楼主该看一下ARM汇编指令 另外要搞清楚地址和指针的含义  详情 回复 发表于 2010-1-26 04:06
点赞 关注

回复
举报

2

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
mark下。。。。汇编也正在学习中
lz是要做休眠唤醒的功能?
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
R0寄存器,寄存器其实也是一个地址,这个地址里可以存储数据也可以再次存储地址,不知道我这样说你明白不。SP是堆栈指针由环境系统自动维护。下面的都自然解决了吧,多看看ARM的原理书籍。或者386的,这些都是基础知识。
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

4
 
你说的这些在周立功的ARM那本书,北航版的,说得非常清楚。你可以找来看看。估计老弟不是科班出身。要不这个东西虽然不明白也知道大概意思。
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

5
 
问题一:
请LZ不要"假设 R0 的初值是 0x11",如果LZ能够看明白R0在程序执行到这之前的值的话,问题一的答案LZ就能够明白了。
问题二:
小问题1:是的。
小问题2:SP值会自动更新,一般是满"递减"堆栈,SP指向栈顶位置。LZ看看相关的资料就明白了。
小问题3:LR是返回值。为什么不可以保护下呢。
问题三:
小问题1:是的。SP的值"递增".
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

6
 
帮顶下,MARK.
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

7
 
只能自己好好体会了,兄弟!!!
汇编还是不错的
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

8
 
请教:
LDMIA? R0!,{R3-R9}? ? ;加载 R0 指向的地址上的多字节数据,保存到 R3-R9 中,R0 值更新
STMIA? R1!,{R3-R9}? ? ;将 R3-R9 的值存储到 R1 指向的地址上,R1 值更新
STMFD? SP!,{R0-R7,LR}? ;现场保护,将 R0-R7,LR 入栈
LDMFD? SP!,{R0-R7,PC}^ ;恢复现场,异常处理返回

这里有几个问题向各位大哥请教:

问题一:
LDMIA? R0!,{R3-R9} ;加载 R0 指向的地址上的多字节数据,保存到 R3-R9 中,R0 值更新

小问题1:
假设 R0 的初值是 0x11,R0 又不是指针,怎么能说 R0 指向的地址呢?
还有又怎么知道 R0 指向的地址值是多少呢?
   
   答:R0是个32为寄存器,你可以在汇编代码中当作一个地址,地址不就是指针嘛!如果R0为0x11,意思就是R0指向地址0x11

小问题2:
假设 R0 的初值是 0x11 ,是不是给 R3-R9 中的每个寄存器都赋值 0x11 啊?

  答:如果R0是0x11,R3-r9就是从地址0x11处连续去7个32位值。当然这会是非法的,因为0x11没有地址对齐。如果R0是0x10,而且0x10确实是可访问到的地址,就能执行。
 
小问题3:
假设 R0 的初值是 0x11 ,那么 R0 值更新后,R0 值是多少啊?

 答:同上个问题。因为R3-r9是7个寄存器。所以R0增加4x7=28,不过R0的值0x11还有没对齐的问题,

问题二:

STMFD? SP!,{R0-R7,LR}? ;现场保护,将 R0-R7,LR 入栈

小问题1:
这句话的意思能不能理解为:将 R0-R7,LR 的数据存储到 SP 指向的地址上?

  答:正确
小问题2:SP 的值要不要更新,如果会更新的话,那么和原来的值相比,是
? ? ? ? 增加多少?或者减少多少?

 答:SP会改变。SP是增加还是减少要看你的栈是朝那个方向的(递减还是递增的)。改变的值看你保存了多少数值,你的例子中r0-r7是8个寄存器,再加lr,共9个,即4x9=36

小问题3:
? ? ? ? 现场保护 为什么要把 LR 也入栈呢?

  答:LR里的值是在函数调用时的返回地址,保存起来,免得在后面的操作中被破坏。

问题三:
? ? ? LDMFD? SP!,{R0-R7,PC}^ ;恢复现场,异常处理返回
? ? ?
小问题1:
? ? ? PC 得到的值,是 STMFD? SP!,{R0-R7,LR} 的
? ? ? LR 的值吗?

? ? ? SP 的值要不要更新,如果会更新的话,那么和原来的值相比,是
? ? ? ? 增加多少?或者减少多少?

  答: 没错,PC得到之前保存的lr的值。SP当然会变,和前面一个道理,看栈是递增还是递减栈决定SP是加还是减。改变的值就是出栈的寄存器的数量乘以4。

 
 
 

回复

2

帖子

0

TA的资源

禁止访问

9
 
提示: 作者被禁止或删除 内容自动屏蔽
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

10
 
办公室电脑有问题,家里的可以设文字颜色了。


请教:
LDMIA  R0!,{R3-R9}    ;加载 R0 指向的地址上的多字节数据,保存到 R3-R9 中,R0 值更新
STMIA  R1!,{R3-R9}    ;将 R3-R9 的值存储到 R1 指向的地址上,R1 值更新
STMFD  SP!,{R0-R7,LR}  ;现场保护,将 R0-R7,LR 入栈
LDMFD  SP!,{R0-R7,PC}^ ;恢复现场,异常处理返回

这里有几个问题向各位大哥请教:

问题一:
LDMIA  R0!,{R3-R9} ;加载 R0 指向的地址上的多字节数据,保存到 R3-R9 中,R0 值更新

小问题1:
假设 R0 的初值是 0x11,R0 又不是指针,怎么能说 R0 指向的地址呢?
还有又怎么知道 R0 指向的地址值是多少呢?
   
答:R0是个32为寄存器,你可以在汇编代码中当作一个地址,地址不就是指针嘛!如果R0为0x11,意思就是R0指向地址0x11

小问题2:
假设 R0 的初值是 0x11 ,是不是给 R3-R9 中的每个寄存器都赋值 0x11 啊?

  答:如果R0是0x11,R3-r9就是从地址0x11处连续去7个32位值。当然这会是非法的,因为0x11没有地址对齐。如果R0是0x10,而且0x10确实是可访问到的地址,就能执行。
 
小问题3:
假设 R0 的初值是 0x11 ,那么 R0 值更新后,R0 值是多少啊?

 答:同上个问题。因为R3-r9是7个寄存器。所以R0增加4x7=28,不过R0的值0x11还有没对齐的问题,

问题二:

STMFD  SP!,{R0-R7,LR}  ;现场保护,将 R0-R7,LR 入栈

小问题1:
这句话的意思能不能理解为:将 R0-R7,LR 的数据存储到 SP 指向的地址上?

  答:正确

小问题2:SP 的值要不要更新,如果会更新的话,那么和原来的值相比,是
        增加多少?或者减少多少?

 答:SP会改变。SP是增加还是减少要看你的栈是朝那个方向的(递减还是递增的)。改变的值看你保存了多少数值,你的例子中r0-r7是8个寄存器,再加lr,共9个,即4x9=36

小问题3:
        现场保护 为什么要把 LR 也入栈呢?

  答:LR里的值是在函数调用时的返回地址,保存起来,免得在后面的操作中被破坏。

问题三:
      LDMFD  SP!,{R0-R7,PC}^ ;恢复现场,异常处理返回
      
小问题1:
      PC 得到的值,是 STMFD  SP!,{R0-R7,LR} 的
      LR 的值吗?

      SP 的值要不要更新,如果会更新的话,那么和原来的值相比,是
        增加多少?或者减少多少?

  答: 没错,PC得到之前保存的lr的值。SP当然会变,和前面一个道理,看栈是递增还是递减栈决定SP是加还是减。改变的值就是出栈的寄存器的数量乘以4。
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

11
 
楼上回答的很清楚了。
楼主该看一下ARM汇编指令
另外要搞清楚地址和指针的含义
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表