Reputation: 11
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
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
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