以下是我在MIPS中使用while循环计算奇数整数之和的代码。
.data
num: .space 4
.text
.globl main
main:
li $t1, 1
li $t2, 9 # make $t2 9 to break the loop
li $t3, 1
loop:
beq $t3, 11, Exit # check to see if $t3 = 11 if so exit
addi $t3, $t3, 2 # change $t3 to next odd number by adding 2
add $t1, $t1, $t3 # add $t3 to $t1 (1+3,...3+5...etc...)
j loop #jump back to the start of the loop
Exit:
li $v0, 1 # system call code to print an int
lw $a0, num # address of int to print
syscall # print the int
jr $ra #exit
这是我对MIPS的第一次真实体验,我不确定此代码中出了什么问题。我将打印放在while循环中以查看它是否曾在计算,但结果始终为1。 所以,我最后的结果只是111111。
编辑:删除循环内部的打印件,结果相同。
操作系统是Windows 7 64x
更新:将num作为变量已经结束了复杂化。代码已经修改如下并且有效。谢谢你的帮助!
enter code here
。数据
。文本
.globl主要
主要:
addi $ t1,$ 0,1
addi $ t2,$ 0,3
循环:bge $ t2,11,退出#检查是否$ t3> = 11如果是这样退出
添加$ t1,$ t1,$ t2#将$ t2添加到$ t1(1 + 3,... 3 + 5 ...等...)
addi $ t2,$ t2,2#通过添加2
j loop #jump back to the start of the loop
退出: li $ v0,1#系统调用代码来打印int 移动$ a0,$ t1#要打印的int的地址 syscall#print the int
jr $ra #exit
答案 0 :(得分:1)
la $t1, num
您在这里遇到了麻烦,因为每次您进行系统调用时,您都会使用地址num
覆盖累加器。您每次都会丢失当前的计算状态。
您需要保存寄存器,或者只使用不同的寄存器。由于我不知道您正在使用哪种操作系统,因此我不知道您是否更需要通过系统调用保存寄存器,但这也可能是错误的来源。< / p>
答案 1 :(得分:0)
我为建筑类做了类似的问题,这似乎是所有学生中经常出现的问题。当遇到与此类似的问题时,我们教授的建议是使用不同的寄存器临时存储寄存器的地址,以避免从我们最常用的regs覆盖其他所需的值。