2014-06-16 206 views
0

我有下面的代码,它有效地应该从1-6增加,同时做一个变量的算术。Mips循环迭代

用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 

出于某种原因,导致我走向到底得的是约300万,这显然是错误的。有没有人看到这个问题是什么?我相当新的mips组装。

谢谢

+0

什么是C代码中的j?你的意思是我吗? – BlackBear

+0

是的,我做了,我改了它 – user3183230

回答

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: 
+0

移动指令只允许从寄存器移动,res是一个变量。 – user3183230

+0

好的,然后坚持sw。对不起,它已经有一段时间了 – KRUKUSA

+0

这并不计算'res + = i * i + 1'的'+ ='部分 – markgz

1

您在这里有几个问题。

首先,您标记为#res += j * j + 1的行只是相乘,没有涉及的内容。

您似乎试图使用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