.data entx: .asciiz "Enter X: "; entm: .asciiz "Enter M: "; entb: .asciiz "Enter B: "; ans: .asciiz "Answer is: "; cont: .asciiz "Continue? (Y/N, def: N): " crlf: .asciiz " \n" buff: .space 64 .text #### PCRLF Subroutine call out_crlf: addiu $v0, $0, 4 la $a0 crlf syscall jr $ra #### Get INT subroutine call #### string passed in $a0 get_int: addiu $v0, $0, 4 syscall #get int addiu $v0, $0, 5 #syscall 5 (read integer) syscall jr $ra #### Print INT subroutine call ## Calculate M*X + B ## a0 = X, a1= M, a2 = B ## return result in v0 docalc: mult $a0 $a1 # m*X, result in hi, lo mflo $a1 # move lo into $a1 add $v0 $a1 $a2 # $v0 = M*X + B jr $ra ## entry point of program must be called 'main' main: la $a0 entx ## get X jal get_int addu $s0,$0,$v0 ## save X in $s0 la $a0 entm ## get M jal get_int addu $s1,$0,$v0 ## save M in $s1 la $a0 entb ## get B jal get_int addu $a2,$0,$v0 ## put B in $a2 addu $a1,$0,$s1 ## put M in $a1 addu $a0,$0,$s0 ## put X in $a0 jal docalc ## calculate m*x + b addu $s0,$0,$v0 ## put result in $s0 la $a0 ans ## Answer string addiu $v0, $0, 4 syscall add $a0, $0, $s0 ## print result addiu $v0, $0, 1 syscall jal out_crlf ## see if we want to continue... la $a0 cont ## Continue message addiu $v0, $0, 4 syscall la $a0 buff #get string from user addiu $a1 $0 64 addiu $v0 $0 8 #syscall 8 (read str) syscall ## only check first character. If Y, then continue lb $t0, 0($a0) # get first character andi $t0,$t0,0xDF # convert to upper addiu $t1, $0,0x59 # get 'Y' beq $t0,$t1,main #exit addiu $v0, $0, 10 syscall # syscall 10 (exit)