# Part 2 .data prompt: .asciiz "Enter number:\nx = " result: .asciiz "\n3x^2 + 5x + 6 = " .globl main .text main: # prompt for number, keep x in $s0 li $v0, 4 la $a0, prompt syscall li $v0, 5 syscall add $s0, $zero, $v0 # Calculate x^2 add $a0, $zero, $s0 addi $a1, $zero, '*' add $a2, $zero, $s0 jal calculator # Calculate to get 3*x^2 add $a0, $zero, $v0 # move x^2 in $a0 addi $a1, $zero, '*' addi $a2, $zero, 3 jal calculator # keep 3x^2 in $t0 add $t0, $zero, $v0 # Calculate 5x add $a0, $zero, $s0 addi $a1, $zero, '*' addi $a2, $zero, 5 jal calculator # Calculate (3x^2)+(5x) add $a0, $zero, $t0 addi $a1, $zero, '+' add $a2, $zero, $v0 jal calculator # Calculate (3x^2+5x)+6 add $a0, $zero, $v0 addi $a1, $zero, '+' addi $a2, $zero, 6 jal calculator # Keep result in $t0 add $t0, $zero, $v0 li $v0, 4 la $a0, result syscall li $v0, 1 add $a0, $zero, $t0 syscall # Exit li $v0, 10 syscall calculator: # $a0 and $a2 are operands and $a1 is the operator # the return value is in $v0 # calculator uses $t1, preserved in stack addi $sp, $sp, -4 sw $t1, 0($sp) # branch to the proper piece of code depending on the operand li $t1, '+' beq $a1, $t1, OperationAdd li $t1, '-' beq $a1, $t1, OperationSub li $t1, '*' beq $a1, $t1, OperationMul li $t1, '/' beq $a1, $t1, OperationDiv # Should never end up here! # Ignore for coursework OperationAdd: add $v0, $a0, $a2 j return OperationSub: sub $v0, $a0, $a2 j return OperationMul: mul $v0, $a0, $a2 j return OperationDiv: div $v0, $a0, $a2 return: # restore $t1 from stack lw $t1, 0($sp) addi $sp, $sp, 4 jr $ra