assembly 我是否正确使用了堆栈?

vsmadaxz  于 2022-11-30  发布在  其他
关注(0)|答案(1)|浏览(122)

我对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

我的问题是
1.当我稍后使用$s0时,它的值是否与被除之前的值相同?
1.如果我以后要使用堆栈,是否需要还原它
1.当我以后使用它的时候,我应该做一个lw指令来修改它吗
我的整个项目是不完整的,所以它不会正确编译,但我的t寄存器,所以我试图存储不同的整数在堆栈中使用以后的程序。我目前的了解堆栈是最低限度的,我找遍了,不能找到答案我寻找

toiithl6

toiithl61#

你正在按照正确的顺序进行正确的操作,但是注解并不十分准确。

la $s0, trackHeight # s0 = TH
    
    addi $sp, $sp, -4 
    sw $s0, 0($sp)  # store TH in stack first position
    
    div $s0, $s0, 2 # div TH for start position (x)
    
    lw $s0, 0($sp) 
    addi $sp, $sp, 4 # restore stack

实际上就是把你减去的金额加回来,这样就恢复了堆栈。
关于$s0被除的问题,除法的结果实际上存储在寄存器$lo$hi中(一个是商,另一个是余数,我忘记了哪个是哪个。所以实际上,$s0并没有改变,你可以省略lw $s0, 0($sp)(但保留addi $sp, $sp, 4,这是重要的部分)。
请注意,这仅适用于乘法和除法运算。对于其他运算,如果您更改了$s_寄存器,则需要正确备份和恢复它,就像您在示例中所做的那样。

相关问题