made puts wor for strings as well an some other changes
This commit is contained in:
2
a.sl
2
a.sl
@@ -1,5 +1,5 @@
|
|||||||
import stdlib.sl
|
import stdlib.sl
|
||||||
|
|
||||||
: main
|
: main
|
||||||
"hello world" puts_str
|
"hello world" puts
|
||||||
;
|
;
|
||||||
53
build/a.asm
53
build/a.asm
@@ -19,6 +19,36 @@ _start:
|
|||||||
mov rax, 60
|
mov rax, 60
|
||||||
syscall
|
syscall
|
||||||
word_puts:
|
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]
|
mov rax, [r12]
|
||||||
add r12, 8
|
add r12, 8
|
||||||
mov rbx, rax
|
mov rbx, rax
|
||||||
@@ -65,25 +95,6 @@ puts_finish_digits:
|
|||||||
mov rsi, r9
|
mov rsi, r9
|
||||||
syscall
|
syscall
|
||||||
ret
|
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:
|
word_dup:
|
||||||
mov rax, [r12]
|
mov rax, [r12]
|
||||||
sub r12, 8
|
sub r12, 8
|
||||||
@@ -267,11 +278,13 @@ word_main:
|
|||||||
; push 11
|
; push 11
|
||||||
sub r12, 8
|
sub r12, 8
|
||||||
mov qword [r12], 11
|
mov qword [r12], 11
|
||||||
call word_puts_str
|
call word_puts
|
||||||
ret
|
ret
|
||||||
section .data
|
section .data
|
||||||
|
data_start:
|
||||||
str_0: db 104, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100, 0
|
str_0: db 104, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100, 0
|
||||||
str_0_len equ 11
|
str_0_len equ 11
|
||||||
|
data_end:
|
||||||
section .bss
|
section .bss
|
||||||
align 16
|
align 16
|
||||||
dstack: resb DSTK_BYTES
|
dstack: resb DSTK_BYTES
|
||||||
|
|||||||
@@ -19,6 +19,36 @@ _start:
|
|||||||
mov rax, 60
|
mov rax, 60
|
||||||
syscall
|
syscall
|
||||||
word_puts:
|
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]
|
mov rax, [r12]
|
||||||
add r12, 8
|
add r12, 8
|
||||||
mov rbx, rax
|
mov rbx, rax
|
||||||
@@ -65,25 +95,6 @@ puts_finish_digits:
|
|||||||
mov rsi, r9
|
mov rsi, r9
|
||||||
syscall
|
syscall
|
||||||
ret
|
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:
|
word_dup:
|
||||||
mov rax, [r12]
|
mov rax, [r12]
|
||||||
sub r12, 8
|
sub r12, 8
|
||||||
@@ -296,6 +307,9 @@ word_foo:
|
|||||||
call word_rdrop
|
call word_rdrop
|
||||||
call word_rdrop
|
call word_rdrop
|
||||||
ret
|
ret
|
||||||
|
section .data
|
||||||
|
data_start:
|
||||||
|
data_end:
|
||||||
section .bss
|
section .bss
|
||||||
align 16
|
align 16
|
||||||
dstack: resb DSTK_BYTES
|
dstack: resb DSTK_BYTES
|
||||||
|
|||||||
Binary file not shown.
@@ -19,6 +19,36 @@ _start:
|
|||||||
mov rax, 60
|
mov rax, 60
|
||||||
syscall
|
syscall
|
||||||
word_puts:
|
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]
|
mov rax, [r12]
|
||||||
add r12, 8
|
add r12, 8
|
||||||
mov rbx, rax
|
mov rbx, rax
|
||||||
@@ -65,25 +95,6 @@ puts_finish_digits:
|
|||||||
mov rsi, r9
|
mov rsi, r9
|
||||||
syscall
|
syscall
|
||||||
ret
|
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:
|
word_dup:
|
||||||
mov rax, [r12]
|
mov rax, [r12]
|
||||||
sub r12, 8
|
sub r12, 8
|
||||||
@@ -305,6 +316,9 @@ L_for_end_1:
|
|||||||
sub r12, 8
|
sub r12, 8
|
||||||
mov qword [r12], 0
|
mov qword [r12], 0
|
||||||
ret
|
ret
|
||||||
|
section .data
|
||||||
|
data_start:
|
||||||
|
data_end:
|
||||||
section .bss
|
section .bss
|
||||||
align 16
|
align 16
|
||||||
dstack: resb DSTK_BYTES
|
dstack: resb DSTK_BYTES
|
||||||
|
|||||||
Binary file not shown.
@@ -19,6 +19,36 @@ _start:
|
|||||||
mov rax, 60
|
mov rax, 60
|
||||||
syscall
|
syscall
|
||||||
word_puts:
|
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]
|
mov rax, [r12]
|
||||||
add r12, 8
|
add r12, 8
|
||||||
mov rbx, rax
|
mov rbx, rax
|
||||||
@@ -277,6 +307,9 @@ word_foo:
|
|||||||
call word_rdrop
|
call word_rdrop
|
||||||
call word_rdrop
|
call word_rdrop
|
||||||
ret
|
ret
|
||||||
|
section .data
|
||||||
|
data_start:
|
||||||
|
data_end:
|
||||||
section .bss
|
section .bss
|
||||||
align 16
|
align 16
|
||||||
dstack: resb DSTK_BYTES
|
dstack: resb DSTK_BYTES
|
||||||
|
|||||||
BIN
build/main.o
BIN
build/main.o
Binary file not shown.
@@ -19,6 +19,36 @@ _start:
|
|||||||
mov rax, 60
|
mov rax, 60
|
||||||
syscall
|
syscall
|
||||||
word_puts:
|
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]
|
mov rax, [r12]
|
||||||
add r12, 8
|
add r12, 8
|
||||||
mov rbx, rax
|
mov rbx, rax
|
||||||
@@ -65,25 +95,6 @@ puts_finish_digits:
|
|||||||
mov rsi, r9
|
mov rsi, r9
|
||||||
syscall
|
syscall
|
||||||
ret
|
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:
|
word_dup:
|
||||||
mov rax, [r12]
|
mov rax, [r12]
|
||||||
sub r12, 8
|
sub r12, 8
|
||||||
@@ -269,6 +280,9 @@ word_main:
|
|||||||
sub r12, 8
|
sub r12, 8
|
||||||
mov qword [r12], 0
|
mov qword [r12], 0
|
||||||
ret
|
ret
|
||||||
|
section .data
|
||||||
|
data_start:
|
||||||
|
data_end:
|
||||||
section .bss
|
section .bss
|
||||||
align 16
|
align 16
|
||||||
dstack: resb DSTK_BYTES
|
dstack: resb DSTK_BYTES
|
||||||
|
|||||||
Binary file not shown.
@@ -19,6 +19,36 @@ _start:
|
|||||||
mov rax, 60
|
mov rax, 60
|
||||||
syscall
|
syscall
|
||||||
word_puts:
|
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]
|
mov rax, [r12]
|
||||||
add r12, 8
|
add r12, 8
|
||||||
mov rbx, rax
|
mov rbx, rax
|
||||||
@@ -65,25 +95,6 @@ puts_finish_digits:
|
|||||||
mov rsi, r9
|
mov rsi, r9
|
||||||
syscall
|
syscall
|
||||||
ret
|
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:
|
word_dup:
|
||||||
mov rax, [r12]
|
mov rax, [r12]
|
||||||
sub r12, 8
|
sub r12, 8
|
||||||
@@ -267,32 +278,34 @@ word_main:
|
|||||||
; push 11
|
; push 11
|
||||||
sub r12, 8
|
sub r12, 8
|
||||||
mov qword [r12], 11
|
mov qword [r12], 11
|
||||||
call word_puts_str
|
call word_puts
|
||||||
; push str_1
|
; push str_1
|
||||||
sub r12, 8
|
sub r12, 8
|
||||||
mov qword [r12], str_1
|
mov qword [r12], str_1
|
||||||
; push 11
|
; push 11
|
||||||
sub r12, 8
|
sub r12, 8
|
||||||
mov qword [r12], 11
|
mov qword [r12], 11
|
||||||
call word_puts_str
|
call word_puts
|
||||||
; push str_2
|
; push str_2
|
||||||
sub r12, 8
|
sub r12, 8
|
||||||
mov qword [r12], str_2
|
mov qword [r12], str_2
|
||||||
; push 0
|
; push 0
|
||||||
sub r12, 8
|
sub r12, 8
|
||||||
mov qword [r12], 0
|
mov qword [r12], 0
|
||||||
call word_puts_str
|
call word_puts
|
||||||
; push 0
|
; push 0
|
||||||
sub r12, 8
|
sub r12, 8
|
||||||
mov qword [r12], 0
|
mov qword [r12], 0
|
||||||
ret
|
ret
|
||||||
section .data
|
section .data
|
||||||
|
data_start:
|
||||||
str_0: db 104, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100, 0
|
str_0: db 104, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100, 0
|
||||||
str_0_len equ 11
|
str_0_len equ 11
|
||||||
str_1: db 108, 105, 110, 101, 49, 10, 108, 105, 110, 101, 50, 0
|
str_1: db 108, 105, 110, 101, 49, 10, 108, 105, 110, 101, 50, 0
|
||||||
str_1_len equ 11
|
str_1_len equ 11
|
||||||
str_2: db 0
|
str_2: db 0
|
||||||
str_2_len equ 0
|
str_2_len equ 0
|
||||||
|
data_end:
|
||||||
section .bss
|
section .bss
|
||||||
align 16
|
align 16
|
||||||
dstack: resb DSTK_BYTES
|
dstack: resb DSTK_BYTES
|
||||||
|
|||||||
Binary file not shown.
@@ -19,6 +19,36 @@ _start:
|
|||||||
mov rax, 60
|
mov rax, 60
|
||||||
syscall
|
syscall
|
||||||
word_puts:
|
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]
|
mov rax, [r12]
|
||||||
add r12, 8
|
add r12, 8
|
||||||
mov rbx, rax
|
mov rbx, rax
|
||||||
@@ -730,6 +760,9 @@ word_main:
|
|||||||
sub r12, 8
|
sub r12, 8
|
||||||
mov qword [r12], 0
|
mov qword [r12], 0
|
||||||
ret
|
ret
|
||||||
|
section .data
|
||||||
|
data_start:
|
||||||
|
data_end:
|
||||||
section .bss
|
section .bss
|
||||||
align 16
|
align 16
|
||||||
dstack: resb DSTK_BYTES
|
dstack: resb DSTK_BYTES
|
||||||
|
|||||||
BIN
build/test.o
BIN
build/test.o
Binary file not shown.
2
hello.sl
2
hello.sl
@@ -1,5 +1,5 @@
|
|||||||
import stdlib.sl
|
import stdlib.sl
|
||||||
|
|
||||||
: main
|
: main
|
||||||
"hello world" puts_str
|
"hello world" puts
|
||||||
;
|
;
|
||||||
12
main.py
12
main.py
@@ -1114,13 +1114,25 @@ class Assembler:
|
|||||||
for definition in runtime_defs:
|
for definition in runtime_defs:
|
||||||
self._emit_definition(definition, emission.text)
|
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())
|
emission.bss.extend(self._bss_layout())
|
||||||
self._data_section = None
|
self._data_section = None
|
||||||
return emission
|
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]:
|
def _intern_string_literal(self, value: str) -> Tuple[str, int]:
|
||||||
if self._data_section is None:
|
if self._data_section is None:
|
||||||
raise CompileError("string literal emission requested without data section")
|
raise CompileError("string literal emission requested without data section")
|
||||||
|
self._ensure_data_start()
|
||||||
if value in self._string_literals:
|
if value in self._string_literals:
|
||||||
return self._string_literals[value]
|
return self._string_literals[value]
|
||||||
label = f"str_{len(self._string_literals)}"
|
label = f"str_{len(self._string_literals)}"
|
||||||
|
|||||||
51
stdlib.sl
51
stdlib.sl
@@ -1,4 +1,34 @@
|
|||||||
:asm puts {
|
: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]
|
mov rax, [r12]
|
||||||
add r12, 8
|
add r12, 8
|
||||||
mov rbx, rax
|
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 {
|
:asm dup {
|
||||||
mov rax, [r12]
|
mov rax, [r12]
|
||||||
sub r12, 8
|
sub r12, 8
|
||||||
|
|||||||
@@ -105,9 +105,9 @@ compile-only
|
|||||||
import {ROOT / 'stdlib.sl'}
|
import {ROOT / 'stdlib.sl'}
|
||||||
|
|
||||||
: main
|
: main
|
||||||
\"hello world\" puts_str
|
\"hello world\" puts
|
||||||
\"line1\\nline2\" puts_str
|
\"line1\\nline2\" puts
|
||||||
\"\" puts_str
|
\"\" puts
|
||||||
0
|
0
|
||||||
;
|
;
|
||||||
""",
|
""",
|
||||||
|
|||||||
Reference in New Issue
Block a user