diff --git a/src/int_to_string.asm b/src/int_to_string.asm index 3b30768..b67f271 100644 --- a/src/int_to_string.asm +++ b/src/int_to_string.asm @@ -13,20 +13,33 @@ include errno pub auto: cmp r4, 2 je bin +cmp r4, 8 +je oct mov flags, errno.INTTOSTR_BAD_BASE jmp r13 +; The output buffer is too small for this integer +badbuffer: +mov flags, errno.INTTOSTR_BAD_BUFFER +jmp r13 + +; All digits have been output. Null terminate and exit. +done: +store_8 [r2], zr +mov flags, errno.OK +jmp r13 + ; Convert integer to binary string ; Arguments: ; r1 - Integer -; r2 - Start of buffer (assumed 'big enough') -; r3 - Buffer length (ignored) +; r2 - Start of buffer +; r3 - Buffer length ; Result: ; none ; Clobbers: ; flags ; r4 - counter -; r5 - result character +; r5 - character pub bin: mov r4, 31 cmp r2, 2 @@ -57,10 +70,43 @@ and r5, r5, 1 sub r4, r4, 1 jmp bin_print -badbuffer: -mov flags, errno.INTTOSTR_BAD_BUFFER -jmp r13 +; Convert integer to octal string +; Arguments: +; r1 - Integer +; r2 - Start of buffer +; r3 - Buffer length +; Result: +; none +; Clobbers: +; flags +; r4 - input counter +; r5 - character +; r6 - output size counter +pub oct: +mov r4, 30 +mov r6, 12 -done: -store_8 [r2], zr -jmp r13 +oct_find_one: +lsr r5, r1, r4 ; Select bit and advance counter +and r5, r5, 7 +sub r4, r4, 3 +sub r6, r6, 1 + +cmp r4, 0 ; Start printing if last bit ... +jl oct_print +cmp r5, zr ; .. or if nonzero +je oct_find_one + +cmp r6, r3 ; Check buffer size +ja badbuffer + +oct_print: +add r5, r5, 0x30 ; '0' ; Add digit to buffer +store_8 [r2], r5 +add r2, r2, 1 +cmp r4, 0 ; Done if last bit +jl done +lsr r5, r1, r4 ; Select bit and advance counter +and r5, r5, 7 +sub r4, r4, 3 +jmp oct_print diff --git a/tests/int_to_string_test.asm b/tests/int_to_string_test.asm index 2da2da9..51a1424 100644 --- a/tests/int_to_string_test.asm +++ b/tests/int_to_string_test.asm @@ -34,6 +34,7 @@ jl next_test ; Done halt + include ../src/stdlib @0x20000 @@ -43,7 +44,9 @@ tests: @0x20000 U32 0b0 U8 2 "0\0" @0x20040 U32 0xFFFFFFFF U8 2 "11111111111111111111111111111111\0" @0x20080 U32 0b101010 U8 2 "101010\0" -@0x200c0 +@0x200c0 U32 0o640 U8 8 "640\0" +@0x20100 U32 0xFFFFFFFF U8 8 "37777777777\0" +@0x20140 end_of_tests: scratch: U1024 0