X-Git-Url: https://git.rrq.au/?a=blobdiff_plain;f=impl.asm;h=dd7fc9dcbc4b70a896d523bde9c89b8cc95baec2;hb=d8a61fe84d4b71c21c4ce18a9b7bc78000db725a;hp=659d98ed7258b90b82e7a74061b6364948c15a8a;hpb=1878070fedd3dec11082913df12a57f97b69cb12;p=rrq%2Fjonasforth.git diff --git a/impl.asm b/impl.asm index 659d98e..dd7fc9d 100644 --- a/impl.asm +++ b/impl.asm @@ -1,6 +1,6 @@ ;; vim: syntax=fasm -segment readable executable +section '.text' code readable executable macro printlen msg, len { push rsi @@ -8,7 +8,7 @@ macro printlen msg, len { mov rcx, msg mov rdx, len - sys_print_string + call os_print_string sub rsp, 8 pop rsi @@ -69,52 +69,6 @@ find: .found: ret -;; Read a word from standard input. Returns pointer to string containing word as -;; well as length. -;; -;; Results: -;; * rdx = Length of string -;; * rdi = Pointer to string buffer -;; -;; Clobbers pretty much everything. -read_word: -.skip_whitespace: - ;; Read characters into .char_buffer until one of them is not whitespace. - mov rsi, .char_buffer - sys_read_char - - ;; We consider newlines and spaces to be whitespace. - cmp [.char_buffer], ' ' - je .skip_whitespace - cmp [.char_buffer], $A - je .skip_whitespace - -.alpha: - ;; We got a character that wasn't whitespace. Now read the actual word. - mov [.length], 0 - -.read_alpha: - mov al, [.char_buffer] - movzx rbx, [.length] - mov rsi, .buffer - add rsi, rbx - mov [rsi], al - inc [.length] - - mov rsi, .char_buffer - sys_read_char - - cmp [.char_buffer], ' ' - je .end - cmp [.char_buffer], $A - jne .read_alpha - -.end: - mov rdi, .buffer - movzx rdx, [.length] - - ret - ;; Read a word from a buffer. Returns the buffer without the word, as well as ;; the word that was read (including lengths). ;; @@ -229,18 +183,14 @@ parse_number: pop rdi printlen rdi, [.length] newline - sys_terminate 100 + mov rax, 100 + call os_terminate -segment readable writable +section '.data' readable writable find.search_length dq ? find.search_buffer dq ? -read_word.max_size = $FF -read_word.buffer rb read_word.max_size -read_word.length db ? -read_word.char_buffer db ? - parse_number.length dq ? parse_number.error_msg string "Invalid number: "