読者です 読者をやめる 読者になる 読者になる

レガシーコード生産ガイド

私に教えられることなら

NASM / Linux x86-64でjonesforthを移植してみる 4

forth asm

ようやく詰まってたところを突破して、ネイティブワードとDOCOLワードが動くようになった!

https://github.com/phaendal/jf64

DOCOLワードが動かなかった原因は

  • EXIT(return)の存在を忘れていた
  • call後にjmp先のDOCOLでraxレジスタを使うんだけど、それを忘れてraxレジスタを上書きしていた

の二つ。前者は動作を丁寧に考えれば気付きそう、というかシャワー浴びてて気づいたんだけど、後者は良く簡単に発見できたな、というカンジ。

でも前者に気づくのに3日ぐらいかかって、後者は発生してから20分ぐらいで解決できたので、難しさと印象が逆なのかもしれない。

    defword "cr", 2, 0, cr
    dq lit
    dq 10
    dq emit
    dq return
    
    defword "2cr", 3, 0, two_cr
    dq cr
    dq cr
    dq return

こう定義しておいて、以下のように実行することができる。

$ ./forth
60 4 + emit cr
@
2cr


bye
$

とりあえず「一生できないかも」とかちょっと思い始めてたので解決できて良かった。

ここで止める予定だったけど、勢いがでてきたので、もうちっとだけ続くんじゃ。

広告を非表示にする