#do the pythagorean theorem using the stack and functions calling functions .data prompt_A: .asciiz "Please enter side A: " prompt_B: .asciiz "\n Please enter side B: " prompt_C: .asciiz "\n Please enter side C: " comma: .asciiz ", " yes_right: .asciiz " - is a right triangle." no_right: .asciiz " - is not a right triangle." infinite_loop: .asciiz "\n \n THERE IS AN INFINITE LOOP!!! YOU SCREWED UP!!! \n\n" .globl main .text #the outline is as follows: #1) Go to main and activate allwork. #2) Store the address of allwork on the stack, then jump to input_numbers #3) Store the address of input_numbers, prompt user for input, jump to evaluate #4) Store the address of evaluate, and then test to see which of the numbers is the hypotenuse, jump to power #5) Store the address of power, and square all of the values, jump to calculate #6) Store the address of calculate, subtract the sum of the two non-hypotenuse squares (the legs), if they're zero, jump to yes, else no. #7a) Store address of yes, output that it is a right angle, jump to exit #7b) Store address of no, output that it is not a right angle, jump to exit. #8a) Clear the addresses from the stack, exit the program. main: jal allwork li $v0,10 syscall allwork: addi $sp, $sp, -4 #position -4 sw $ra, ($sp) jal input_numbers input_numbers: addi $sp, $sp, -4 #position -8 sw $ra, ($sp) li $v0, 4 #store 1st number la $a0, prompt_A syscall li $v0, 5 #prep for user input syscall move $s0, $v0 li $v0, 4 #store 2nd number la $a0, prompt_B syscall li $v0, 5 #prep for user input syscall move $s1, $v0 li $v0, 4 #store 3rd number la $a0, prompt_C syscall li $v0, 5 #prep for user input syscall move $s2, $v0 jal evaluate evaluate: #we are going to compare three numbers and see which is the largest #we will compare s0 to s1, then s0 to s2, then s1 to s2, and place the greatest number into s4, and the other two into s5 and s6 #if any of the numbers are equal to each other, we can hard_exit, since they cannot be a right triangle beq $s0, $s1, hard_exit beq $s1, $s2, hard_exit addi $sp, $sp, -4 #position -12 sw $ra, ($sp) move $s4, $s0 #store s0 in the hypotenuse slot bgt $s4, $s1, evaluate_s0_gt_s2 #if s0>s1, go check s0 and s2 j evaluate_s1_gt_s2 #if not, then s1 is greater than s0 evaluate_s0_gt_s2: bgt $s4, $s2, s0_grt #if s0 > s2 then s0 is the greatest j s2_grt #if not, then s2 is the greatest evaluate_s1_gt_s2: move $s4, $s1 #since s1 was bigger than s0, we place s1 into s5 bgt $s4, $s2, s1_grt #if s1 > s2 then s1 is the greatest j s2_grt #if not, then s2 is the greatest s0_grt: #s0 turned out to be the greatest number, so it is our hypotenuse move $s4, $s0 move $s5, $s1 move $s6, $s2 jal power s1_grt: #s1 turned out to be the greatest number, so it is our hypotenuse move $s4, $s1 move $s5, $s0 move $s6, $s2 jal power s2_grt: #s2 turned out to be the greatest number, so it is our hypotenuse move $s4, $s2 move $s5, $s0 move $s6, $s1 jal power hard_exit: #this only triggers if any of the numbers are equal to each other lw $ra, ($sp) addi $sp, $sp, 8 jr $ra #jump back and exit power: addi $sp, $sp, -4 #position 16 sw $ra, ($sp) li $t3, 0 #our power incrementor power_loop: add $t3, $t3, 1 #increment out power inrcrementor beq $t3, 2, calculate #our incrementor is also the power to which we raise our values. in this case it's 2 but we could change it to other stuff mul $s4, $s4, $s4 #square the hypotenuse mul $s5, $s5, $s5, #square one leg mul $s6, $s6, $s6 #square the other jal calculate calculate: addi $sp, $sp, -4 #position -20 sw $ra, ($sp) #set the sum of the two legs to s7. if s4 and s7 are equal, then it's a right triangle, if they aren't, then it isn't add $s7, $s5, $s6 beq $s4, $s7, yes j no yes: #output all the numbers and commas move $a0, $s0 #output the first integer, then a comma space li $v0, 1 syscall li $v0, 4 la $a0, comma syscall move $a0, $s1 #output the second integer, then a comma space li $v0, 1 syscall li $v0, 4 la $a0, comma syscall move $a0, $s2 #output the third integer, then a comma space li $v0, 1 syscall li $v0, 4 la $a0, yes_right syscall addi $sp, $sp, 16 lw $ra, ($sp) jr $ra #jump back and exit no: #output all the numbers and commas move $a0, $s0 #output the first integer, then a comma space li $v0, 1 syscall li $v0, 4 la $a0, comma syscall move $a0, $s1 #output the second integer, then a comma space li $v0, 1 syscall li $v0, 4 la $a0, comma syscall move $a0, $s2 #output the third integer, then a comma space li $v0, 1 syscall li $v0, 4 la $a0, no_right syscall addi $sp, $sp, 16 lw $ra, ($sp) jr $ra #jump back and exit