简体   繁体   中英

MIPS Assembly homework. Can't seem to find the bug

Ok the question is as follows: Using MARS, develop a program that:

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

Here is my attempt, please DON'T SOLVE MY HOMEWORK. i would like to learn from my mistakes. My question is, where did i go 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

There are a few things wrong with your code, but after applying these changes it should be fine.

  1. You initialize $s5 after you branch, which leaves $s5 uninitialized when you have an even starting number.

  2. When the starting number is odd and your program is done processing it, control flow falls through to the even case unconditionally. You need to jump to the output portion of your program after odd_n completes its calculations.

  3. You need to load 4 into $v0 before you make the syscall to display msgeven (and while you're at it, think about fixing the placement of the newline character in both messages).

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM