#be able to take the power of a positive or negative exponent
.data
input_base:
.asciiz "Please enter your base: "
input_exponent:
.asciiz "Please input your exponent: "
output_result:
.asciiz "Your result is: "
newline:
.asciiz "\n"
.globl main
.text
#we are going to do this iteratively - we will have a counter.
#when the counter will be equal to the exponent, we will either output+terminate, or negate+output+terminate
#t0 is going to be our counter, t1 is going to be our base, t2 is going to be our exponent
#t3 is going to be the absolute value of the exponent (and exit condition), t4 is going to store our base increment
#f0 is going to be our output, $f2 is going to store ffloat 1, and $t5 is going to be integer 1
main:
#get all the inputs we need
li $t5, 1 #this is ugly and I hate it BUT it can also be our output for when the exponent is 0
li $t0, 1 #initialize our counter to 0
li $v0, 4 #string output
la $a0, input_base
syscall
li $v0, 5 #prep for user input
syscall
move $t1, $v0
li $v0, 4 #string output
la $a0, newline
syscall
li $v0, 4 #string output
la $a0, input_exponent
syscall
li $v0, 5 #prep for user input
syscall
move $t2, $v0
li $v0, 4 #string output
la $a0, newline
syscall
#next, we will determine whether the exponent is positive or negative and deal with it accordingly
move $t4, $t1 #set our base total value to our base increment during the first pass
beqz $t2, zero_exponent
bltz $t2, negative_exponent #if negative, go do a thing to it
#else if the exponent is positive
move $t3, $t2 #make sure our exponent is set in several places
positive_exponent:
beq $t0, $t3, exit #if the counter is equal to the exponent (our exit condition/sentinel), we leave
#else
mul $t4, $t4, $t1 #multiply our base total value by the base increment
addi $t0, $t0, 1 #increment our counter by 1
j positive_exponent
negative_exponent:
mul $t3, $t2, -1 #convert the negative exponent to a positive one and store it in a different place
j positive_exponent
zero_exponent:
#we will just output that the answer is 1
li $v0, 4 #string output
la $a0, output_result
syscall
move $a0, $t5
li $v0, 1
syscall
li $v0, 10 #terminate the program
syscall
exit:
bltz $t2, exit_negative #if the exponent was negative, we'll need to make it into a float
#else just output the result
li $v0, 4 #string output
la $a0, input_base
syscall
move $a0, $t4 #set a0 to have our final result
li $v0, 1 #prep for integer output
syscall
li $v0, 4 #string output
la $a0, newline
syscall
li $v0, 10 #terminate the program
syscall
exit_negative:
mtc1 $t4, $f0 #move our result from t4 to f0
cvt.s.w $f0, $f0 #convert t4 to a single-float in f0
mtc1 $t5, $f2 #set f2 to 1
cvt.s.w $f2, $f2 #convert the value 1 into a float
div.s $f12, $f2, $f0 #then we divide 1 by f0, and store it back in f12
li $v0, 2 #prep to output a float
syscall #go output the number stored in f12
li $v0, 4 #string output
la $a0, newline
syscall
li $v0, 10 #terminate the program
syscall
Comments