		.data
basemsg:	.asciiz		"Base: "
expmsg:		.asciiz		"Exponent: "
rsltmsg:	.asciiz		"Result is "
finalmsg:	.asciiz		".\n\nBye now!\n"
base:		.word
exp:		.word
result:		.word

		.text
__start:	
#	Register	Use
#	$s0=$16		base
#	$s1=$17		exponent
#	$s2=$18		result so far (initialized to 1)
#	$s3=$19		counter up to exponent
#	$s4=$20		temporary variable
#	$sp=$29		stack pointer
#	$ra=$31		return address

# In this program, we use SAL I/O for convenience; the rest of the
# program is written in MAL to demonstrate procedure calling.
		puts		basemsg
		get		base
		puts		expmsg
		get		exp
		lw		$s0,base
		lw		$s1,exp
		move		$s3,$s1
		jal		power
		sw		$s2,result
		puts		rsltmsg
		put		result
		puts		finalmsg
		done

# void power (void ) /* uses globals s0=base, s3=exp, s2=result */ {
#   if (exp > 0) {
#      exp = exp - 1;
#      power ();
#      result = result * base;
#      }
#   else
#      return 1;
#   }

power:		addi		$sp,$sp,-4
		sw		$ra,4($sp)

if:		blez		$s3,else

		addi		$s3,$s3,-1
		jal		power
		mul		$s2,$s2,$s0
		b		endif

else:		li		$s2,1
endif:		lw		$ra,4($sp)
		addi		$sp,$sp,4
		jr		$ra
		
