MIPS栈使用正确性咨询:寄存器存储与恢复相关问题
MIPS栈使用相关问题解答
先看你的代码片段:
la $s0, trackHeight # s0 = TH addi $sp, $sp, -4 # store TH in stack first position sw $s0, 0($sp) div $s0, $s0, 2 # div TH for start position (x) lw $s0, 0($sp) # restore stack addi $sp, $sp, 4
针对你的三个问题逐一解答:
后续使用$s0寄存器时,其值会与除法操作执行前的原值完全一致。
你的代码先把$s0的原值存入栈,执行除法修改$s0后,又通过lw $s0, 0($sp)把栈里保存的原值重新加载回$s0,最后恢复栈指针。整个流程完成后,$s0就回到了除法操作前的初始值。若后续仍需使用栈,必须恢复栈指针。
MIPS的栈依赖栈指针$sp维护栈的边界和位置,如果不恢复栈指针,栈的位置会处于偏移状态——比如你现在手动把$sp减了4,不恢复的话,后续再执行压栈(addi $sp, $sp, -n)操作时,会覆盖之前存在栈里的数据,或者导致栈空间管理混乱,引发程序错误。保持栈的平衡(压栈多少字节,弹栈就恢复多少字节)是MIPS栈使用的基本要求。后续使用栈中存储的数据时,必须通过
lw指令将数据加载到寄存器中才能使用。
栈是内存中的一块区域,MIPS指令无法直接操作内存中的数据进行运算或逻辑处理,所有数据操作都需要在寄存器中完成。如果要使用栈里保存的数据,必须用lw指令把数据从栈内存读取到某个通用寄存器,之后才能对这个寄存器里的值进行操作。
内容的提问来源于stack exchange,提问作者dommy456
相关产品推荐
相关产品推荐

