10

私はアセンブラーを作成するという概念に非常に慣れていません。大量の資料を読んだ後でも、いくつかの概念に頭を悩ませることはまだ困難です。

  1. ソースファイルを実際にトークンに分割するプロセスは何ですか?このプロセスは字句解析と呼ばれ、意味のある実際のコード例を上下に検索しましたが、それほど単純なコード例は大歓迎です;)

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

    LD BC、nn

トークン化されたら、次の解析ツリーに変換する必要があります(???)

  ___ LD ___
  |        |
 BC        nn

ここで、このツリーをトラバースするときに、次のマシンコードを生成する必要があります。

01 n n

指示があった場合:

LD DE,nn

次に、出力は次のようになります。

11 n n

それが問題を提起することを意味しますが、LDノードはオペランドに基づいて異なるものを返しますか、それとも何かを返すのはオペランドですか?そして、これはどのように達成されますか?時間が許せば、より単純なコード例が優れています。

高度な既存のツールを見るよりも、ここで生のプロセスのいくつかを学ぶことに最も興味があるので、YaccまたはFlexに送る前にそのことを覚えておいてください。

4

3 に答える 3

10

さて、レジスタと、オフセット ディスプレースメントとインデックス レジスタを含むメモリ アドレッシング モードで動作する命令に本当に必要なツリーの構造は、次のようになります。

    INSTRUCTION-----+
    |      |        |
  OPCODE  REG     OPERAND
                  |     |
                OFFSET  INDEXREG

はい、ツリーの上下に値を渡したいと思います。このような値の受け渡しを正式に指定する方法は「属性文法」と呼ばれ、値の受け渡しとそれらの値の計算を使用して、言語 (この場合はアセンブラー構文) の文法を装飾します。背景の詳細​​については、Wikipedia on attribute grammarsを参照してください。

あなたが尋ねた関連する質問で、式の文法と構築ツリーを処理するツールDMSについて説明しました。言語操作ツールとして、DMS はこれらとまったく同じ、ツリー情報フローの上下の問題に直面しています。ハイエンドの言語操作ツールとして、属性文法の計算を直接処理できることに驚かないでください。

于 2009-08-23T20:27:27.003 に答える
7

解析ツリーを構築する必要はありません。Z80オペコードは非常に単純です。これらは、コンマで区切られたオペコードと0、1、または2のオペランドで構成されます。非常に単純なパーサーを使用して、オペコードを(最大3つの)コンポーネントに分割する必要があります。ツリーは必要ありません。

于 2009-08-20T09:54:31.200 に答える
3

実際には、オペコードにはバイトベースではなく、8 進ベースがあります。私が知っている最良の説明はDECODING Z80 OPCODESです。

于 2009-10-26T00:49:31.400 に答える