X-Git-Url: https://git.rrq.au/?a=blobdiff_plain;ds=sidebyside;f=impl.asm;h=070ad2a70561899ab567d4ec92796e68a588dc9a;hb=bb3723bbe99455e7b95d5376758047563bd72eed;hp=9ad22789eb587a03da91ae3773427543006a6253;hpb=24d3a4952e2e2b6db7a64eb2a8caffd2976a02ee;p=rrq%2Fjonasforth.git diff --git a/impl.asm b/impl.asm index 9ad2278..070ad2a 100644 --- a/impl.asm +++ b/impl.asm @@ -1,3 +1,5 @@ +;; vim: syntax=fasm + segment readable executable macro printlen msg, len { @@ -127,6 +129,57 @@ 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: + + ret + ;; Parses a string. ;; ;; Parameters: