Z80 アセンブラを作成する - ASM の字句解析と合成を使用した解析ツリーの構築?
-
19-09-2019 - |
質問
私はアセンブラーを書くという概念にはまったく慣れておらず、大量の資料を読んだ後でも、いくつかの概念を理解するのに苦労しています。
実際にソースファイルをトークンに分割するプロセスは何ですか?このプロセスは字句解析と呼ばれていると思います。意味のある実際のコード例を隅々まで探しましたが、これほど単純なコード例は非常に歓迎されます。
解析するときに、ツリーの上または下に情報を渡す必要があるでしょうか?私が尋ねる理由は次のとおりです。
LD BC、nn
トークン化したら次の解析木に変える必要があります(???)
___ LD ___
| |
BC nn
ここで、このツリーを走査するときは、次のマシンコードを生成する必要があります。
01 n n
指示が次のようなものであったとします。
LD DE,nn
その場合、出力は次のようになります。
11 n n
つまり、LD ノードはオペランドに基づいて異なるものを返すのか、それともオペランドが何かを返すのかという疑問が生じます。そして、これはどのようにして達成されるのでしょうか?時間が許せば、より単純なコード例が優れていると思います。
私は高度な既存のツールを見るよりも、ここで生のプロセスのいくつかを学ぶことに最も興味があるので、私を送信する前にそのことを念頭に置いてください。 ヤック または フレックス.
解決
さて、あなたは本当にためにしたいツリーの構造 レジスタとメモリ上で動作し、命令 オフセット変位とインデックスレジスタをinvolingアドレッシングモード 次のようになります:
INSTRUCTION-----+
| | |
OPCODE REG OPERAND
| |
OFFSET INDEXREG
そして、はい、あなたは木を上下に値を渡したいたいです。 正式な値の受け渡しを指定するためのメソッドが呼び出されます 「属性文法」、そしてあなたのための文法を飾ります 値渡しでのlangauge(あなたのケースでは、あなたのアセンブラ構文) そしてそれらの値を超える計算。より多くの背景については、 属性はの文法上のWikipedia noreferrer"> 関連する質問では、、私は議論 ツール、 DMS に、 その表現の文法や建物の木を処理します。なので 言語操作ツールは、DMSは、まさにこれらの同じ上下に直面しています ツリー情報は、問題を流れています。それは、あなたを驚かべきではありません ハイエンド言語操作ツールとして、それは扱うことができます 直接文法計算を属性ます。
他のヒント
解析ツリーを構築する必要はありません。 Z80のオペコードは非常に単純です。彼らは、カンマで区切られたオペコードと0、1又は2オペランドからなります。あなただけの非常にシンプルなパーサとコンポーネント(最大3)にオペコードを分割する必要がある - 何の木は必要ありません。
。実際には、オペコードはないバイトのベースが、オクタルベースを持っています。私が知っている最良の説明は、の DECODING Z80 OPCODESする のです。