【发布时间】:2015-02-12 07:21:20
【问题描述】:
这是一个家庭作业,我自己编写了整个程序,在调试器中运行它,一切都按照我的意思进行,除了这一行:
sw $t1, counter($a3)
任务是把这个C代码的sn-p转换成MIPS
for(i = 0; i < a; i++) {
for(j = 0; j < b; j++) {
C[2 * i] = i – j; } }
除了 $a3 之外,所有寄存器都按照它们在我的程序中应有的方式改变值 - 它永远不会改变。
变化:一个数组需要被寄存器声明和“指向”,而一个标签不能像我开始那样用于偏移量
编辑:这是完成的工作代码
【问题讨论】:
-
你为什么期望 $a3 改变?它应该是你的数组的地址,因此它不应该改变。其实我不明白你的问题是什么。
-
@ElderBug 我尝试将 i - j 的结果存储在 $a3 的每个索引中,所以我不应该看到 $ 中出现一些值a3 寄存器值空间?我不确定如何更好地解释自己,我的火星编译器的屏幕截图会有所帮助吗?我可以告诉你我在看什么
-
如果你有 x=8 的
sw $t1, x($a3)行,t1 的值将存储在 $a3[2](数组的第 3 个整数,由 $a3 指向)。如果不是这种情况,则永远不会执行该行。 -
我不确定 MIPS 的语法,但声明它应该像
myarray: .space 4010 个字。如果我没记错的话,你必须将地址加载到 $a3 中,使用la $a3, myarray。 -
其实这点你说的对,我忘了你后面用
i-1。无论如何,你的循环仍然是错误的。尝试翻译while,这真的很简单。只需逐步翻译while所做的事情。唯一不直接的一点是,当您需要“退出”条件时,条件是“继续”条件(但恰恰相反)。并且一次翻译一个循环,即使你有重复的标签也没关系。