krystalo 0 Newbie Poster

I have this assembly project (mips) but I think I have an overflow problem....

The problem is that the answer is ok until number 99 but at 100 it prints with a - infront of the number. The projects just ask me to calculate a sum (x+a)^2 (x= 1 to 100) and a= (1+2y) (y= 1 to x)

The answer i get is:
Result: -2088573816


I post the code:

.data # data segment. We Define the Constants here
intro: .asciiz "\n\t\t\t\tCalculate Sum-Test\n\n"
msgIn: .asciiz "\nPlease give an integer between 1 - 100: "
error: .asciiz "\nInvalid Number: Integer must be between 1-100\n\n"
thx: .asciiz "\n\nThank you for using our program"
res: .asciiz "\nThe result is: "
mo: .asciiz "\nThe average is: "
rest: .asciiz "\nThe modulo is: "

######################################…
.text # text segment
.globl main

main:
#constants
li $t0, 100
li $t1, 1
li $t2, 2

#counters
li $t3, 1 #counter for the first loop
li $t4, 1 #counter for the second/nested loop

#sum
li $s1, 0 #$s1 is the a value
li $s2, 0 #$s2 holds the final result

# Print on consule the intro message
la $a0, intro # Message that indicates the title of the current program
li $v0, 4 # System code for print string
syscall # Print String
j loop1

error_msg:
# Print on consule the error message
la $a0, error # Message that indicates the error of the current program
li $v0, 4 # System code for print string
syscall # Print String


loop1:
# Print on consule the instruction message
la $a0, msgIn # Message that indicates the instructions of the current program
li $v0, 4 # System code for print string
syscall # Print String

#Read an integer from keyboard
li $v0, 5 # System code for reading an integer
syscall # Read an integer
move $s0,$v0 # Save integer in $s0


# By this time the value should be in $s0 register

######################################…
# This is code that checks if the integer is between 1 - 100
######################################…

#Checks if integer>100
bgt $s0, $t0, error_msg #pseudoinstruction, $s0>$t0 (user_int>100)

#Checks if integer<1
blt $s0, $t1, error_msg #pseudoinstruction, $s0<$t1 (user_int<1)


######################################…
# This is code generates the a value of the serie
######################################…

#This loop calculates the final result
for_loop_x:

#Checks if first_loop_counter<user_value
bgt $t3, $s0, loop_out #pseudoinstruction, $t3<$s0 (counter<user_int)

for_loop_a:

#Checks if second_loop_counter<first_loop_counter
bgt $t4, $t3, calculate #pseudoinstruction, $t4<$t3 (second_loop_counter<first_loop_…

#Calculate the a value
mulou $t5, $t2, $t4 #multiply $t5=$t2*$t4 ($t5= 2*second_loop_counter => 2*y)
addiu $s5, $t5, 1 #add immitiade $s5=$t5+1 ($s5= 1+$t4 => 1+2*y)
addu $s1, $s1, $s5 #add immitiade $s1=$s1+$s5 ($s1= $s1+$s5 => sum=prev_value+(1+2*y)) ==> This is the a value
addiu $t4, $t4, 1 #increase counter by one ($t4=$t4+1)
j for_loop_a #Check the condition again

calculate:

addu $t6, $t3, $s1 #add $t6=$t3+$s1 ($t6= first_loop_counter+a value => x+a)
mulou $t7, $t6, $t6 #calculate square root $t7=$t6*$t6 (((x+a)^2)
addu $s2, $s2, $t7 #calculate the final sum $s2=$s2+$t7

addiu $t3, $t3, 1 #increase counter by one ($t3=$t3+1)

j for_loop_x #Check the condition again

loop_out:

# Print on consule the result message
la $a0, res # Message that indicates the results of the current program
li $v0, 4 # System code for print string
syscall # Print String

#Printing results on consule
move $a0, $s2 #moves the final result to the argument 1
li $v0, 1 #System code for printing an integer
syscall #Print Integer

end:
######################################…
# Print on consule the "thank you" message

la $a0, thx
li $v0, 4
syscall


#Exiting system
li $v0, 10 # exit system call
syscall

thanks in advance.

Be a part of the DaniWeb community

We're a friendly, industry-focused community of 1.20 million developers, IT pros, digital marketers, and technology enthusiasts learning and sharing knowledge.