From ae5f90456c1e1e0c745c2ffa5ab8add1f0c28d43 Mon Sep 17 00:00:00 2001 From: PleegWat Date: Thu, 10 Sep 2026 21:03:45 +0200 Subject: [PATCH] Add hex --- src/int_to_string.asm | 46 ++++++++++++++++++++++++++++++++++++ tests/int_to_string_test.asm | 12 +++++++--- 2 files changed, 55 insertions(+), 3 deletions(-) diff --git a/src/int_to_string.asm b/src/int_to_string.asm index b67f271..ceb166f 100644 --- a/src/int_to_string.asm +++ b/src/int_to_string.asm @@ -15,6 +15,8 @@ cmp r4, 2 je bin cmp r4, 8 je oct +cmp r4, 16 +je hex mov flags, errno.INTTOSTR_BAD_BASE jmp r13 @@ -110,3 +112,47 @@ lsr r5, r1, r4 ; Select bit and advance counter and r5, r5, 7 sub r4, r4, 3 jmp oct_print + +; Convert integer to hexadecimal string +; Arguments: +; r1 - Integer +; r2 - Start of buffer +; r3 - Buffer length +; Result: +; none +; Clobbers: +; flags +; r4 - input counter +; r5 - character +pub hex: +mov r4, 28 + +hex_find_one: +lsr r5, r1, r4 ; Select bit and advance counter +and r5, r5, 0xF +sub r4, r4, 4 + +cmp r4, 0 ; Start printing if last bit ... +jl hex_print +cmp r5, zr ; .. or if nonzero +je hex_find_one + +lsr flags, r5, 2 ; Check buffer size +add flags, flags, 3 +cmp flags, r3 +ja badbuffer + +hex_print: +add r5, r5, 0x30 ; '0' ; Add digit to buffer +cmp r5, 0x39 ; '9' +jle hex_no_letter +add r5, r5, 0x07 ; 'A' - '0' - 10 +hex_no_letter: +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, 0xF +sub r4, r4, 4 +jmp hex_print diff --git a/tests/int_to_string_test.asm b/tests/int_to_string_test.asm index 51a1424..e9b76cd 100644 --- a/tests/int_to_string_test.asm +++ b/tests/int_to_string_test.asm @@ -15,6 +15,7 @@ load_8 r4, [r4] mov r13, itoa_test_ret ; return address jmp stdlib.int_to_string.auto itoa_test_ret: +nop ; For breakpoint after itoa but before r1 clobber ; Strcmp to check results add r1, r8, 5 ; expected output @@ -44,9 +45,14 @@ tests: @0x20000 U32 0b0 U8 2 "0\0" @0x20040 U32 0xFFFFFFFF U8 2 "11111111111111111111111111111111\0" @0x20080 U32 0b101010 U8 2 "101010\0" -@0x200c0 U32 0o640 U8 8 "640\0" -@0x20100 U32 0xFFFFFFFF U8 8 "37777777777\0" -@0x20140 +@0x200c0 U32 0o0 U8 8 "0\0" +@0x20100 U32 0o640 U8 8 "640\0" +@0x20140 U32 0xFFFFFFFF U8 8 "37777777777\0" +@0x20180 U32 0x0 U8 16 "0\0" +@0x201c0 U32 0x32fF6 U8 16 "32FF6\0" +@0x20200 U32 0xdeadbeef U8 16 "DEADBEEF\0" +@0x20240 U32 0xFFFFFFFF U8 16 "FFFFFFFF\0" +@0x20280 end_of_tests: scratch: U1024 0