made puts wor for strings as well an some other changes

This commit is contained in:
IgorCielniak
2025-12-12 17:41:24 +01:00
parent 96366a98a8
commit 6910e05be6
20 changed files with 280 additions and 125 deletions

BIN
a.out

Binary file not shown.

2
a.sl
View File

@@ -1,5 +1,5 @@
import stdlib.sl
: main
"hello world" puts_str
"hello world" puts
;

View File

@@ -19,6 +19,36 @@ _start:
mov rax, 60
syscall
word_puts:
; detects string if top is len>=0 and next is a pointer in [data_start, data_end)
mov rax, [r12] ; len or int value
mov rbx, [r12 + 8] ; possible address
cmp rax, 0
jl puts_print_int
lea r8, [rel data_start]
lea r9, [rel data_end]
cmp rbx, r8
jl puts_print_int
cmp rbx, r9
jge puts_print_int
; treat as string: (addr below len)
mov rdx, rax ; len
mov rsi, rbx ; addr
add r12, 16 ; pop len + addr
test rdx, rdx
jz puts_str_newline_only
mov rax, 1
mov rdi, 1
syscall
puts_str_newline_only:
mov byte [rel print_buf], 10
mov rax, 1
mov rdi, 1
lea rsi, [rel print_buf]
mov rdx, 1
syscall
ret
puts_print_int:
mov rax, [r12]
add r12, 8
mov rbx, rax
@@ -65,25 +95,6 @@ puts_finish_digits:
mov rsi, r9
syscall
ret
word_puts_str:
; expects (addr, len) on data stack
mov rdx, [r12]
add r12, 8
mov rsi, [r12]
add r12, 8
cmp rdx, 0
je puts_str_write_newline
mov rax, 1
mov rdi, 1
syscall
puts_str_write_newline:
mov byte [rel print_buf], 10
mov rax, 1
mov rdi, 1
lea rsi, [rel print_buf]
mov rdx, 1
syscall
ret
word_dup:
mov rax, [r12]
sub r12, 8
@@ -267,11 +278,13 @@ word_main:
; push 11
sub r12, 8
mov qword [r12], 11
call word_puts_str
call word_puts
ret
section .data
data_start:
str_0: db 104, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100, 0
str_0_len equ 11
data_end:
section .bss
align 16
dstack: resb DSTK_BYTES

BIN
build/a.o

Binary file not shown.

View File

@@ -19,6 +19,36 @@ _start:
mov rax, 60
syscall
word_puts:
; detects string if top is len>=0 and next is a pointer in [data_start, data_end)
mov rax, [r12] ; len or int value
mov rbx, [r12 + 8] ; possible address
cmp rax, 0
jl puts_print_int
lea r8, [rel data_start]
lea r9, [rel data_end]
cmp rbx, r8
jl puts_print_int
cmp rbx, r9
jge puts_print_int
; treat as string: (addr below len)
mov rdx, rax ; len
mov rsi, rbx ; addr
add r12, 16 ; pop len + addr
test rdx, rdx
jz puts_str_newline_only
mov rax, 1
mov rdi, 1
syscall
puts_str_newline_only:
mov byte [rel print_buf], 10
mov rax, 1
mov rdi, 1
lea rsi, [rel print_buf]
mov rdx, 1
syscall
ret
puts_print_int:
mov rax, [r12]
add r12, 8
mov rbx, rax
@@ -65,25 +95,6 @@ puts_finish_digits:
mov rsi, r9
syscall
ret
word_puts_str:
; expects (addr, len) on data stack
mov rdx, [r12]
add r12, 8
mov rsi, [r12]
add r12, 8
cmp rdx, 0
je puts_str_write_newline
mov rax, 1
mov rdi, 1
syscall
puts_str_write_newline:
mov byte [rel print_buf], 10
mov rax, 1
mov rdi, 1
lea rsi, [rel print_buf]
mov rdx, 1
syscall
ret
word_dup:
mov rax, [r12]
sub r12, 8
@@ -296,6 +307,9 @@ word_foo:
call word_rdrop
call word_rdrop
ret
section .data
data_start:
data_end:
section .bss
align 16
dstack: resb DSTK_BYTES

