X-Git-Url: https://git.rrq.au/?a=blobdiff_plain;ds=sidebyside;f=impl.asm;h=f6a25cf5b54d420cc016582e6f3d41e0661636a2;hb=f03d2aab1cbcb33f88a7533e539cd58486f49f26;hp=a9b8564e19faeb9c6bdf3ed7b8906f1dccf7d533;hpb=4061939a8f1a4afd749434ed70a6122016c0a8dc;p=rrq%2Fjonasforth.git diff --git a/impl.asm b/impl.asm index a9b8564..f6a25cf 100644 --- a/impl.asm +++ b/impl.asm @@ -129,6 +129,60 @@ read_word: ret +;; Read a word from a buffer. Returns the buffer without the word, as well as +;; the word that was read (including lengths). +;; +;; Inputs: +;; * rsi = Input buffer +;; * rcx = Length of buffer +;; +;; Outputs: +;; * rsi = Updated buffer +;; * rcx = Length of updated buffer +;; * rdi = Word buffer +;; * rdx = Length of word buffer +pop_word: +.skip_whitespace: + mov al, [rsi] + cmp al, ' ' + je .got_whitespace + cmp al, $A + je .got_whitespace + jmp .alpha +.got_whitespace: + ;; The buffer starts with whitespace; discard the first character from the buffer. + inc rsi + dec rcx + jmp .skip_whitespace + +.alpha: + ;; We got a character that wasn't whitespace. Now read the actual word. + mov rdi, rsi ; This is where the word starts + mov rdx, 1 ; Length of word + +.read_alpha: + ;; Extract character from original buffer: + inc rsi + dec rcx + + ;; When we hit whitespace, we are done with this word + mov al, [rsi] + cmp al, ' ' + je .end + cmp al, $A + je .end + + ;; It wasn't whitespace; add it to word buffer + inc rdx + jmp .read_alpha + +.end: + ;; Finally, we want to skip one whitespace character after the word. + inc rsi + dec rcx + + ret + ;; Parses a string. ;; ;; Parameters: