# GRADER:
# The algorithm posted is correct.
# Please look into the comments I put in the source code, commented by # GRADER:
# The computation is not correct -30
# Score: 70 / 100
# Name: Darren Gruber
# email: dgruber@gwu.edu
# CSCI 136 Assignment 3 IEEE-754 Addition
.text
.globl main
main:
li $v0, 4 # Syscall code for printing strings
la $a0, prompt1 # Prompt for first decimal input
syscall
li $v0, 6 # Syscall code for inputting floating point
syscall
mov.s $f1, $f0 # Sets the first parameter
ask:
li $v0, 4 # Syscall code for printing strings
la $a0, prompt1 # Prompt for second operand
syscall
li $v0, 6 # Syscall code for inputting floating point
syscall
mfc1 $t1, $f0 # Store second operand so we can check if its 0
mov.s $f2, $f0 # Sets the second parameter
jal getsum
beqz $t1, done # User enter's zero, no more input needed
j ask # If user's input doesn't equal 0, ask again
getsum:
sub $sp, $sp,12 # Allocate space on the stack
swc1 $f1, 0($sp) # Save parameter 1
swc1 $f2, 4($sp) # Save parameter 2
sw $ra, 8($sp) # Save return address
addi $s6, $0, 1 # Prepare to add the leading 1 to mantissa
sll $s6, $s6, 23 # Span to the size of mantissa
mfc1 $t0, $f1 # Moves floating point to regular register
beqz $t0, retB # Operand 1 is 0, return B as answer
srl $s0, $t0, 31 # Stores sign bit of the input \ $s0 = signA
sll $s1, $t0, 1 # Gets rid of the sign bit
srl $s1, $s1, 24 # Isolates the exponent \ $s1 = expA
sll $s2, $t0, 9 # Isolates the mantissa
srl $s2, $s2, 9 # Isolates the mantissa \ $s2 = mantA
or $s2, $s2, $s6 # Adds the leading 1 to the mantissa
mfc1 $t1, $f2 # Moves floating point to regular register
beqz $t1, retA # Operand 2 is 0, return A as answer
srl $s3, $t1, 31 # Stores sign bit of the input \ $s3 = signB
sll $s4, $t1, 1 # Gets rid of the sign bit
srl $s4, $s4, 24 # Isolates the exponent \ $s4 = expB
sll $s5, $t1, 9 # Isolates the mantissa
srl $s5, $s5, 9 # Isolates the mantissa \ $s5 = mantB
or $s5, $s5, $s6 # Adds the leading 1 to the mantissa
blt $s1, $s4, L1 # if(expA < expB)
add $t1, $s1, $0 # else (expAns = expA)
# GRADER: In the following line, you shoulde put $s4 instead of $s3.
# sub $t5, $s1, $s3 # Calculate the difference between expA & expB
sub $t5, $s1, $s4 # Calculate the difference between expA & expB
srl $s5, $s5, $t5 # Shift manB to right by exp difference
j L1 # Now we check the signs
L1: # if(expA < expB), check signs
xor $t5, $s0, $s3 # Checks to see if signs are the same
beqz $t5, L2 # Branch to loop if signs are the same
sub $t2, $s2, $s5 # Signs diff. (manAns = manA + manB?+ 1)
j L3 # Check if manAns[24] = 1
L2:
add $t2, $s2, $s5 # manAns = manA + manB
add $t0, $s0, $0 # signAns = signA
j L3 # Check if manAns[24] = 1
L3:
srl $t6, $t2, 24 # Shift so we can check manAns[24]
addi $t7, $0, 1 # $t7 = 1
beq $t6, $t7, L4 # manAns[24] = 1
add $t0, $s0, $0 # signAns = signA
j FP # Time to reassemble the answer in FP
L4: # manAns[24] = 1
# GRADER: what the following line do? I do not think the following line is useful.
# neg $t2, $t2 # manAns = manAns?
# GRADER: you should do the normalization. The follwing is not normaliztion.
add $t0, $s3, $0 # signAns = signB
j FP # Time to reassemble the answer in FP
FP:
sll $t0, $t0, 31 # Extend the signAns to fit rest of answer
sll $t1, $t1, 23 # Extend the expAns to fir the rest of the answer
sll $t2, $t2, 9 # Remove the leading 1 from manAns
srl $t2, $t2, 9 # Remove the leading 1 from manAns
or $t0, $t0, $t1 # Add expAns to expSign
or $t0, $t0, $t2 # Add manAns to the rest of the answer
mtc1 $t0, $f3 # Moves the answer to the floating point register
j EN # We're done calculating the sum
EN:
li $v0, 4 # Syscall for printing strings
la $a0, ans # Print the string announcing the result
syscall
mov.s $f12, $f3 # Prepare to print out the FP answer
li $v0, 2 # Syscall for printing FP
syscall
lwc1 $f1, 0($sp) # Restore parameter 1
lwc1 $f2, 4($sp) # Restore parameter 2
lw $ra, 8($sp) # Restore return-address
add $sp, $sp, 12 # De-allocate stack space
jr $ra # Return from function call
retA:
mov.s $f1, $f0 # Move A from parameter to answer
j EN # Print result
retB:
mov.s $f2, $f0 # Move B from parameter to answer
j EN # Print result
done: # We're finished- so syscall to exit
li $v0,10
syscall # Exit
.data
prompt1: .asciiz "Please enter a decimal number to be added: "
ans: .asciiz "The answer is: "