2009/09/07

Forth の direct threaded code

こんなぐあいに r15 に _doLIST のアドレスをいれておいて call してる。これだと無駄にレジスタ使っちゃうのが問題(Forth の実装でそんなにレジスタ使ったりしないけどね)。call _doLIST としたいところなんだけど、そのやり方が分からない。

        ;; nop x 5 call r15
DOCOL_CODE EQU 0xd7ff419090909090

%macro NEXT 0
lodsq
jmp rax
%endmacro

defcode "EXIT", 0, exit
POPRSP rsi
NEXT

defword ":", 0, colon
dq _WORD
dq header
;; あらかじめ mov r15, _doLIST してある。
dq lit
dq DOCOL_CODE
dq comma
dq latest, fetch, hidden
dq rbrac
dq exit

_doLIST:
PUSHRSP rsi
pop rsi
NEXT

_start:
mov r15, _doLIST

0 件のコメント: