X-Git-Url: https://git.rrq.au/?a=blobdiff_plain;f=main.asm;h=537796de252a2c12db2f3597825afb3a1614f4ea;hb=1da54a4e8c55400181194a2db2cce4b96e479d61;hp=acb119a986410f4183b4e999382d6335f36fa9a4;hpb=69a2f0a24cc7698bc49648d7419c3292140fc869;p=rrq%2Fjonasforth.git diff --git a/main.asm b/main.asm index acb119a..537796d 100644 --- 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