summaryrefslogtreecommitdiff
path: root/tools/builtin.s
diff options
context:
space:
mode:
Diffstat (limited to 'tools/builtin.s')
-rw-r--r--tools/builtin.s42
1 files changed, 27 insertions, 15 deletions
diff --git a/tools/builtin.s b/tools/builtin.s
index 17e262d..7b14d95 100644
--- a/tools/builtin.s
+++ b/tools/builtin.s
@@ -6,29 +6,41 @@
.text
printi:
- addi sp, sp, -4
+ addi sp, sp, -16
sw s0, 0(sp)
sw ra, 4(sp)
- addi s0, sp, 4
-
- addi t0, a0, 0
- addi a0, a0, '0'
- sw a0, 0(s0)
- addi a0, x0, 1
- addi a1, s0, 0
- addi a2, x0, 1
- addi a7, x0, 64
- ecall
+ addi s0, sp, 16
+
+ addi t1, zero, '\n'
+ sb t1, -1(s0)
+
+ # t0 - Whole number.
+ # t1 - Constant 10.
+ # a1 - Local buffer.
+ # t2 - Current character.
+ lw t0, 0(s0)
+ addi t1, zero, 10
+ addi a1, s0, -2
+
+.digit10:
+ rem t2, t0, t1
+ addi t2, t2, '0'
+ sb t2, 0(a1)
+ div t0, t0, t1
+ addi a1, a1, -1
+ bne zero, t0, .digit10
- addi t1, x0, '\n'
- sw t1, 0(s0)
ecall
- addi a0, t0, 0
+ addi a0, zero, 1
+ addi a1, a1, 1
+ sub a2, s0, a1
+ addi a7, zero, 64
+ ecall
lw s0, 0(sp)
lw ra, 4(sp)
- addi sp, sp, 4
+ addi sp, sp, 16
ret
_start: