...
This commit is contained in:
@@ -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));
|
||||||
|
|||||||
@@ -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
1
input/core/array.nub
Normal file
@@ -0,0 +1 @@
|
|||||||
|
extern func arr_size(array: Array<Any>): int64;
|
||||||
@@ -1 +0,0 @@
|
|||||||
extern func arrsize(array: Array<Any>): int64;
|
|
||||||
@@ -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
42
input/core/print_int.asm
Normal 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
|
||||||
@@ -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
1
input/core/string.nub
Normal file
@@ -0,0 +1 @@
|
|||||||
|
extern func str_len(msg: String): int64;
|
||||||
@@ -1 +0,0 @@
|
|||||||
extern func strlen(msg: String): int64;
|
|
||||||
@@ -1,6 +1,5 @@
|
|||||||
import "core";
|
import "core";
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
let x = new Array<String>(2);
|
println(58963475689457686745867567656769845676984567698475698674589675);
|
||||||
println(x == y);
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user