ljq

    1. 向各位大哥请教对加载/存储指令 LDM 和 STM 10/6531 嵌入式系统 2010-01-26
      办公室电脑有问题,家里的可以设文字颜色了。 请教: 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。

最近访客

< 1/1 >

统计信息

已有18人来访过

  • 芯积分:9
  • 好友:--
  • 主题:--
  • 回复:1

留言

你需要登录后才可以留言 登录 | 注册


现在还没有留言