		.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		$a0,base
		lw		$a1,exp
		jal		power
		sw		$v0,result
		puts		rsltmsg
		put		result
		puts		finalmsg
		done

# int power (int a0=base, a1=exp) {
#   if (exp <= 0)
#      return 1;
#   else
#      return base * power(base,exp-1);
#   }

power:		sw		$ra,0($sp)
		add		$sp,$sp,-4

if:		bgtz		$a1,else
		li		$v0,1
		b		endif

else:		add		$a1,$a1,-1
		jal		power
		mul		$v0,$v0,$a0

endif:		add		$sp,$sp,4
		lw		$ra,0($sp)
		jr		$ra
