0
votes

So I'm trying to write a program in MIPS assembly code to help me better understand how floating point addition works. I've written a program that gets two inputs from a user, and adds them WITHOUT using any floating point instructions except mtc1 and mfc1 (for input and output). My code has bugs because when I add 1 + 2 I get 2.74804688. I'm still trying to debug the code but can't seem to grasp the problem. If anyone can help, I would greatly appreciate it.

THIS IS MY CODE (excluding the user input...the first floating point value is in $s0, and the second in $s1)

#Integer implementation of floating-point addition
 #Initialize variables
 add $s0,$t0,$zero #first integer value
 add $s1,$t1,$zero #second integer value
 add $s2,$zero,$zero #initialize sum variable to 0
 add $t3,$zero,$zero #initialize SUM OF SIGNIFICANDS value to 0

 #get EXPONENT from values
 sll $s5,$s0,1 #getting the exponent value 
srl $s5,$s5,24 #$s5 = first value EXPONENT

 sll $s6,$s1,1 #getting the exponent value
 srl $s6,$s6,24 #$s6 = second value EXPONENT

 #get SIGN from values
 srl $s3,$s0,31 #$s3 = first value SIGN
 srl $s4,$s1,31 #$s4 = second value SIGN

 #get FRACTION from values
 sll $s7,$s0,9 
srl $s7,$s0,9 #$s7 = first value FRACTION
 sll $t8,$s1,9
 srl $t8,$s1,9 #$t8 = second value FRACTION

 #compare the exponents of the two numbers
 compareExp: ###################### 

beq $s5,$s6, addSig 
blt $s5,$s6, shift1 #if first < second, go to shift1
 blt $s6,$s5, shift2 #if second < first, go to shift2
 j compareExp 

shift1: #shift the smaller number to the right
 srl $s7,$s7,1 #shift to the right 1
 addi $s5,$s5,1 
j compareExp

 shift2: #shift the smaller number to the right
 #srl $s0,$s0,1 #shift to the right 1
 #j compareExp
 srl $t8,$t8,1 #shift to the right 1
 addi $s6,$s6,1
 j compareExp

 addSig: 

add $t3,$s7,$t8 #Add the SIGNIFICANDS 

li $v0, 4
 la $a0, sum
 syscall

 li $v0, 1
 move $a0, $t3
 syscall

 j result

 result: 
li $v0, 4
 la $a0, newline
 syscall

 sll $t4,$s3,31 #SIGN
 #FRACTION
 sll $t5,$s6,23 #EXPONENT
 add $t6,$t4,$t5
 add $t6,$t6,$t3

 li $v0, 4
 la $a0, sum2
 syscall

 li $v0, 1
 move $a0, $t6
 syscall

li $v0, 4
 la $a0, newline
 syscall

 li $v0, 4
 la $a0, sum2
 syscall

 li $v0,2
 mtc1 $t6,$f12
 syscall
 jr $31
 # END OF PROGRAM
1

1 Answers

0
votes

You are using MARS syscall 5 to read the inputs, which reads them as integers. You should be reading them as floating point numbers.

You are not including the IEEE 754 hidden bit when you extract the fractions.

You are not handling the signs of the inputs correctly.

There's a lot more, but that's enough for now.