首页 > 解决方案 > 我正在尝试将程序从 C 转换为 MIPS 程序集,收到一个无限循环

问题描述

当这个程序的输入是“1 216”时,这个用基本MIPS编写的汇编代码似乎进入了一个无限循环,永不停息。以下是我尝试转换的 C 代码:

#include <stdio.h>

int number= 0;
int exponent= 0;
int result= 0;

标签: cfunctionassemblymips

解决方案


sopd循环调用power

这个循环sopd依赖于$t0$t1$t2$t3

power重新利用$t0, $t1,$t2$t3.

power返回sopd,并且这些寄存器不再具有预期值。


这在单步执行过程中非常明显。


提示:对于调试和测试,从最小的输入值开始,然后慢慢增加它们以参与更多的程序。单步执行所有新代码并验证 (1) 寄存器和 (2) 内存和 (3) 控制流是否都在按照您的预期进行。


调用约定至少可以说很奇怪。

它在 prologue 和 epilog 上使用 Full Descending,而 Empty Descending 用于参数传递——这很奇怪,但通过避免0($sp)在函数中用作可用的堆栈位置,至少这似乎不会导致问题。

当堆栈可以完全通过静态分析进行管理时,代码会动态地推送和弹出堆栈,这也是 MIPS 的规范。

它在堆栈上传递参数,而 MIPS 的规范是使用寄存器作为参数。

它使用$t寄存器,就好像它们被保留调用一样,但它们既没有被指定为调用保留,代码也没有保存/恢复它们。

它经常将值和变量存储到堆​​栈中,但从不从堆栈中重新加载它们。


推荐阅读