====== Direct Threaded Code ======
Gegeben sei eine Forth Wort Definition:
: name word1 word2 word3 ;
Bei Direct Threaded Code ergibt sich daraus der folgende Aufbau der Liste:
|header with name|JMP NEST|Zeiger auf word1|Zeiger auf word2|Zeiger auf word3|Zeiger auf EXIT|
Der Inner Interpreter für Direct Threaded Code sieht dann so aus (pseudo-code):
Next W <- (IP)
IP++
JMP (W)
oder kürzer:
Next JMP (IP)++
----
Dazu gab es einen englischen Komentar:
On Intel x86 or 6502/65816, the JMP NEST instruction *may* be substituted with a CALL NEST instead. This places the address of "ptr to word1" on the CPU's hardware stack, where it is easily processed by NEST.
The body of the definition consists of pointers to the parameter fields of each word, where CPU-executable code is always found in some capacity or another.
The inner interpreter for DirectThreadedCode looks like this (pseudo-code):
NEST: ; For JMP-based systems
-(RSP) <- IP
IP <- W + sizeof(JMP)
JMP Next
NEST: ; For CALL-based systems
-(RSP) <- IP
POP IP
JMP Next
EXIT: ; For both types
IP <- (RSP)+
JMP Next
Next:
W <- (IP)
IP++
JMP (W)
For architectures that support automatic post-increment on a memory access, it can be significantly simplified at the expense of maintaining the W pseudo-register:
JMP (IP)++