Binary file not shown.

View File

@@ -19,6 +19,36 @@ _start:
mov rax, 60
syscall
word_puts:
; detects string if top is len>=0 and next is a pointer in [data_start, data_end)
mov rax, [r12] ; len or int value
mov rbx, [r12 + 8] ; possible address
cmp rax, 0
jl puts_print_int
lea r8, [rel data_start]
lea r9, [rel data_end]
cmp rbx, r8
jl puts_print_int
cmp rbx, r9
jge puts_print_int
; treat as string: (addr below len)
mov rdx, rax ; len
mov rsi, rbx ; addr
add r12, 16 ; pop len + addr
test rdx, rdx
jz puts_str_newline_only
mov rax, 1
mov rdi, 1
syscall
puts_str_newline_only:
mov byte [rel print_buf], 10
mov rax, 1
mov rdi, 1
lea rsi, [rel print_buf]
mov rdx, 1
syscall
ret
puts_print_int:
mov rax, [r12]
add r12, 8
mov rbx, rax
@@ -65,25 +95,6 @@ puts_finish_digits:
mov rsi, r9
syscall
ret
word_puts_str:
; expects (addr, len) on data stack
mov rdx, [r12]
add r12, 8
mov rsi, [r12]
add r12, 8
cmp rdx, 0
je puts_str_write_newline
mov rax, 1
mov rdi, 1
syscall
puts_str_write_newline:
mov byte [rel print_buf], 10
mov rax, 1
mov rdi, 1
lea rsi, [rel print_buf]
mov rdx, 1
syscall
ret
word_dup:
mov rax, [r12]
sub r12, 8
@@ -305,6 +316,9 @@ L_for_end_1:
sub r12, 8
mov qword [r12], 0
ret
section .data
data_start:
data_end:
section .bss
align 16
dstack: resb DSTK_BYTES

Binary file not shown.

View File

@@ -19,6 +19,36 @@ _start:
mov rax, 60
syscall
word_puts:
; detects string if top is len>=0 and next is a pointer in [data_start, data_end)
mov rax, [r12] ; len or int value
mov rbx, [r12 + 8] ; possible address
cmp rax, 0
jl puts_print_int
lea r8, [rel data_start]
lea r9, [rel data_end]
cmp rbx, r8
jl puts_print_int
cmp rbx, r9
jge puts_print_int
; treat as string: (addr below len)
mov rdx, rax ; len
mov rsi, rbx ; addr
add r12, 16 ; pop len + addr
test rdx, rdx
jz puts_str_newline_only
mov rax, 1
mov rdi, 1
syscall
puts_str_newline_only:
mov byte [rel print_buf], 10
mov rax, 1
mov rdi, 1
lea rsi, [rel print_buf]
mov rdx, 1
syscall
ret
puts_print_int:
mov rax, [r12]
add r12, 8
mov rbx, rax
@@ -277,6 +307,9 @@ word_foo:
call word_rdrop
call word_rdrop
ret
section .data
data_start:
data_end:
section .bss
align 16
dstack: resb DSTK_BYTES

Binary file not shown.

View File

