办公室电脑有问题,家里的可以设文字颜色了。
请教:
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。