Silver_Smoulder icon

[ASM][Non-Func] Menu Driven Arithmetic

Silver_Smoulder | PRO | 04/10/19 03:07:45 PM UTC | 0 ⭐ | 408 👁️ | Never ⏰ | []
text |

4.62 KB

|

None

|

0 👍

/

0 👎

##write a program that is menu driven:
#1 enter 2 numbers
#2 add, 3 subtract, 4 multiply, 5 divide, 6 modulus, 7 exit
#have a function for each entry
#start without error checking, but if I finish this at home (hah) then add error checking
#make sure to display the results via another function in menu
 .globl main
.text
 ##define t0 as being the menu choice, t1 and t2 being the numbers you're operating on,
#t3 holding the output
# s0 through S6 are going to be our values that we will be comparing our t#s to for menu tests
 main:
     li $s0, 1
    li $s1, 2
    li $s2, 3
    li $s3, 4
    li $s4, 5
    li $s5, 6
    li $s6, 7
    li $s7, 8
    ##These are immutable and now we can compare user input (stored in the "t" registers).
 menu: #this is going to be our menu loop
    li $v0, 4 #call a string that will output the menu
    la $a0, choices
    syscall
     li $v0, 5 #prep for user input
    syscall
    move $t0, $v0 #move the user input from $v0 to $t0 where it will stay until we reiterate the loop
     #this is our primary menu control structure and needs to be in the menu
    #compare user input to our constants, and then go do the section that does it
    beq $t0, $s0, two_number_input
    beq $t0, $s1, addition
    beq $t0, $s2, subtraction
    beq $t0, $s3, multiplication
    beq $t0, $s4, division
    beq $t0, $s5, modulus
    beq $t0, $s6, results
    beq $t0, $s7, exit
  two_number_input:
 	li $v0, 4 #we're telling the program that we are going to be outputting a string and loading it immediately
        la $a0, first_prompt #we're telling the program where to look for our message that we defined at the bottom of the program
        syscall #go do it
         #now, we should read in an integer as done by the user, with syscall 5
        li $v0, 5 #syscall for code 5 (reading in an integer)
        syscall #go do it
         move $t1, $v0 #moving the stored integer from $v0 to $t1 this is our first input value
         li $v0, 4 #we're telling the program that we are going to be outputting a string and loading it immediately
        la $a0, second_prompt #we're telling the program where to look for our message that we defined at the bottom of the program
        syscall #go do it
         #now, we should read in an integer as done by the user, with syscall 5
        li $v0, 5 #syscall for code 5 (reading in an integer)
        syscall #go do it
         move $t2, $v0 #moving the stored integer from $v0 to $t2
         j menu #go back to the menu
  addition:
	add $t3, $t1, $t2 #this should do: $t1+$t2 = something, which we put into $t3
	j menu #go back to the menu
 subtraction:
        sub $t3, $t1, $t2 #this should do: $t1-$t2 = something, which we put into $t3
        j menu #go back to the menu
 multiplication:
        mul $t3, $t1, $t2 #this should do: $t1*$t2 = something, which we put into $t3
        j menu #go back to the menu
 division:
	bltz $t2, error_div
        div $t3, $t1, $t2 #this should do: $t1/$t2 = something, which we put into $t3
        j menu #go back to the menu
 modulus:
        rem $t3, $t1, $t2 #this should do: $t1%$t2 = something, which we put into $t3
        j menu #go back to the menu
 ouput: 
   	li $v0, 4 #we're telling the program that we are going to be outputting a string and loading it immediately
        la $a0, ouput #we're telling the program where to look for our message that we defined at the bottom of the program
        syscall #go do it
         move $a0, $t3 #move the value stored $t0 to $a0
        li $v0, 1 #tell it we're about to print an integer
        syscall #print the integer
         j menu #go back to the menu
 exit:
    	li $v0, 4 #call a string that will output the menu
    	la $a0, terminate
    	syscall
 	li $v0, 10
	syscall
 error_div:
	li $v0, 4 #call a string that will output the menu
    	la $a0, div_error
    	syscall
    	j menu
 .data
 choices:
	.asciiz "\n\n1) Enter 2 numbers\n2) Add the two numbers\n3) Subtract the second number from the first\n4) Multiply the two numbers\n5) Divide the first number by the second\n6) Find the first number modulus the second number\n7) Output the results\n8) Exit\n\nEntry: "
 first_prompt:
	.asciiz "\nPlease input your first number: "
 second_prompt:
	.asciiz "\nPlease input your second number: "
 results:
   	.asciiz "\nThe answer is: "
 terminate:
	.asciiz "\nTermination code received. Good bye."
 div_error:
	.asciiz "\nCannot divide by 0. Bringing you back to the menu."

Comments