# Author: Danny Krizanc # Creation date: 02/23/07 # Computes exp(a,b) assuming a integer and b >= 0 integer and result # fits in int; returns 1 on exp(0,0) # # Define data to be used in the ".data" section. .data prompt1: .asciiz "\n Enter integer a:" #input prompt prompt2: .asciiz "\n Enter integer b:" #input prompt result1: .asciiz "\n Exponential(" #result prompt result2: .asciiz "," result3: .asciiz "):" .text main: li $v0, 4 #Prompt user for input la $a0, prompt1 syscall li $v0, 5 syscall add $s0, $v0, $zero #store input in $s0 li $v0, 4 #prompt user for second input la $a0, prompt2 syscall li $v0, 5 syscall add $s1, $v0, $zero #store input in $s1 add $a0, $s0, $zero #move args to $a0 and $a1 add $a1, $s1, $zero jal exponential #call exponential add $s2, $v0, $zero #store result in $s2 li $v0, 4 #Print result la $a0, result1 syscall li $v0, 1 add $a0, $s0, $zero syscall li $v0, 4 la $a0, result2 syscall li $v0, 1 add $a0, $s1, $zero syscall li $v0, 4 la $a0, result3 syscall li $v0, 1 add $a0, $s2, $zero syscall li $v0, 10 #exit syscall exponential: addi $sp, $sp, -8 #adjust stack to make room to store callee saved registers sw $s0, 4($sp) #on stack sw $s1, 0($sp) addi $s0, $zero, 1 #set $s0 to 1 (in case b=0) - note re-use of $s0 loop: slti $s1, $a1, 1 #loop to compute $a0* ... *$a0 for $a1 times bne $s1, $zero, return #note re-use of $s1 - must be restored mul $s0, $s0, $a0 addi $a1, -1 j loop return: add $v0, $s0, $zero #place result in return arg $v0 lw $s1, 0($sp) #restore saved registers and empty stack before returning lw $s0, 4($sp) addi $sp, $sp, 8 jr $ra #return to caller