MIPS双字边界和堆栈指针

时间:2016-04-16 23:50:19

标签: memory stack mips mars-simulator

在MIPS中,要存储一个double(8个字节),堆栈指针ReaderT Env (ErrorT String (StateT Integer Identity)) a ReaderT Env (StateT Integer (ErrorT String Identity)) a 将减少4:

$sp

这对我来说没有意义,因为8个字节被占用在内存中,但堆栈指针移动就像使用单个字边界一样。为了存储两个双打,似乎堆栈指针应该按预期递减12而不是16:

addi    $sp, $sp, -4
s.d     $f10, 0($sp)

为什么会出现这种情况?如果以递归方式调用子例程(第一次对齐,第二次不对齐),则会导致问题。

编辑:我正在使用MARS 4.5运行此代码。 addi $sp, $sp, -12 s.d $f10, 0($sp) s.d $f12, 8($sp) 转换为

s.d $f10, 8($sp)

在此期间不会移动堆栈指针。单步执行它看起来lui $1,0 addu $1,$1,$29 sdc1 $f10,8($1) 会立即将sdc1$f10放入堆栈中。

1 个答案:

答案 0 :(得分:1)

检查$ sp是否恰好设置为不是8的倍数的值。如果是,请尝试:andi $sp, $sp, 0xfffffff8。这应该会将$ sp降低到8的下一个倍数。但是,您需要注意这样才能正确地将$ sp返回到其原始值。