# CalculatePowers subprogram example using MIPS register conventions .data maxNum: .word 3 maxPower: .word 4 str1: .asciiz " raised to " str2: .asciiz " power is " str3: .asciiz "\n" # newline character .text .globl main main: lw $a0, maxNum # $a0 contains maxNum lw $a1, maxPower # $a1 contains maxPower jal CalculatePower li $v0, 10 # system code for exit syscall ########################################################################### CalculatePower: # $a0 contains value of numLimit # $a1 contains value of powerLimit addi $sp, $sp, -20 # save room for the return address sw $ra, 4($sp) # push return address onto stack sw $s0, 8($sp) sw $s1, 12($sp) sw $s2, 16($sp) sw $s3, 20($sp) move $s0, $a0 # save numLimit in $s0 move $s1, $a1 # save powerLimit in $s1 for_1: li $s2, 1 # $s2 contains num for_compare_1: bgt $s2, $s0, end_for_1 for_body_1: for_2: li $s3, 1 # $s3 contains pow for_compare_2: bgt $s3, $s1, end_for_2 for_body_2: move $a0, $s2 # print num li $v0, 1 syscall la $a0, str1 # print " raised to " li $v0, 4 syscall move $a0, $s3 # print pow li $v0, 1 syscall la $a0, str2 # print " power is " li $v0, 4 syscall move $a0, $s2 # call Power(num, pow) move $a1, $s3 jal Power move $a0, $v0 # print result li $v0, 1 syscall la $a0, str3 # print new-line character li $v0, 4 syscall addi $s3, $s3, 1 j for_compare_2 end_for_2: addi $s2, $s2, 1 j for_compare_1 end_for_1: lw $ra, 4($sp) # restore return addr. to $ra lw $s0, 8($sp) lw $s1, 12($sp) lw $s2, 16($sp) lw $s3, 20($sp) addi $sp, $sp, 20 # pop call frame from stack jr $ra end_CalculatePowers: ########################################################################### Power: # $a0 contains n # $a1 contains e addi $sp, $sp, -4 sw $ra, 4($sp) # save $ra on stack if: bne $a1, $zero, else_if li $v0, 1 # $v0 contains result j end_if else_if: bne $a1, 1, else move $v0, $a0 j end_if else: # first parameter is still n in $a0 addi $a1, $a1, -1 # second parameter e-1 jal Power # value of Power(n, e-1) in $v0 mul $v0, $v0, $a0 # result = Power(n, e-1) * n end_if: lw $ra, 4($sp) # restore return addr. to $ra addi $sp, $sp, 4 # pop call frame from stack jr $ra end_Power: