Additional Changes
This commit is contained in:
@@ -10,7 +10,7 @@ main:
|
||||
li a7, 5 # input unsigned int (A)
|
||||
la a0, inputUInt
|
||||
ecall
|
||||
mv a3, a0 # a1 = A
|
||||
mv a1, a0 # a1 = A
|
||||
|
||||
li a7, 5 # input unsigned int (B)
|
||||
la a0, inputUInt
|
||||
@@ -21,20 +21,27 @@ main:
|
||||
# CALL RECURSIVE FUNCTION
|
||||
jal kapow
|
||||
|
||||
# RETURN RESULTS IN A0
|
||||
li a7, 5 # may be unnecessary
|
||||
ecall # TODO: FIX to format code
|
||||
# PRINT RETURN VALUE
|
||||
li a7, 1
|
||||
ecall
|
||||
|
||||
jal newline
|
||||
|
||||
li a7, 10
|
||||
ecall # Exit program
|
||||
|
||||
|
||||
kapow:
|
||||
# A0 = return
|
||||
# A1 = A / X
|
||||
# A2 = B / Y
|
||||
# A1 = A, X
|
||||
# A2 = B, Y
|
||||
# A3 = Saved
|
||||
# t0 = Loop
|
||||
# t1 = Temporary
|
||||
|
||||
addi sp, sp, -16
|
||||
sw ra, 12(sp)
|
||||
sw a0, 8(sp)
|
||||
sw a3, 12(sp)
|
||||
sw ra, 8(sp)
|
||||
sw a1, 4(sp)
|
||||
sw a2, 0(sp) # save all values before run
|
||||
|
||||
@@ -54,38 +61,40 @@ kapow:
|
||||
|
||||
jal newline # print newline
|
||||
|
||||
li t0, 1
|
||||
blt t0, a2, kapow_gt1 # if Y > 1, jump
|
||||
li a0, 1
|
||||
blt a0, a2, kapow_gt1 # if Y > 1, jump
|
||||
blt zero, a2, kapow_gt0 # if Y > 0, jump
|
||||
# others y < 0
|
||||
li a0, 1
|
||||
j kapow_return
|
||||
|
||||
kapow_gt0:
|
||||
mv a0, a1
|
||||
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 a1, a0 # a1 = first return value
|
||||
li t0, 2
|
||||
rem t0, a2, t0 # t0 = Y % 2
|
||||
add a2, t0, a2 # Y = prevY + y%2
|
||||
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, a1, a0 # return = x * y
|
||||
mul a0, a3, a0 # return = x * y
|
||||
|
||||
kapow_return:
|
||||
lw ra, 12(sp)
|
||||
#lw a0, 8(sp)
|
||||
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
|
||||
@@ -0,0 +1,98 @@
|
||||
# Nicholas Pease
|
||||
# 31 OCT 2024
|
||||
.data:
|
||||
inputUInt: .space 32
|
||||
dots: .asciz ".."
|
||||
|
||||
.text:
|
||||
main:
|
||||
li a7, 5 # input unsigned int (A)
|
||||
ecall
|
||||
mv a1, a0 # a1 = A
|
||||
|
||||
li a7, 5 # input unsigned int (B)
|
||||
ecall
|
||||
mv a2, a0 # a2 = B
|
||||
|
||||
# CALL RECURSIVE FUNCTION
|
||||
jal ra, kapow
|
||||
|
||||
# PRINT RETURN VALUE
|
||||
mv a0, a0
|
||||
li a7, 1
|
||||
ecall
|
||||
|
||||
jal ra, 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 a7, 1 # print int
|
||||
mv a0, a2 # print Y
|
||||
ecall
|
||||
|
||||
jal ra, newline # print newline
|
||||
|
||||
li t0, 1
|
||||
blt t0, a2, kapow_gt1 # if Y > 1, jump
|
||||
blt zero, a2, kapow_gt0 # if Y > 0, jump
|
||||
# others y < 0
|
||||
li a0, 1
|
||||
j kapow_return
|
||||
|
||||
kapow_gt0:
|
||||
mv a0, a1
|
||||
j kapow_return
|
||||
|
||||
kapow_gt1:
|
||||
li t0, 2
|
||||
div a2,a2,t0 # Y = Y / 2
|
||||
jal ra, 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 ra, 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
|
||||
@@ -1,9 +1,9 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <inttypes.h>
|
||||
#define show(x) printf("0x%04" PRIx16 "\n", x)
|
||||
#define show(x) printf("0x%04" PRIx16 "\t%" PRIu32 "\n", x, x)
|
||||
uint32_t kapow(uint32_t x, uint32_t y) {
|
||||
for(int i = 0; i < y; i++) printf("..");
|
||||
//for(int i = 0; i < y; i++) printf("..");
|
||||
printf(" %" PRIu32 "\n",y);
|
||||
if (y > 1) return kapow(x, y/2) * kapow(x, y/2 + y % 2);
|
||||
else return (y>0 ? x : 1);
|
||||
|
||||
Reference in New Issue
Block a user