Z80 アセンブラを作成する - ASM の字句解析と合成を使用した解析ツリーの構築?

StackOverflow https://stackoverflow.com/questions/1305091

質問

私はアセンブラーを書くという概念にはまったく慣れておらず、大量の資料を読んだ後でも、いくつかの概念を理解するのに苦労しています。

  1. 実際にソースファイルをトークンに分割するプロセスは何ですか?このプロセスは字句解析と呼ばれていると思います。意味のある実際のコード例を隅々まで探しましたが、これほど単純なコード例は非常に歓迎されます。

  2. 解析するときに、ツリーの上または下に情報を渡す必要があるでしょうか?私が尋ねる理由は次のとおりです。

    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する のです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top