diff options
author | Lizzy Fleckenstein <eliasfleckenstein@web.de> | 2023-08-21 19:24:26 +0200 |
---|---|---|
committer | Lizzy Fleckenstein <eliasfleckenstein@web.de> | 2023-08-21 19:24:26 +0200 |
commit | 8648ef9dd658b4e0a71d0e188260eff071fae881 (patch) | |
tree | 349392241f562990a761a29e874bb6e381523d03 /paradox.false | |
parent | ecd10c643962ac1122fa016e30aee8b7796f8c45 (diff) | |
download | paradox-8648ef9dd658b4e0a71d0e188260eff071fae881.tar.xz |
I/O buffering
Diffstat (limited to 'paradox.false')
-rw-r--r-- | paradox.false | 128 |
1 files changed, 98 insertions, 30 deletions
diff --git a/paradox.false b/paradox.false index a2206e1..52cf9fe 100644 --- a/paradox.false +++ b/paradox.false @@ -138,11 +138,9 @@ $ 1+ s: { increment str_counter } { emit print string } - "mov rax, 1" 10, - "mov rdi, 1" 10, "mov rsi, str_" 0 ø . 10, - "mov rdx, " 1 ø . 10, - "syscall" 10, + "mov rcx, " 1 ø . 10, + "call write" 10, 1_ c: { consume current_char } ]? @@ -390,29 +388,18 @@ mov [r12], rax { elseif c = , } c;',= $[%~1_\]?[ -"mov rax, 1 -mov rdi, 1 -mov rsi, r12 -mov rdx, 1 -syscall +"mov rsi, r12 +mov rcx, 1 +call write add r12, 8 " 1_ c:]? { elseif c = ^ } c;'^= $[%~1_\]?[ -"sub r12, 8 -mov qword[r12], 0 -mov rax, 0 -mov rdi, 0 -mov rsi, r12 -mov rdx, 1 -syscall -mov ebx, [r12] -mov ecx, -1 -cmp rax, 0 -cmove ebx, ecx -mov [r12], ebx +"call read +sub r12, 8 +mov [r12], eax " 1_ c:]? @@ -423,7 +410,10 @@ mov [r12], ebx 1_ c:]? { elseif c = B } - c;'B= $[%~1_\]?[1_ c:]? + c;'B= $[%~1_\]?[ +"call flush +" + 1_ c:]? { else error } ~["unknown character: "c;,]e;! @@ -480,6 +470,85 @@ x;! { call compile_fn } { if state != ERROR } q;2=~[ +{ buffered I/O } +8192 +"section .data +readbuf_len: dq 0 +readbuf_cursor: dq 0 +writebuf_len: dq 0 +section .bss +readbuf: resb "$." +writebuf: resb "$." +section .text +read: +mov rax, [readbuf_cursor] +mov rbx, [readbuf_len] +cmp rax, rbx +jb .has +cmp rbx, "$." +jb .fill +xor rbx, rbx +mov [readbuf_len], rbx +mov [readbuf_cursor], rbx +.fill: +mov rax, 0 +mov rdi, 0 +lea rsi, [rbx+readbuf] +mov rdx, "$." +sub rdx, rbx +syscall +add [readbuf_len], rax +cmp rax, 0 +jne .has +mov eax, -1 +ret +.has: +mov rax, [readbuf_cursor] +movzx eax, byte[readbuf+rax] +inc qword[readbuf_cursor] +ret +write: +mov rdi, [writebuf_len] +mov rax, "$." +sub rax, rdi +add rdi, writebuf +mov rdx, rcx +sub rdx, rax +jna .simple +mov rcx, rax +rep movsb +push rsi +push rdx +mov qword[writebuf_len], "$." +call flush +pop rdx +pop rsi +cmp rdx, "$." +ja .direct +mov rcx, rdx +mov rdi, writebuf +.simple: +add [writebuf_len], rcx +rep movsb +ret +.direct: +mov rax, 1 +mov rdi, 1 +syscall +ret +flush: +mov rdx, [writebuf_len] +cmp rdx, 0 +je .return +mov rax, 1 +mov rdi, 1 +mov rsi, writebuf +syscall +mov qword[writebuf_len], 0 +.return: +ret +"% + { builtin functions } "conditional: add r12, 16 @@ -530,29 +599,28 @@ jle .print dec rcx mov byte[rcx], '-' .print: -mov rax, 1 -mov rdi, 1 mov rsi, rcx -lea rdx, [rsp+16] -sub rdx, rcx -syscall +lea rcx, [rsp+16] +sub rcx, rsi +call write add rsp, 16 ret " -{ emit setup and stack } +{ emit _start and stack } 1000000 "global _start _start: lea r12, [stack+8*"$."] call fun_0 +call flush mov rax, 60 mov rdi, 0 syscall section .bss -stack: resq "." -" +stack: resq "$." +"% { emit variables } |