Homework MIPS. Can't seem to find the error

Ok, the question is this: with MARS, create a program that:

  • Prompts the user to enter an integer,
  • Reads an integer from the keyboard (say n),
  • Calculates and displays the sum of odd numbers and the sum of even numbers from 1 to n.

Here is my attempt, please DO NOT SOLVE MY TOMORROW. I would like to learn from my mistakes. My question is where I am wrong, the registers seem to go to -MAXINT run it and you will see :(

    # Assignment 3, part 1
    # NAME  
    #The Formulas used in this assignments are visible in a text document 
    #attached in the zip. and their mathematical proofs. 
        # Odd or Even Checker by parity bit in binary format.
        # by anding it with the number N
        # if it is odd, the anding will result in 00000001
        # if it is even the ANDing will result in all 0
        # we can check if the result is ==0 or not
        # then use mathematical formulas to derive the sums
        # using the least number of instructions    
        # Without using the not-yet-learnt instructions.

      

----------------------------------------------- --- -----------------------

.data       #Data Declaration Section
    msg1: .asciiz "Hello, Enter an Integer:\n->"
    msgodd: .asciiz "Odd Sum is :\n"
    msgeven: .asciiz "Even Sum is :\n"  
.text       
        #START

    la $a0, msg1    #Load the address of label msg1
    li $v0,4    #Load int 4 to v0, and address the system call. 
    syscall

   #Request a Syscall for integer input
    li $v0,5    #Load int 5 <int inp>
    syscall 

    move $a0,$v0    #copy the int entered
    parity:
    move $t0,$a0    #will be used to test for odd or even
    move $a3,$a0    #will be used later
    andi $t0,00000001 # this is the parity bit i talked about above.
    beq $t0,$zero,even_n
    #s1 hold odd sum, s2 hold even sum, t1 is temp for odd, t2 is temp for even
    li $s5,1
    odd_n:
move $t1,$a3
move $t2,$a3
addi $t2,$t2,-1

ol:
    add $s1,$s1,$t1
    addi $t1,$t1,-2
    bne $t1,$s5,ol

el:
    add $s2,$s2,$t2
    addi $t2,$t2,-2
    bne $t2,$zero,el

    even_n:
move $t1,$a3
move $t2,$a3
addi $t1,$t1,-1

eol:
    add $s1,$s1,$t1
    addi $t1,$t1,-2
    bne $t1,$s5,eol

eel:
    add $s2,$s2,$t2
    addi $t2,$t2,-2
    bne $t2,$zero,eel

    print:
    li $v0,4
    la $a0,msgodd
    syscall
    li $v0,1
    move $a0,$s1
    syscall

    la $a0,msgeven
    syscall
    li $v0,1
    move $a0,$s2
    syscall

    exit:
    li $v0,10
    syscall

      

+3


source to share


1 answer


There are a few bugs in the code, but after applying these changes, everything should be fine.



  • You initialize $s5

    after branching, which leaves $s5

    uninitialized when you have a starting number.

  • When the starting number is odd and your program finishes processing it, control flow drops to the even case unconditionally. You need to jump to the output of your program after completing odd_n

    your calculations.

  • You need to load 4

    in $v0

    before you render syscall

    for display msgeven

    (and while you're at it, consider fixing the placement of the newline in both posts).

+2


source







All Articles