diff --git a/input/core/itoa.asm b/input/core/itoa.asm new file mode 100644 index 0000000..c9d14b6 --- /dev/null +++ b/input/core/itoa.asm @@ -0,0 +1,29 @@ +section .bss + buffer resb 20 + +section .text + global itoa + +itoa: + push rbx + push rsi + push rdx + mov rax, rdi + mov rsi, buffer + 19 + mov byte [rsi], 0 + dec rsi +.loop: + xor rdx, rdx + mov rbx, 10 + div rbx + add dl, '0' + mov [rsi], dl + dec rsi + test rax, rax + jnz .loop + inc rsi + mov rax, rsi + pop rdx + pop rsi + pop rbx + ret diff --git a/input/core/print.nub b/input/core/print.nub index 700b414..bc4d90e 100644 --- a/input/core/print.nub +++ b/input/core/print.nub @@ -2,14 +2,12 @@ let SYS_WRITE = 1; let STD_OUT = 1; let STD_ERR = 2; -extern func print_int(value: int64); - func print(msg: String) { syscall(SYS_WRITE, STD_OUT, msg, str_len(msg)); } func print(value: int64) { - print_int(value); + print(itoa(value)); } func print(value: bool) { diff --git a/input/core/print_int.asm b/input/core/print_int.asm deleted file mode 100644 index 2304c81..0000000 --- a/input/core/print_int.asm +++ /dev/null @@ -1,42 +0,0 @@ -section .bss - buffer resb 20 ; Reserve 20 bytes for number string - -section .text - global print_int ; Make function callable from outside - -print_int: - push rbx ; Save rbx (callee-saved register) - push rsi ; Save rsi (callee-saved register) - push rdx ; Save rdx (callee-saved register) - - mov rax, rdi ; Move input number to rax - mov rsi, buffer + 19 ; Point to the last byte in buffer - mov byte [rsi], 0 ; Null terminator (not necessary for sys_write) - dec rsi ; Move back for digits - -.loop: - xor rdx, rdx ; Clear remainder - mov rbx, 10 ; Divisor - div rbx ; RAX / 10 -> Quotient in RAX, remainder in RDX - - add dl, '0' ; Convert remainder to ASCII - mov [rsi], dl ; Store character in buffer - dec rsi ; Move buffer pointer back - - test rax, rax ; Check if quotient is 0 - jnz .loop ; Continue if not 0 - - inc rsi ; Adjust pointer to first digit - - ; Print using sys_write - mov rax, 1 ; syscall: sys_write - mov rdi, 1 ; file descriptor: stdout - mov rdx, buffer + 20 ; End of buffer - sub rdx, rsi ; Compute actual length - syscall - - ; Restore registers and return - pop rdx - pop rsi - pop rbx - ret diff --git a/input/core/string.nub b/input/core/string.nub index d59e922..3e0ce0b 100644 --- a/input/core/string.nub +++ b/input/core/string.nub @@ -1 +1,2 @@ extern func str_len(msg: String): int64; +extern func itoa(value: int64): String; \ No newline at end of file diff --git a/input/program.nub b/input/program.nub index b454e58..93c20fb 100644 --- a/input/program.nub +++ b/input/program.nub @@ -1,5 +1,5 @@ import "core"; func main() { - println(58963475689457686745867567656769845676984567698475698674589675); + println(69); } diff --git a/output/build.sh b/output/build.sh index 0994e22..bd1156e 100755 --- a/output/build.sh +++ b/output/build.sh @@ -2,6 +2,6 @@ nasm -g -felf64 out.asm -o out.o nasm -g -felf64 ../input/core/str_len.asm -o str_len.o nasm -g -felf64 ../input/core/arr_size.asm -o arr_size.o -nasm -g -felf64 ../input/core/print_int.asm -o print_int.o +nasm -g -felf64 ../input/core/itoa.asm -o itoa.o -ld -o out str_len.o arr_size.o print_int.o out.o +ld -o out str_len.o arr_size.o itoa.o out.o