MIPS,使用while循环计算奇数整数1-9的总和

时间:2014-02-11 23:26:42

标签: mips

以下是我在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

将$ t2更改为下一个奇数
j loop  #jump back to the start of the loop

退出:         li $ v0,1#系统调用代码来打印int         移动$ a0,$ t1#要打印的int的地址         syscall#print the int

jr $ra  #exit

2 个答案:

答案 0 :(得分:1)

la $t1, num

您在这里遇到了麻烦,因为每次您进行系统调用时,您都会使用地址num覆盖累加器。您每次都会丢失当前的计算状态。

您需要保存寄存器,或者只使用不同的寄存器。由于我不知道您正在使用哪种操作系统,因此我不知道您是否更需要通过系统调用保存寄存器,但这也可能是错误的来源。< / p>

答案 1 :(得分:0)

我为建筑类做了类似的问题,这似乎是所有学生中经常出现的问题。当遇到与此类似的问题时,我们教授的建议是使用不同的寄存器临时存储寄存器的地址,以避免从我们最常用的regs覆盖其他所需的值。