@@ -19,6 +19,36 @@ _start:
mov rax, 60
syscall
word_puts:
; detects string if top is len>=0 and next is a pointer in [data_start, data_end)
mov rax, [r12] ; len or int value
mov rbx, [r12 + 8] ; possible address
cmp rax, 0
jl puts_print_int
lea r8, [rel data_start]
lea r9, [rel data_end]
cmp rbx, r8
jl puts_print_int
cmp rbx, r9
jge puts_print_int
; treat as string: (addr below len)
mov rdx, rax ; len
mov rsi, rbx ; addr
add r12, 16 ; pop len + addr
test rdx, rdx
jz puts_str_newline_only
mov rax, 1
mov rdi, 1
syscall
puts_str_newline_only:
mov byte [rel print_buf], 10
mov rax, 1
mov rdi, 1
lea rsi, [rel print_buf]
mov rdx, 1
syscall
ret
puts_print_int:
mov rax, [r12]
add r12, 8
mov rbx, rax
@@ -65,25 +95,6 @@ puts_finish_digits:
mov rsi, r9
syscall
ret
word_puts_str:
; expects (addr, len) on data stack
mov rdx, [r12]
add r12, 8
mov rsi, [r12]
add r12, 8
cmp rdx, 0
je puts_str_write_newline
mov rax, 1
mov rdi, 1
syscall
puts_str_write_newline:
mov byte [rel print_buf], 10
mov rax, 1
mov rdi, 1
lea rsi, [rel print_buf]
mov rdx, 1
syscall
ret
word_dup:
mov rax, [r12]
sub r12, 8
@@ -269,6 +280,9 @@ word_main:
sub r12, 8
mov qword [r12], 0
ret
section .data
data_start:
data_end:
section .bss
align 16
dstack: resb DSTK_BYTES

Binary file not shown.

View File

@@ -19,6 +19,36 @@ _start:
mov rax, 60
syscall
word_puts:
; detects string if top is len>=0 and next is a pointer in [data_start, data_end)
mov rax, [r12] ; len or int value
mov rbx, [r12 + 8] ; possible address
cmp rax, 0
jl puts_print_int
lea r8, [rel data_start]
lea r9, [rel data_end]
cmp rbx, r8
jl puts_print_int
cmp rbx, r9
jge puts_print_int
; treat as string: (addr below len)
mov rdx, rax ; len
mov rsi, rbx ; addr
add r12, 16 ; pop len + addr
test rdx, rdx
jz puts_str_newline_only
mov rax, 1
mov rdi, 1
syscall
puts_str_newline_only:
mov byte [rel print_buf], 10
mov rax, 1
mov rdi, 1
lea rsi, [rel print_buf]
mov rdx, 1
syscall
ret
puts_print_int:
mov rax, [r12]
add r12, 8
mov rbx, rax
@@ -65,25 +95,6 @@ puts_finish_digits:
mov rsi, r9
syscall
ret
word_puts_str:
; expects (addr, len) on data stack
mov rdx, [r12]
add r12, 8
mov rsi, [r12]
add r12, 8
cmp rdx, 0
je puts_str_write_newline
mov rax, 1
mov rdi, 1
syscall
puts_str_write_newline:
mov byte [rel print_buf], 10
mov rax, 1
mov rdi, 1
lea rsi, [rel print_buf]
mov rdx, 1
syscall
ret
word_dup:
mov rax, [r12]
sub r12, 8
@@ -267,32 +278,34 @@ word_main:
; push 11
sub r12, 8
mov qword [r12], 11
call word_puts_str
call word_puts
; push str_1
sub r12, 8
mov qword [r12], str_1
; push 11
sub r12, 8
mov qword [r12], 11
call word_puts_str
call word_puts
; push str_2
sub r12, 8
mov qword [r12], str_2
; push 0
sub r12, 8
mov qword [r12], 0
call word_puts_str
call word_puts
; push 0
sub r12, 8
mov qword [r12], 0
ret
section .data
data_start:
str_0: db 104, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100, 0
str_0_len equ 11
str_1: db 108, 105, 110, 101, 49, 10, 108, 105, 110, 101, 50, 0
str_1_len equ 11
str_2: db 0
str_2_len equ 0
data_end:
section .bss
align 16
dstack: resb DSTK_BYTES

Binary file not shown.

View File

