Silver_Smoulder icon

[ASM][Func] Project 1

Silver_Smoulder | PRO | 04/14/19 03:16:50 AM UTC | 0 ⭐ | 432 👁️ | Never ⏰ | []
text |

3.96 KB

|

None

|

0 👍

/

0 👎

##write a program that finds the sum of numbers entered by the user. Use a sentinel driven loop, where the sentinel is 0, to enter the numbers.
##Output how many numbers were entered,  remember the 0 is not "a number"
##Output the average of the numbers, to  3 decimal places.    No floating point instructions allowed
##be sure the code is well commented,  I will not grade any uncommented program.
##You have 2 submissions, for this project, I will look at the last file submitted.
##name your file lastnameProject1.Asm or it will not be graded.  (example, my file would be lichtenthalProject1.Asm)
 ##variables to use: t0 = store user number input, t1= counter of entries, t2 = non-decimal integer division storage, t3 = storage of remainder 1, t4 = storage of remainder 2, t5 = storage of remainder 3, t6 = total sum of the numbers input
#we are going to prompt the user to input numbers until they enter 0. every time they do, we increment t1 by 1. at the termination, we divide t0 by t1 and get some integer, storing it in t2
#then we do a modulo operation on that, storing it in t3. then we modulo t3, put the value into t4, and then modul0 t4, storing it in t5, giving us a value with 3 decimal places
#s1-s3 stores our remainder stuff
 .globl main
.text
 main:
 	#this is going to be our 0 sentinel/exit condition
	li $s0, 0
	li $t1, 0
	li $t6, 0
	li $s7, 10
 loop: 
 	li $v0, 4 #string output
	la $a0, number_entry
	syscall
 	li $v0, 5 #prep for user input
	syscall
   	move $t0, $v0 #store in $t0
    	add $t6, $t6, $t0 #take the value in $t0, add it to the value already in $t6, and store in $t6
    	beqz $t0, leave #exit if the user input 0 
    	addi $t1, $t1, 1 #increment the counter entry by 1
   	jal loop #go back to the loop
 leave:
	li $v0, 4 #string output
	la $a0, sum_of_all_numbers
	syscall
 	move $a0, $t6 #output the total sum of all numbers
        li $v0, 1     
        syscall
         li $v0, 4 #string output
	la $a0, iterations
	syscall
 	move $a0, $t1 #output the total sum of all numbers
        li $v0, 1     
        syscall
         li $v0, 4 #string output
	la $a0, spacing
	syscall
   	blez $t1, error #if we didn't input any numbers at all, the conter would be 0, and it could do a "divide by 0" error, so we'll warn people
 	#arithmetic block
	div $t2, $t6, $t1 #integer division result and storage in t2
 	#you never really think HOW decimals work until you have to, huh?
	#(remainder x 10)/divisor
 	rem $t3, $t6, $t1 #we get the remainder of the equation
	mul $s1, $t3, $s7 #multiply the remainder by 10
	div $t3, $s1, $t1 #divide the result by the original divisor
 	rem $t4, $s1, $t1 #same
	mul $s2, $t4, $s7 
	div $t4, $s2, $t1
 	rem $t5, $s2, $t1 #same
	mul $s3, $t5, $s7
	div $t5, $s3, $t1
 	li $v0, 4 #string output
	la $a0, average
	syscall
 	move $a0, $t2 #output the integer-part
        li $v0, 1     
        syscall 
         li $v0, 4 #output the string that's just a period
	la $a0, period
	syscall
 	move $a0, $t3 #output the .X decimal-part
        li $v0, 1     
        syscall
         move $a0, $t4 #output the .0X decimal-part
        li $v0, 1     
        syscall
         move $a0, $t5 #output the .00X decimal-part
        li $v0, 1     
        syscall
         li $v0, 10 #terminate the program
        syscall #go do it        
  error:
 	li $v0, 4 #output an error message
	la $a0, no_zero	
         li $v0, 10 #terminate the program
        syscall #go do it 	
 .data
 number_entry: 
	.asciiz "Please input your numbers, 0 terminates: \n" 
 iterations:
	.asciiz "\nTotal number of numbers entered: "
 sum_of_all_numbers:
	.asciiz "\nThe sum of all the numbers is: "
 period:
	.asciiz "."
 no_zero:
	.asciiz "Cannot divide by 0, restart program.\n"
 spacing:
	.asciiz "\n\n"
 average:
	.ascii "\nThe average is: "

Comments