user3183230
user3183230

Reputation: 11

Mips loop iteration

I have the following code which is effectively supposed to increment from 1-6 while doing arithmetic on a variable.

An example in C would be

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

res += i*i+1; 
}

Now for my mips code:

.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

For some reason the result I get towards the end is ~300 million and that is obviously wrong. Does anyone see what the issue is? Im fairly new to mips assembly.

Thanks

Upvotes: 0

Views: 2173

Answers (2)

Konrad Lindenbach
Konrad Lindenbach

Reputation: 4961

You've got a few problems here.

Firstly, the line you have marked #res += j * j + 1 is only multiplying, there is no addition involved.

You seem to be attempting to use res to store a running total but you are overwriting it in each iteration. In fact, there shouldn't be any need to store res in memory, a register is much more appropriate for this purpose.

.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

Prints 60.

Upvotes: 1

Moonhead
Moonhead

Reputation: 1568

You want to do something like this. I am assuming you wanted something like this:

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:

Upvotes: 0

Related Questions