114 lines
1.9 KiB
ArmAsm
114 lines
1.9 KiB
ArmAsm
# COS235- HW4
|
|
# Nicholas Pease
|
|
# 31 OCT 2024
|
|
.data:
|
|
inputUInt: .space 32
|
|
dots: .asciz ".."
|
|
|
|
.text:
|
|
main:
|
|
li a7, 5 # input unsigned int (A)
|
|
la a0, inputUInt
|
|
ecall
|
|
mv a1, a0 # a1 = A
|
|
|
|
li a7, 5 # input unsigned int (B)
|
|
la a0, inputUInt
|
|
ecall
|
|
mv a2, a0
|
|
# a2 = B
|
|
|
|
# CALL RECURSIVE FUNCTION
|
|
jal kapow
|
|
jal kapow
|
|
|
|
# PRINT RETURN VALUE
|
|
li a7, 34
|
|
ecall
|
|
|
|
mv t0, a0
|
|
li a0, 9
|
|
li a7, 11
|
|
ecall
|
|
mv a0, t0
|
|
|
|
li a7, 1
|
|
ecall
|
|
|
|
jal newline
|
|
|
|
li a7, 10
|
|
ecall # Exit program
|
|
|
|
|
|
kapow:
|
|
# A0 = return
|
|
# A1 = A, X
|
|
# A2 = B, Y
|
|
# A3 = Saved
|
|
# t0 = Loop
|
|
# t1 = Temporary
|
|
|
|
addi sp, sp, -16
|
|
sw a3, 12(sp)
|
|
sw ra, 8(sp)
|
|
sw a1, 4(sp)
|
|
sw a2, 0(sp) # save all values before run
|
|
|
|
li t0, 0 # loop counter (0)
|
|
li a7, 4 # print string
|
|
la a0, dots # print dots
|
|
|
|
kapow_forLoop:
|
|
ecall
|
|
addi t0, t0, 1
|
|
bne t0,a2,kapow_forLoop
|
|
# END FOR LOOP
|
|
|
|
li a0, 32
|
|
li a7, 11
|
|
ecall
|
|
|
|
li a7, 1 # print int
|
|
mv a0, a2 # print Y
|
|
ecall
|
|
|
|
jal newline # print newline
|
|
|
|
li a0, 1
|
|
blt a0, a2, kapow_gt1 # if Y > 1, jump
|
|
blt zero, a2, kapow_gt0 # if Y > 0, jump
|
|
# others y < 0
|
|
j kapow_return
|
|
|
|
kapow_gt0:
|
|
mv a0, a1 # return X
|
|
j kapow_return
|
|
|
|
kapow_gt1:
|
|
li t0, 2
|
|
div a2,a2,t0 # Y = Y / 2
|
|
jal kapow # recursive call
|
|
mv a3, a0 # a3 = first return value
|
|
lw t1, 0(sp) # load original Y (t1)
|
|
li t0, 2 # remainder number (t0)
|
|
rem t0,t1,t0 # t0 = Y (t1) % 2 (t0)
|
|
add a2, t0, a2# Y = prevY + y%2
|
|
jal kapow
|
|
mul a0, a3, a0 # return = x * y
|
|
|
|
kapow_return:
|
|
lw a3, 12(sp)
|
|
lw ra, 8(sp)
|
|
lw a1, 4(sp)
|
|
lw a2, 0(sp)
|
|
addi sp, sp, 16
|
|
ret
|
|
|
|
newline:
|
|
mv t0, a0
|
|
li a0, 10
|
|
li a7, 11
|
|
ecall
|
|
mv a0, t0
|
|
ret |