私は 3 つまたは 4 つの単純なアセンブラを作成しました。パーサー ジェネレーターを使用せずに、6502 で最もよく知っているSC アセンブラーをモデル化しました。
これを行うために、単純な構文を使用しました。行は次のいずれかです。
nothing
[label] [instruction] [comment]
[label] [directive] [comment]
ラベルは、1 文字の後に任意の数の文字または数字が続くものでした。
命令は <空白><ニーモニック> [オペランド] でした
ディレクティブは <空白>.XX [オペランド] でした
コメントは行末まで * でした。
オペランドは、命令とディレクティブに依存していました。
定数を定義するためのディレクティブが含まれています。
.OR コードの起点アドレスを設定
.HS バイトの 16 進文字列
.AS ascii バイト文字列 - 空白を除く任意の区切り文字 - 始まりと終わり
出力用の .TF ターゲット ファイル
.BS n n バイトの予約ブロック ストレージ
私がそれを書いたとき、私は各コンポーネントの簡単なパーサーを書きました。ラベルに遭遇するたびに、それをターゲットアドレスのテーブルに入れました。知らないラベルに遭遇したときはいつでも、その命令を不完全としてマークし、修正が必要な命令への参照とともに不明なラベルを付けました。
すべてのソース行が通過した後、「修正する」テーブルに目を通し、シンボル テーブルでエントリを見つけようとしました。見つかった場合は、指示にパッチを当てました。そうでない場合は、エラーでした。
命令名とオペランドのすべての有効なアドレッシング モードのテーブルを保持しました。命令を受け取ったとき、何かが機能するまで、各アドレッシング モードを順番に解析しようとしました。
この構造を考えると、すべてを実行するには 1 日から 2 日かかるはずです。