c - 我正在尝试将程序从 C 转换为 MIPS 程序集,收到一个无限循环
问题描述
当这个程序的输入是“1 216”时,这个用基本MIPS编写的汇编代码似乎进入了一个无限循环,永不停息。以下是我尝试转换的 C 代码:
#include <stdio.h>
int number= 0;
int exponent= 0;
int result= 0;
解决方案
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
寄存器,就好像它们被保留调用一样,但它们既没有被指定为调用保留,代码也没有保存/恢复它们。
它经常将值和变量存储到堆栈中,但从不从堆栈中重新加载它们。
推荐阅读
- c - 你如何修改C中的字符串
- php - 使用 updateMany 将新字段添加到从 String 解析为 Int 的 MongoDB 文档
- sas - 将 SAS7BCAT 转换为 DATASET
- python - 在 Treeview 中连续更改颜色
- applescript - AppleScript 将拖动的文档传递给另一个应用程序
- r - 直接在 install.packages("sparklyr") 下使用 R 的区别
- ruby-on-rails - Rails 5 - 有没有办法将 if 语句转换为控制器逻辑?
- .net - GetCommTimeouts returns error 87 for network printer
- python - 如何使用python将新数据附加到pickle文件
- apache-nifi - Nifi:为什么“通知”不重置计数器,为什么“等待”计数不正确?