From b6c80af6c4b57424d39352e3fed9431a41d918ea Mon Sep 17 00:00:00 2001 From: nub31 Date: Thu, 30 Jan 2025 18:05:59 +0100 Subject: [PATCH] ... --- Nub.Lang/Nub.Lang/Backend/Custom/Generator.cs | 4 +- input/core/{arrsize.asm => arr_size.asm} | 4 +- input/core/array.nub | 1 + input/core/arrsize.nub | 1 - input/core/print.nub | 13 +++++- input/core/print_int.asm | 42 +++++++++++++++++++ input/core/{strlen.asm => str_len.asm} | 4 +- input/core/string.nub | 1 + input/core/strlen.nub | 1 - input/program.nub | 3 +- output/build.sh | 7 ++-- 11 files changed, 67 insertions(+), 14 deletions(-) rename input/core/{arrsize.asm => arr_size.asm} (50%) create mode 100644 input/core/array.nub delete mode 100644 input/core/arrsize.nub create mode 100644 input/core/print_int.asm rename input/core/{strlen.asm => str_len.asm} (79%) create mode 100644 input/core/string.nub delete mode 100644 input/core/strlen.nub diff --git a/Nub.Lang/Nub.Lang/Backend/Custom/Generator.cs b/Nub.Lang/Nub.Lang/Backend/Custom/Generator.cs index 7e9d77c..24f03bc 100644 --- a/Nub.Lang/Nub.Lang/Backend/Custom/Generator.cs +++ b/Nub.Lang/Nub.Lang/Backend/Custom/Generator.cs @@ -76,7 +76,7 @@ public class Generator mov rdi, 69 syscall - strcmp: + str_cmp: xor rdx, rdx .loop: mov al, [rsi + rdx] @@ -436,7 +436,7 @@ public class Generator case StringType: _builder.AppendLine(" mov rdi, rax"); _builder.AppendLine(" mov rsi, rbx"); - _builder.AppendLine(" call strcmp"); + _builder.AppendLine(" call str_cmp"); break; default: throw new ArgumentOutOfRangeException(nameof(type)); diff --git a/input/core/arrsize.asm b/input/core/arr_size.asm similarity index 50% rename from input/core/arrsize.asm rename to input/core/arr_size.asm index 6e6056e..b99ac73 100644 --- a/input/core/arrsize.asm +++ b/input/core/arr_size.asm @@ -1,6 +1,6 @@ -global arrsize +global arr_size section .text -arrsize: +arr_size: mov rax, [rdi] ret \ No newline at end of file diff --git a/input/core/array.nub b/input/core/array.nub new file mode 100644 index 0000000..dc7e6e3 --- /dev/null +++ b/input/core/array.nub @@ -0,0 +1 @@ +extern func arr_size(array: Array): int64; \ No newline at end of file diff --git a/input/core/arrsize.nub b/input/core/arrsize.nub deleted file mode 100644 index ef6afdb..0000000 --- a/input/core/arrsize.nub +++ /dev/null @@ -1 +0,0 @@ -extern func arrsize(array: Array): int64; \ No newline at end of file diff --git a/input/core/print.nub b/input/core/print.nub index 0fea73a..700b414 100644 --- a/input/core/print.nub +++ b/input/core/print.nub @@ -2,8 +2,14 @@ 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, strlen(msg)); + syscall(SYS_WRITE, STD_OUT, msg, str_len(msg)); +} + +func print(value: int64) { + print_int(value); } func print(value: bool) { @@ -27,3 +33,8 @@ func println(value: bool) { print(value); println(); } + +func println(value: int64) { + print(value); + println(); +} diff --git a/input/core/print_int.asm b/input/core/print_int.asm new file mode 100644 index 0000000..2304c81 --- /dev/null +++ b/input/core/print_int.asm @@ -0,0 +1,42 @@ +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/strlen.asm b/input/core/str_len.asm similarity index 79% rename from input/core/strlen.asm rename to input/core/str_len.asm index dcd0a3c..e296ab0 100644 --- a/input/core/strlen.asm +++ b/input/core/str_len.asm @@ -1,7 +1,7 @@ -global strlen +global str_len section .text -strlen: +str_len: xor rax, rax .loop: cmp byte [rdi], 0 diff --git a/input/core/string.nub b/input/core/string.nub new file mode 100644 index 0000000..d59e922 --- /dev/null +++ b/input/core/string.nub @@ -0,0 +1 @@ +extern func str_len(msg: String): int64; diff --git a/input/core/strlen.nub b/input/core/strlen.nub deleted file mode 100644 index ff54a7e..0000000 --- a/input/core/strlen.nub +++ /dev/null @@ -1 +0,0 @@ -extern func strlen(msg: String): int64; diff --git a/input/program.nub b/input/program.nub index 0337de7..b454e58 100644 --- a/input/program.nub +++ b/input/program.nub @@ -1,6 +1,5 @@ import "core"; func main() { - let x = new Array(2); - println(x == y); + println(58963475689457686745867567656769845676984567698475698674589675); } diff --git a/output/build.sh b/output/build.sh index 30c9715..0994e22 100755 --- a/output/build.sh +++ b/output/build.sh @@ -1,6 +1,7 @@ #!/bin/sh nasm -g -felf64 out.asm -o out.o -nasm -g -felf64 ../input/core/strlen.asm -o strlen.o -nasm -g -felf64 ../input/core/arrsize.asm -o arrsize.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 -ld -o out strlen.o arrsize.o out.o +ld -o out str_len.o arr_size.o print_int.o out.o