2009-08-20 27 views
8

私はアセンブラを書くというコンセプトに非常に慣れていて、大量の資料を読んだ後でも、私はまだいくつかのコンセプトの周りに頭を抱えています。Z80アセンブラを書く - ASMをレキシングし、コンポジションを使用して構文解析ツリーを構築しますか?

  1. 実際にソースファイルをトークンに分割するプロセスとは何ですか?私はこのプロセスをレキシングと呼んでおり、実際のコード例を上から下に検索していますが、単純なコード例を非常に歓迎しています。)

  2. 構文解析すると、情報はツリーの上または下を通過する必要がありますか?私は次のように、取るされて尋ねる理由:

それは一度トークン化、次の構文解析木に有効にする必要があり

NN

LD BCを、(???)今

___ LD ___ 
    |  | 
BC  nn 

このツリーが横断されると、次のマシンコードが生成される必要があります。

01 n n 

指示があった場合:

LD DE,nn 

その後、出力は次のようにする必要があります:それは、問題を提起オペランドに基づいて、異なるLDのノード戻り何かをするか、それが何かを返すオペランドであることを意味

11 n n 

?そしてこれはどのように達成されましたか?時間が許せば、もっと簡単なコード例が優れています。

先進の既存のツールではなく、生のプロセスの一部を学ぶことに最も興味がありますので、YaccまたはFlexに送信する前に覚えておいてください。

答えて

8

さて、あなたは本当に 次のようになり を登録するレジスタとオフセット変位をinvolingメモリ アドレッシングモードとインデックスに動作の指示をしたいツリーの構造:

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

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

、Iは式文法及び建物ツリーを処理 ツール、DMS、 を議論しました。 言語操作ツールのように、DMSはまったく同じ上下に直面します。 ツリー情報フローの問題が発生します。それは あなたを驚かせるべきではなく、高級言語操作ツールとして、 属性文法計算を直接処理することができます。

+1

これは特定のZ80の説明とマッチさせるのではなく、ビルドする必要があるツリーを説明することを意図していました。 私は80年代に多くのZ80アセンブラをコーディングしました。私はあなたが思うよりもそれについてもっと知っているかもしれません。 –

+0

あなたの知識を実証してください。 Z80アセンブラを作成しましたか?私はしませんでしたが、私は8080と6809のアセンブラを書いています。あなたのアドバイスは私には間違っているようです。 –

+0

あなたの経験はおそらく私のものとは異なるでしょう。私はCollins 8311(1968年頃)のためのアセンブラをコーディングしました。商用化されていない12,16ビットマシンで、マイクロコードアセンブラと他のメッセージで見た6809アセンブラについて聞いたことがありません。私はまた、さまざまなコンパイラのフロントエンド(私のバイオ情報とウェブサイトをチェックアウト)を構築しました。私の初期のアセンブラーは特別な手段で作られ、働きました。レクサーとパーサを使って構築した80年代以降、指定するのがはるかに簡単で、維持するために、拡張するために名前を付けました。 –

5

構文解析ツリーを構築する必要はありません。 Z80オペレーションコードは非常に簡単です。それらはオペコードと0,1または2のオペランドで構成され、カンマで区切られています。非常に単純なパーサーで、オペコードを(最大3つの)コンポーネントに分割するだけで済みます。ツリーは必要ありません。

+0

相対メモリのアドレスはどうですか>これにはある種の記号ツリーが必要ですか?おそらくテーブルでさえ – Darknight

+0

質問者はOPコードの解析について質問していました。アセンブラの実際のマシンコード出力を作成するためには、シンボルテーブルが必要ですが、それはまったく別の問題です。 –

+0

@Darknight: パーズツリーを作成するための有効なポイントはまだありませんか。たとえば、構文にバリエーションがあるいくつかのASMコード文字列があります: ラベル、コメント、かっこ、グローバル変数、.DB、.DS、.DW パースツリーを使用した場合はより単純化されますか? @Neil: 詳細を教えてください。 よろしくお願いいたします。 GP –

3

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

+0

Octalは直接変換することができ、再帰呼び出しはオフセットレジスタを処理できます。構文木をまったく構築する必要はありません。各命令は直接マッピングされます。 – EvilTeach

関連する問題