X-Git-Url: https://git.rrq.au/?a=blobdiff_plain;f=impl.asm;h=f6a25cf5b54d420cc016582e6f3d41e0661636a2;hb=7677dbbdce584a64e63946b39879f5edd114f36a;hp=c713036c82afb2743c45a547e4b315ac4bf41ba4;hpb=fbd07fa0c1aaad0cca46f9b1fc4839e053454f03;p=rrq%2Fjonasforth.git diff --git a/impl.asm b/impl.asm index c713036..f6a25cf 100644 --- a/impl.asm +++ b/impl.asm @@ -142,11 +142,44 @@ read_word: ;; * rdi = Word buffer ;; * rdx = Length of word buffer pop_word: - mov rdi, rsi - mov rdx, 10 +.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 - add rsi, 10 - sub rcx, 10 + ;; 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