This commit is contained in:
nub31
2025-01-30 18:05:59 +01:00
parent 1f4b2a42eb
commit b6c80af6c4
11 changed files with 67 additions and 14 deletions

View File

@@ -76,7 +76,7 @@ public class Generator
mov rdi, 69 mov rdi, 69
syscall syscall
strcmp: str_cmp:
xor rdx, rdx xor rdx, rdx
.loop: .loop:
mov al, [rsi + rdx] mov al, [rsi + rdx]
@@ -436,7 +436,7 @@ public class Generator
case StringType: case StringType:
_builder.AppendLine(" mov rdi, rax"); _builder.AppendLine(" mov rdi, rax");
_builder.AppendLine(" mov rsi, rbx"); _builder.AppendLine(" mov rsi, rbx");
_builder.AppendLine(" call strcmp"); _builder.AppendLine(" call str_cmp");
break; break;
default: default:
throw new ArgumentOutOfRangeException(nameof(type)); throw new ArgumentOutOfRangeException(nameof(type));

View File

@@ -1,6 +1,6 @@
global arrsize global arr_size
section .text section .text
arrsize: arr_size:
mov rax, [rdi] mov rax, [rdi]
ret ret

1
input/core/array.nub Normal file
View File

@@ -0,0 +1 @@
extern func arr_size(array: Array<Any>): int64;

View File

@@ -1 +0,0 @@
extern func arrsize(array: Array<Any>): int64;

View File

@@ -2,8 +2,14 @@ let SYS_WRITE = 1;
let STD_OUT = 1; let STD_OUT = 1;
let STD_ERR = 2; let STD_ERR = 2;
extern func print_int(value: int64);
func print(msg: String) { 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) { func print(value: bool) {
@@ -27,3 +33,8 @@ func println(value: bool) {
print(value); print(value);
println(); println();
} }
func println(value: int64) {
print(value);
println();
}

42
input/core/print_int.asm Normal file
View File

@@ -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

View File

@@ -1,7 +1,7 @@
global strlen global str_len
section .text section .text
strlen: str_len:
xor rax, rax xor rax, rax
.loop: .loop:
cmp byte [rdi], 0 cmp byte [rdi], 0

1
input/core/string.nub Normal file
View File

@@ -0,0 +1 @@
extern func str_len(msg: String): int64;

View File

@@ -1 +0,0 @@
extern func strlen(msg: String): int64;

View File

@@ -1,6 +1,5 @@
import "core"; import "core";
func main() { func main() {
let x = new Array<String>(2); println(58963475689457686745867567656769845676984567698475698674589675);
println(x == y);
} }

View File

@@ -1,6 +1,7 @@
#!/bin/sh #!/bin/sh
nasm -g -felf64 out.asm -o out.o nasm -g -felf64 out.asm -o out.o
nasm -g -felf64 ../input/core/strlen.asm -o strlen.o nasm -g -felf64 ../input/core/str_len.asm -o str_len.o
nasm -g -felf64 ../input/core/arrsize.asm -o arrsize.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