diff --git a/build/call_syntax_parens.asm b/build/call_syntax_parens.asm index 08535fb..1c290da 100644 --- a/build/call_syntax_parens.asm +++ b/build/call_syntax_parens.asm @@ -446,26 +446,29 @@ word_read_stdin: cmp rax, -4095 jae .fail_mmap mov rbx, rax ; buffer addr - xor rcx, rcx ; bytes_read = 0 + xor r9, r9 ; bytes_read = 0 .read_loop: mov rax, 0 ; syscall: read mov rdi, 0 ; fd = stdin - lea rsi, [rbx + rcx] ; buf + offset + lea rsi, [rbx + r9] ; buf + offset mov rdx, r14 - sub rdx, rcx ; remaining = max_len - bytes_read + sub rdx, r9 ; remaining = max_len - bytes_read syscall cmp rax, 0 je .done_read js .read_error - add rcx, rax - cmp rcx, r14 + add r9, rax jl .read_loop .done_read: ; push len (rcx) then addr (rbx) + cmp r9, r14 + je .done_no_null + mov byte [rbx + r9], 0 +.done_no_null: sub r12, 16 - mov [r12], rcx + mov [r12], r9 mov [r12 + 8], rbx ret diff --git a/build/call_syntax_parens.o b/build/call_syntax_parens.o index 5f6143a..aed5fd1 100644 Binary files a/build/call_syntax_parens.o and b/build/call_syntax_parens.o differ diff --git a/build/loops_and_cmp.asm b/build/loops_and_cmp.asm index 0fa23ec..03068e5 100644 --- a/build/loops_and_cmp.asm +++ b/build/loops_and_cmp.asm @@ -446,26 +446,29 @@ word_read_stdin: cmp rax, -4095 jae .fail_mmap mov rbx, rax ; buffer addr - xor rcx, rcx ; bytes_read = 0 + xor r9, r9 ; bytes_read = 0 .read_loop: mov rax, 0 ; syscall: read mov rdi, 0 ; fd = stdin - lea rsi, [rbx + rcx] ; buf + offset + lea rsi, [rbx + r9] ; buf + offset mov rdx, r14 - sub rdx, rcx ; remaining = max_len - bytes_read + sub rdx, r9 ; remaining = max_len - bytes_read syscall cmp rax, 0 je .done_read js .read_error - add rcx, rax - cmp rcx, r14 + add r9, rax jl .read_loop .done_read: ; push len (rcx) then addr (rbx) + cmp r9, r14 + je .done_no_null + mov byte [rbx + r9], 0 +.done_no_null: sub r12, 16 - mov [r12], rcx + mov [r12], r9 mov [r12 + 8], rbx ret diff --git a/build/loops_and_cmp.o b/build/loops_and_cmp.o index 8ccf0a9..202d3d5 100644 Binary files a/build/loops_and_cmp.o and b/build/loops_and_cmp.o differ diff --git a/build/override_dup_compile_time.asm b/build/override_dup_compile_time.asm index 380f3a4..2b4141f 100644 --- a/build/override_dup_compile_time.asm +++ b/build/override_dup_compile_time.asm @@ -446,26 +446,29 @@ word_read_stdin: cmp rax, -4095 jae .fail_mmap mov rbx, rax ; buffer addr - xor rcx, rcx ; bytes_read = 0 + xor r9, r9 ; bytes_read = 0 .read_loop: mov rax, 0 ; syscall: read mov rdi, 0 ; fd = stdin - lea rsi, [rbx + rcx] ; buf + offset + lea rsi, [rbx + r9] ; buf + offset mov rdx, r14 - sub rdx, rcx ; remaining = max_len - bytes_read + sub rdx, r9 ; remaining = max_len - bytes_read syscall cmp rax, 0 je .done_read js .read_error - add rcx, rax - cmp rcx, r14 + add r9, rax jl .read_loop .done_read: ; push len (rcx) then addr (rbx) + cmp r9, r14 + je .done_no_null + mov byte [rbx + r9], 0 +.done_no_null: sub r12, 16 - mov [r12], rcx + mov [r12], r9 mov [r12 + 8], rbx ret diff --git a/build/override_dup_compile_time.o b/build/override_dup_compile_time.o index 9e335bb..d7df610 100644 Binary files a/build/override_dup_compile_time.o and b/build/override_dup_compile_time.o differ diff --git a/build/string_puts.asm b/build/string_puts.asm index c2882b4..87e60db 100644 --- a/build/string_puts.asm +++ b/build/string_puts.asm @@ -446,26 +446,29 @@ word_read_stdin: cmp rax, -4095 jae .fail_mmap mov rbx, rax ; buffer addr - xor rcx, rcx ; bytes_read = 0 + xor r9, r9 ; bytes_read = 0 .read_loop: mov rax, 0 ; syscall: read mov rdi, 0 ; fd = stdin - lea rsi, [rbx + rcx] ; buf + offset + lea rsi, [rbx + r9] ; buf + offset mov rdx, r14 - sub rdx, rcx ; remaining = max_len - bytes_read + sub rdx, r9 ; remaining = max_len - bytes_read syscall cmp rax, 0 je .done_read js .read_error - add rcx, rax - cmp rcx, r14 + add r9, rax jl .read_loop .done_read: ; push len (rcx) then addr (rbx) + cmp r9, r14 + je .done_no_null + mov byte [rbx + r9], 0 +.done_no_null: sub r12, 16 - mov [r12], rcx + mov [r12], r9 mov [r12 + 8], rbx ret diff --git a/build/string_puts.o b/build/string_puts.o index 9035e65..febf51b 100644 Binary files a/build/string_puts.o and b/build/string_puts.o differ diff --git a/build/test_read_stdin.asm b/build/test_read_stdin.asm index 52d8069..5dce101 100644 --- a/build/test_read_stdin.asm +++ b/build/test_read_stdin.asm @@ -37,97 +37,11 @@ word_r_40: mov [r12], rax 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: mov rax, [r12] sub r12, 8 mov [r12], rax 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: add r12, 8 ret @@ -532,26 +446,29 @@ word_read_stdin: cmp rax, -4095 jae .fail_mmap mov rbx, rax ; buffer addr - xor rcx, rcx ; bytes_read = 0 + xor r9, r9 ; bytes_read = 0 .read_loop: mov rax, 0 ; syscall: read mov rdi, 0 ; fd = stdin - lea rsi, [rbx + rcx] ; buf + offset + lea rsi, [rbx + r9] ; buf + offset mov rdx, r14 - sub rdx, rcx ; remaining = max_len - bytes_read + sub rdx, r9 ; remaining = max_len - bytes_read syscall cmp rax, 0 je .done_read js .read_error - add rcx, rax - cmp rcx, r14 + add r9, rax jl .read_loop .done_read: ; push len (rcx) then addr (rbx) + cmp r9, r14 + je .done_no_null + mov byte [rbx + r9], 0 +.done_no_null: sub r12, 16 - mov [r12], rcx + mov [r12], r9 mov [r12 + 8], rbx ret @@ -568,6 +485,91 @@ word_read_stdin: mov qword [r12 + 8], 0 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: ; push 1024 sub r12, 8 diff --git a/build/test_read_stdin.o b/build/test_read_stdin.o index 05acd01..27caafd 100644 Binary files a/build/test_read_stdin.o and b/build/test_read_stdin.o differ diff --git a/readstdin b/readstdin index 6541ca6..5f6fb07 100755 Binary files a/readstdin and b/readstdin differ diff --git a/stdlib/io.sl b/stdlib/io.sl index a480b15..8ebdc89 100644 --- a/stdlib/io.sl +++ b/stdlib/io.sl @@ -151,26 +151,29 @@ cmp rax, -4095 jae .fail_mmap mov rbx, rax ; buffer addr - xor rcx, rcx ; bytes_read = 0 + xor r9, r9 ; bytes_read = 0 .read_loop: mov rax, 0 ; syscall: read mov rdi, 0 ; fd = stdin - lea rsi, [rbx + rcx] ; buf + offset + lea rsi, [rbx + r9] ; buf + offset mov rdx, r14 - sub rdx, rcx ; remaining = max_len - bytes_read + sub rdx, r9 ; remaining = max_len - bytes_read syscall cmp rax, 0 je .done_read js .read_error - add rcx, rax - cmp rcx, r14 + add r9, rax jl .read_loop .done_read: ; push len (rcx) then addr (rbx) + cmp r9, r14 + je .done_no_null + mov byte [rbx + r9], 0 +.done_no_null: sub r12, 16 - mov [r12], rcx + mov [r12], r9 mov [r12 + 8], rbx ret