userct 0 Newbie Poster

Stack-based Evaluation and Simple Subroutine Linkage

Hello, I have to Write a program that evaluates 3x2 – 2y2 – 5xy + 20x – 16y + 100 for integers x and y that the user enters.
Prompt the user for x and y. Use pread from chapter 26 for this. Use it as it is, as if it were a library function which you can’t modify.
Write a subroutine, with entry point poly, that evaluates the polynomial. The subroutine takes two arguments, x and y, in registers $a0 and $a1 and returns the value of the polynomial in register $v0.

I've been doing pretty well up to this point. When my program executes and run it accepts my integers but the math performed is completely wrong. I'm having trouble grasping how to do the math exactly and feel I did it very wrong. I haven't worked with stacks at all so it's new to me.

Does anyone have any suggestions on how I could fix this?
Thank you for all your help.


## Evaluate a Polynomial 3x2 – 2y2 – 5xy + 20x – 16y + 100 # # This program uses simple linkage. # # Settings: Load delays ON; Branch delays ON # Trap file ON; Pseudoinstructions ON # ## Registers: ## $s0: x ## $s1: y ## $v0: Sum ## $t0 as temporary? .text .globl main main: jal pread # read first integer (x) nop # move $s0,$v0 # save it in $s0 jal pread # read second integer (y) nop # move $s1,$v0 # save it in $s1 jal poly nop addu $s0,$s0,$s1 # compute the sum addu $a0,$s0,$s2 la $a0,end # print string li $v0,4 # service 4 syscall li $v0,1 # print the sum syscall li $v0,10 # exit syscall .data end: .asciiz "The end result of 3x2 - 2y2 - 5xy + 20x - 16y + 100 is: " #Begin polynomial (poly subroutine) .text .globl poly poly: # prolog sub $sp,$sp,4 # push the return address sw $ra,($sp) sub $sp,$sp,4 # push $s0 sw $s0,($sp) sub $sp,$sp,4 # push $s1 sw $s1,($sp) li $t0, 0 #Evaluate 3x2 mul $t0, $s0, $s0 mul $t0, $t0, 3 addu $v0, $v0, $t0 li $t0,0 #Evaluate -2y2 mul $t0, $s1, $s1 mul $t0, $t0, -2 addu $v0, $v0, $t0 li $t0, 0 #Evaluate -5xy mul $t0, $s0, $s1 mul $t0, $t0, -5 addu $v0, $v0, $t0 li $t0, 0 #Evaluate +20x mul $t0, $s0, 20 addu $v0, $v0, $t0 li $t0, 0 #Evaluate -16y mul $t0, $s0, -16 addu $v0, $v0, $t0 li $t0, 0 #Evaluate +100 li $t0, 100 addu $v0, $v0, $t0 # epilog lw $s1,($sp) # pop $s1 add $sp,$sp,4 lw $s0,($sp) # pop $s0 add $sp,$sp,4 lw $ra,($sp) # pop return address add $sp,$sp,4 jr $ra # return to caller nop # pread -- prompt for and read an integer # # on entry: # $ra -- return address # # on exit: # $v0 -- the integer .text .globl pread pread: la $a0,prompt # print string li $v0,4 # service 4 syscall li $v0,5 # read int into $v0 syscall # service 5 jr $ra # return nop # .data prompt: .asciiz "Enter an integer "