Implement "next" macro and add related notes
[rrq/jonasforth.git] / main.asm
index acb119a986410f4183b4e999382d6335f36fa9a4..537796de252a2c12db2f3597825afb3a1614f4ea 100644 (file)
--- a/main.asm
+++ b/main.asm
@@ -1,25 +1,20 @@
 format ELF64 executable
 
-struc with_length string& {
-    . db string
-    .length = $ - .
-}
-
-macro write_stdout string_label {
-    mov rax, 1
-    mov rdi, 1
-    mov rsi, string_label
-    mov rdx, string_label#.length
-    syscall
+;; The code in this macro is placed at the end of each Forth word. When we are
+;; executing a definition, this code is what causes execution to resume at the
+;; next word in that definition.
+macro next {
+    ;; RSI points to the address of the definition of the next word to execute.
+    lodsq                   ; Load value at RSI into RAX and increment RSI
+    ;; Now RAX contains the location of the next word to execute. The first 8
+    ;; bytes of this word is the address of the codeword, which is what we want
+    ;; to execute.
+    jmp qword [rax]         ; Jump to the codeword of the current word
 }
 
 segment readable executable
 
 start:
-    write_stdout message
-
     jmp $
 
 segment readable
-
-message with_length 'Hello, world!',$A