@@ -19,6 +19,36 @@ _start:
mov rax, 60
syscall
word_puts:
; detects string if top is len>=0 and next is a pointer in [data_start, data_end)
mov rax, [r12] ; len or int value
mov rbx, [r12 + 8] ; possible address
cmp rax, 0
jl puts_print_int
lea r8, [rel data_start]
lea r9, [rel data_end]
cmp rbx, r8
jl puts_print_int
cmp rbx, r9
jge puts_print_int
; treat as string: (addr below len)
mov rdx, rax ; len
mov rsi, rbx ; addr
add r12, 16 ; pop len + addr
test rdx, rdx
jz puts_str_newline_only
mov rax, 1
mov rdi, 1
syscall
puts_str_newline_only:
mov byte [rel print_buf], 10
mov rax, 1
mov rdi, 1
lea rsi, [rel print_buf]
mov rdx, 1
syscall
ret
puts_print_int:
mov rax, [r12]
add r12, 8
mov rbx, rax
@@ -730,6 +760,9 @@ word_main:
sub r12, 8
mov qword [r12], 0
ret
section .data
data_start:
data_end:
section .bss
align 16
dstack: resb DSTK_BYTES

Binary file not shown.

View File

@@ -1,5 +1,5 @@
import stdlib.sl
: main
"hello world" puts_str
"hello world" puts
;

12
main.py
View File

@@ -1114,13 +1114,25 @@ class Assembler:
for definition in runtime_defs:
self._emit_definition(definition, emission.text)
if self._data_section is not None:
if not self._data_section:
self._data_section.append("data_start:")
if not self._data_section or self._data_section[-1] != "data_end:":
self._data_section.append("data_end:")
emission.bss.extend(self._bss_layout())
self._data_section = None
return emission
def _ensure_data_start(self) -> None:
if self._data_section is None:
raise CompileError("data section is not initialized")
if not self._data_section:
self._data_section.append("data_start:")
def _intern_string_literal(self, value: str) -> Tuple[str, int]:
if self._data_section is None:
raise CompileError("string literal emission requested without data section")
self._ensure_data_start()
if value in self._string_literals:
return self._string_literals[value]
label = f"str_{len(self._string_literals)}"

View File

@@ -1,4 +1,34 @@
:asm puts {
; detects string if top is len>=0 and next is a pointer in [data_start, data_end)
mov rax, [r12] ; len or int value
mov rbx, [r12 + 8] ; possible address
cmp rax, 0
jl puts_print_int
lea r8, [rel data_start]
lea r9, [rel data_end]
cmp rbx, r8
jl puts_print_int
cmp rbx, r9
jge puts_print_int
; treat as string: (addr below len)
mov rdx, rax ; len
mov rsi, rbx ; addr
add r12, 16 ; pop len + addr
test rdx, rdx
jz puts_str_newline_only
mov rax, 1
mov rdi, 1
syscall
puts_str_newline_only:
mov byte [rel print_buf], 10
mov rax, 1
mov rdi, 1
lea rsi, [rel print_buf]
mov rdx, 1
syscall
ret
puts_print_int:
mov rax, [r12]
add r12, 8
mov rbx, rax
@@ -47,27 +77,6 @@ puts_finish_digits:
}
;
:asm puts_str {
; expects (addr, len) on data stack
mov rdx, [r12]
add r12, 8
mov rsi, [r12]
add r12, 8
cmp rdx, 0
je puts_str_write_newline
mov rax, 1
mov rdi, 1
syscall
puts_str_write_newline:
mov byte [rel print_buf], 10
mov rax, 1
mov rdi, 1
lea rsi, [rel print_buf]
mov rdx, 1
syscall
}
;
:asm dup {
mov rax, [r12]
sub r12, 8

View File

@@ -105,9 +105,9 @@ compile-only
import {ROOT / 'stdlib.sl'}
: main
\"hello world\" puts_str
\"line1\\nline2\" puts_str
\"\" puts_str
\"hello world\" puts
\"line1\\nline2\" puts
\"\" puts
0
;
""",