fix for reading stdin
This commit is contained in:
@@ -446,26 +446,29 @@ word_read_stdin:
|
|||||||
cmp rax, -4095
|
cmp rax, -4095
|
||||||
jae .fail_mmap
|
jae .fail_mmap
|
||||||
mov rbx, rax ; buffer addr
|
mov rbx, rax ; buffer addr
|
||||||
xor rcx, rcx ; bytes_read = 0
|
xor r9, r9 ; bytes_read = 0
|
||||||
|
|
||||||
.read_loop:
|
.read_loop:
|
||||||
mov rax, 0 ; syscall: read
|
mov rax, 0 ; syscall: read
|
||||||
mov rdi, 0 ; fd = stdin
|
mov rdi, 0 ; fd = stdin
|
||||||
lea rsi, [rbx + rcx] ; buf + offset
|
lea rsi, [rbx + r9] ; buf + offset
|
||||||
mov rdx, r14
|
mov rdx, r14
|
||||||
sub rdx, rcx ; remaining = max_len - bytes_read
|
sub rdx, r9 ; remaining = max_len - bytes_read
|
||||||
syscall
|
syscall
|
||||||
cmp rax, 0
|
cmp rax, 0
|
||||||
je .done_read
|
je .done_read
|
||||||
js .read_error
|
js .read_error
|
||||||
add rcx, rax
|
add r9, rax
|
||||||
cmp rcx, r14
|
|
||||||
jl .read_loop
|
jl .read_loop
|
||||||
|
|
||||||
.done_read:
|
.done_read:
|
||||||
; push len (rcx) then addr (rbx)
|
; push len (rcx) then addr (rbx)
|
||||||
|
cmp r9, r14
|
||||||
|
je .done_no_null
|
||||||
|
mov byte [rbx + r9], 0
|
||||||
|
.done_no_null:
|
||||||
sub r12, 16
|
sub r12, 16
|
||||||
mov [r12], rcx
|
mov [r12], r9
|
||||||
mov [r12 + 8], rbx
|
mov [r12 + 8], rbx
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
@@ -446,26 +446,29 @@ word_read_stdin:
|
|||||||
cmp rax, -4095
|
cmp rax, -4095
|
||||||
jae .fail_mmap
|
jae .fail_mmap
|
||||||
mov rbx, rax ; buffer addr
|
mov rbx, rax ; buffer addr
|
||||||
xor rcx, rcx ; bytes_read = 0
|
xor r9, r9 ; bytes_read = 0
|
||||||
|
|
||||||
.read_loop:
|
.read_loop:
|
||||||
mov rax, 0 ; syscall: read
|
mov rax, 0 ; syscall: read
|
||||||
mov rdi, 0 ; fd = stdin
|
mov rdi, 0 ; fd = stdin
|
||||||
lea rsi, [rbx + rcx] ; buf + offset
|
lea rsi, [rbx + r9] ; buf + offset
|
||||||
mov rdx, r14
|
mov rdx, r14
|
||||||
sub rdx, rcx ; remaining = max_len - bytes_read
|
sub rdx, r9 ; remaining = max_len - bytes_read
|
||||||
syscall
|
syscall
|
||||||
cmp rax, 0
|
cmp rax, 0
|
||||||
je .done_read
|
je .done_read
|
||||||
js .read_error
|
js .read_error
|
||||||
add rcx, rax
|
add r9, rax
|
||||||
cmp rcx, r14
|
|
||||||
jl .read_loop
|
jl .read_loop
|
||||||
|
|
||||||
.done_read:
|
.done_read:
|
||||||
; push len (rcx) then addr (rbx)
|
; push len (rcx) then addr (rbx)
|
||||||
|
cmp r9, r14
|
||||||
|
je .done_no_null
|
||||||
|
mov byte [rbx + r9], 0
|
||||||
|
.done_no_null:
|
||||||
sub r12, 16
|
sub r12, 16
|
||||||
mov [r12], rcx
|
mov [r12], r9
|
||||||
mov [r12 + 8], rbx
|
mov [r12 + 8], rbx
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
@@ -446,26 +446,29 @@ word_read_stdin:
|
|||||||
cmp rax, -4095
|
cmp rax, -4095
|
||||||
jae .fail_mmap
|
jae .fail_mmap
|
||||||
mov rbx, rax ; buffer addr
|
mov rbx, rax ; buffer addr
|
||||||
xor rcx, rcx ; bytes_read = 0
|
xor r9, r9 ; bytes_read = 0
|
||||||
|
|
||||||
.read_loop:
|
.read_loop:
|
||||||
mov rax, 0 ; syscall: read
|
mov rax, 0 ; syscall: read
|
||||||
mov rdi, 0 ; fd = stdin
|
mov rdi, 0 ; fd = stdin
|
||||||
lea rsi, [rbx + rcx] ; buf + offset
|
lea rsi, [rbx + r9] ; buf + offset
|
||||||
mov rdx, r14
|
mov rdx, r14
|
||||||
sub rdx, rcx ; remaining = max_len - bytes_read
|
sub rdx, r9 ; remaining = max_len - bytes_read
|
||||||
syscall
|
syscall
|
||||||
cmp rax, 0
|
cmp rax, 0
|
||||||
je .done_read
|
je .done_read
|
||||||
js .read_error
|
js .read_error
|
||||||
add rcx, rax
|
add r9, rax
|
||||||
cmp rcx, r14
|
|
||||||
jl .read_loop
|
jl .read_loop
|
||||||
|
|
||||||
.done_read:
|
.done_read:
|
||||||
; push len (rcx) then addr (rbx)
|
; push len (rcx) then addr (rbx)
|
||||||
|
cmp r9, r14
|
||||||
|
je .done_no_null
|
||||||
|
mov byte [rbx + r9], 0
|
||||||
|
.done_no_null:
|
||||||
sub r12, 16
|
sub r12, 16
|
||||||
mov [r12], rcx
|
mov [r12], r9
|
||||||
mov [r12 + 8], rbx
|
mov [r12 + 8], rbx
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
@@ -446,26 +446,29 @@ word_read_stdin:
|
|||||||
cmp rax, -4095
|
cmp rax, -4095
|
||||||
jae .fail_mmap
|
jae .fail_mmap
|
||||||
mov rbx, rax ; buffer addr
|
mov rbx, rax ; buffer addr
|
||||||
xor rcx, rcx ; bytes_read = 0
|
xor r9, r9 ; bytes_read = 0
|
||||||
|
|
||||||
.read_loop:
|
.read_loop:
|
||||||
mov rax, 0 ; syscall: read
|
mov rax, 0 ; syscall: read
|
||||||
mov rdi, 0 ; fd = stdin
|
mov rdi, 0 ; fd = stdin
|
||||||
lea rsi, [rbx + rcx] ; buf + offset
|
lea rsi, [rbx + r9] ; buf + offset
|
||||||
mov rdx, r14
|
mov rdx, r14
|
||||||
sub rdx, rcx ; remaining = max_len - bytes_read
|
sub rdx, r9 ; remaining = max_len - bytes_read
|
||||||
syscall
|
syscall
|
||||||
cmp rax, 0
|
cmp rax, 0
|
||||||
je .done_read
|
je .done_read
|
||||||
js .read_error
|
js .read_error
|
||||||
add rcx, rax
|
add r9, rax
|
||||||
cmp rcx, r14
|
|
||||||
jl .read_loop
|
jl .read_loop
|
||||||
|
|
||||||
.done_read:
|
.done_read:
|
||||||
; push len (rcx) then addr (rbx)
|
; push len (rcx) then addr (rbx)
|
||||||
|
cmp r9, r14
|
||||||
|
je .done_no_null
|
||||||
|
mov byte [rbx + r9], 0
|
||||||
|
.done_no_null:
|
||||||
sub r12, 16
|
sub r12, 16
|
||||||
mov [r12], rcx
|
mov [r12], r9
|
||||||
mov [r12 + 8], rbx
|
mov [r12 + 8], rbx
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
@@ -37,97 +37,11 @@ word_r_40:
|
|||||||
mov [r12], rax
|
mov [r12], rax
|
||||||
ret
|
ret
|
||||||
ret
|
ret
|
||||||
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
|
|
||||||
mov r8, 0
|
|
||||||
cmp rbx, 0
|
|
||||||
jge puts_abs
|
|
||||||
neg rbx
|
|
||||||
mov r8, 1
|
|
||||||
puts_abs:
|
|
||||||
lea rsi, [rel print_buf_end]
|
|
||||||
mov rcx, 0
|
|
||||||
mov r10, 10
|
|
||||||
cmp rbx, 0
|
|
||||||
jne puts_digits
|
|
||||||
dec rsi
|
|
||||||
mov byte [rsi], '0'
|
|
||||||
inc rcx
|
|
||||||
jmp puts_sign
|
|
||||||
puts_digits:
|
|
||||||
puts_loop:
|
|
||||||
xor rdx, rdx
|
|
||||||
mov rax, rbx
|
|
||||||
div r10
|
|
||||||
add dl, '0'
|
|
||||||
dec rsi
|
|
||||||
mov [rsi], dl
|
|
||||||
inc rcx
|
|
||||||
mov rbx, rax
|
|
||||||
test rbx, rbx
|
|
||||||
jne puts_loop
|
|
||||||
puts_sign:
|
|
||||||
cmp r8, 0
|
|
||||||
je puts_finish_digits
|
|
||||||
dec rsi
|
|
||||||
mov byte [rsi], '-'
|
|
||||||
inc rcx
|
|
||||||
puts_finish_digits:
|
|
||||||
mov byte [rsi + rcx], 10
|
|
||||||
inc rcx
|
|
||||||
mov rax, 1
|
|
||||||
mov rdi, 1
|
|
||||||
mov rdx, rcx
|
|
||||||
mov r9, rsi
|
|
||||||
mov rsi, r9
|
|
||||||
syscall
|
|
||||||
ret
|
|
||||||
word_dup:
|
word_dup:
|
||||||
mov rax, [r12]
|
mov rax, [r12]
|
||||||
sub r12, 8
|
sub r12, 8
|
||||||
mov [r12], rax
|
mov [r12], rax
|
||||||
ret
|
ret
|
||||||
word_write_buf:
|
|
||||||
mov rdx, [r12] ; len
|
|
||||||
mov rsi, [r12 + 8] ; addr
|
|
||||||
add r12, 16 ; pop len + addr
|
|
||||||
mov rax, 1 ; syscall: write
|
|
||||||
mov rdi, 1 ; fd = stdout
|
|
||||||
syscall
|
|
||||||
ret
|
|
||||||
ret
|
|
||||||
word_drop:
|
word_drop:
|
||||||
add r12, 8
|
add r12, 8
|
||||||
ret
|
ret
|
||||||
@@ -532,26 +446,29 @@ word_read_stdin:
|
|||||||
cmp rax, -4095
|
cmp rax, -4095
|
||||||
jae .fail_mmap
|
jae .fail_mmap
|
||||||
mov rbx, rax ; buffer addr
|
mov rbx, rax ; buffer addr
|
||||||
xor rcx, rcx ; bytes_read = 0
|
xor r9, r9 ; bytes_read = 0
|
||||||
|
|
||||||
.read_loop:
|
.read_loop:
|
||||||
mov rax, 0 ; syscall: read
|
mov rax, 0 ; syscall: read
|
||||||
mov rdi, 0 ; fd = stdin
|
mov rdi, 0 ; fd = stdin
|
||||||
lea rsi, [rbx + rcx] ; buf + offset
|
lea rsi, [rbx + r9] ; buf + offset
|
||||||
mov rdx, r14
|
mov rdx, r14
|
||||||
sub rdx, rcx ; remaining = max_len - bytes_read
|
sub rdx, r9 ; remaining = max_len - bytes_read
|
||||||
syscall
|
syscall
|
||||||
cmp rax, 0
|
cmp rax, 0
|
||||||
je .done_read
|
je .done_read
|
||||||
js .read_error
|
js .read_error
|
||||||
add rcx, rax
|
add r9, rax
|
||||||
cmp rcx, r14
|
|
||||||
jl .read_loop
|
jl .read_loop
|
||||||
|
|
||||||
.done_read:
|
.done_read:
|
||||||
; push len (rcx) then addr (rbx)
|
; push len (rcx) then addr (rbx)
|
||||||
|
cmp r9, r14
|
||||||
|
je .done_no_null
|
||||||
|
mov byte [rbx + r9], 0
|
||||||
|
.done_no_null:
|
||||||
sub r12, 16
|
sub r12, 16
|
||||||
mov [r12], rcx
|
mov [r12], r9
|
||||||
mov [r12 + 8], rbx
|
mov [r12 + 8], rbx
|
||||||
ret
|
ret
|
||||||
|
|
||||||
@@ -568,6 +485,91 @@ word_read_stdin:
|
|||||||
mov qword [r12 + 8], 0
|
mov qword [r12 + 8], 0
|
||||||
ret
|
ret
|
||||||
ret
|
ret
|
||||||
|
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
|
||||||
|
mov r8, 0
|
||||||
|
cmp rbx, 0
|
||||||
|
jge puts_abs
|
||||||
|
neg rbx
|
||||||
|
mov r8, 1
|
||||||
|
puts_abs:
|
||||||
|
lea rsi, [rel print_buf_end]
|
||||||
|
mov rcx, 0
|
||||||
|
mov r10, 10
|
||||||
|
cmp rbx, 0
|
||||||
|
jne puts_digits
|
||||||
|
dec rsi
|
||||||
|
mov byte [rsi], '0'
|
||||||
|
inc rcx
|
||||||
|
jmp puts_sign
|
||||||
|
puts_digits:
|
||||||
|
puts_loop:
|
||||||
|
xor rdx, rdx
|
||||||
|
mov rax, rbx
|
||||||
|
div r10
|
||||||
|
add dl, '0'
|
||||||
|
dec rsi
|
||||||
|
mov [rsi], dl
|
||||||
|
inc rcx
|
||||||
|
mov rbx, rax
|
||||||
|
test rbx, rbx
|
||||||
|
jne puts_loop
|
||||||
|
puts_sign:
|
||||||
|
cmp r8, 0
|
||||||
|
je puts_finish_digits
|
||||||
|
dec rsi
|
||||||
|
mov byte [rsi], '-'
|
||||||
|
inc rcx
|
||||||
|
puts_finish_digits:
|
||||||
|
mov byte [rsi + rcx], 10
|
||||||
|
inc rcx
|
||||||
|
mov rax, 1
|
||||||
|
mov rdi, 1
|
||||||
|
mov rdx, rcx
|
||||||
|
mov r9, rsi
|
||||||
|
mov rsi, r9
|
||||||
|
syscall
|
||||||
|
ret
|
||||||
|
word_write_buf:
|
||||||
|
mov rdx, [r12] ; len
|
||||||
|
mov rsi, [r12 + 8] ; addr
|
||||||
|
add r12, 16 ; pop len + addr
|
||||||
|
mov rax, 1 ; syscall: write
|
||||||
|
mov rdi, 1 ; fd = stdout
|
||||||
|
syscall
|
||||||
|
ret
|
||||||
|
ret
|
||||||
word_main:
|
word_main:
|
||||||
; push 1024
|
; push 1024
|
||||||
sub r12, 8
|
sub r12, 8
|
||||||
|
|||||||
Binary file not shown.
15
stdlib/io.sl
15
stdlib/io.sl
@@ -151,26 +151,29 @@
|
|||||||
cmp rax, -4095
|
cmp rax, -4095
|
||||||
jae .fail_mmap
|
jae .fail_mmap
|
||||||
mov rbx, rax ; buffer addr
|
mov rbx, rax ; buffer addr
|
||||||
xor rcx, rcx ; bytes_read = 0
|
xor r9, r9 ; bytes_read = 0
|
||||||
|
|
||||||
.read_loop:
|
.read_loop:
|
||||||
mov rax, 0 ; syscall: read
|
mov rax, 0 ; syscall: read
|
||||||
mov rdi, 0 ; fd = stdin
|
mov rdi, 0 ; fd = stdin
|
||||||
lea rsi, [rbx + rcx] ; buf + offset
|
lea rsi, [rbx + r9] ; buf + offset
|
||||||
mov rdx, r14
|
mov rdx, r14
|
||||||
sub rdx, rcx ; remaining = max_len - bytes_read
|
sub rdx, r9 ; remaining = max_len - bytes_read
|
||||||
syscall
|
syscall
|
||||||
cmp rax, 0
|
cmp rax, 0
|
||||||
je .done_read
|
je .done_read
|
||||||
js .read_error
|
js .read_error
|
||||||
add rcx, rax
|
add r9, rax
|
||||||
cmp rcx, r14
|
|
||||||
jl .read_loop
|
jl .read_loop
|
||||||
|
|
||||||
.done_read:
|
.done_read:
|
||||||
; push len (rcx) then addr (rbx)
|
; push len (rcx) then addr (rbx)
|
||||||
|
cmp r9, r14
|
||||||
|
je .done_no_null
|
||||||
|
mov byte [rbx + r9], 0
|
||||||
|
.done_no_null:
|
||||||
sub r12, 16
|
sub r12, 16
|
||||||
mov [r12], rcx
|
mov [r12], r9
|
||||||
mov [r12 + 8], rbx
|
mov [r12 + 8], rbx
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user