在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
放入堆栈中。
答案 0 :(得分:1)
检查$ sp是否恰好设置为不是8的倍数的值。如果是,请尝试:andi $sp, $sp, 0xfffffff8
。这应该会将$ sp降低到8的下一个倍数。但是,您需要注意这样才能正确地将$ sp返回到其原始值。