Mips循环迭代

时间:2014-06-16 17:34:50

标签: mips

我有以下代码,在对变量进行算术运算时,有效地应该从1-6增加。

C中的一个例子是

int res = 0;
for(i=1; i<6; i++) {

res += i*i+1; 
}

现在我的mips代码:

.data
    res: .word 0

.text
    li $t0, 1 #int j = 1

loop:
    beq $t0, 6, end     #for(int j = 1; j < 6; j++)
    add $t0, $t0, 1
    mul $t1, $t0, $t0   #res += j * j + 1
    addi $t1, $t1, 1
    sw $t1, res
    b loop
end:
    li $v0, 1       #checking the end result
    la $a0, res
    syscall         
    li $v0, 10      #graceful exit
        syscall

出于某种原因,我最终得到的结果是〜3亿,这显然是错误的。有谁看到问题是什么?我是mips装配的新手。

由于

2 个答案:

答案 0 :(得分:1)

你在这里遇到了一些问题。

首先,您标记为#res += j * j + 1的行只是倍增,不涉及添加。

您似乎正在尝试使用res来存储正在运行的总计,但是您在每次迭代中都会覆盖它。实际上,不应该将res存储在内存中,寄存器更适合于此目的。

.text
main:

    move $t2 $zero
    li   $t0 1

    loop:

       mul  $t1 $t0 $t0 
       addi $t1 $t1 1
       add  $t2 $t2 $t1 # res += i * i + 1

       addi $t0 $t0 1
       blt  $t0 6 loop

    # print res
    li   $v0 1
    move $a0 $t2
    syscall

    # exit
    li $v0 10
    syscall

打印60

答案 1 :(得分:0)

你想做这样的事情。 我假设你想要这样的东西:

int res = 0;
for(i=1; i<6; i++) {

    res += i*i+1; 
}

.data
    res: .word 0

.text
    li $t0, 1 #int i = 1
loop:
    bgt $t0, 6, exit
    add $t0, $t0, 1
    mul $t1, $t0, $t0
    addi $t1, $t1, 1
    sw $t1, res // I'm sure you can just move here
    b loop

exit: