(オリジナルのUNIX V6のアセンブラはアセンブリ言語で書かれており、それをC言語に書きなおしたものの流れを追ってみる)
123(r0)
1文字1文字読み込み、識別していく
123|(|ro|)|
1区切りをトークンといい、切り分ける
これがreadopの役割
oplineとexpresで意味の解析をしていく。
oplineで命令を、expresで式を解析する。
opline mov r0, r1 expres 1 + 2 = 3
各トークンをreadopで解析する。
(r0
readopで文法チェック
saveopに読み込む文字を対比させる
if (savop) { ret = savop; savop = 0; return ret; }
readop()とcahrtab()の戻り値は別タイプ
as1は中間ファイルを3つ出力し、as2にわたし、as2がa.outを出力する
1 トークンに区切ったデータ 2 ローカルラベル 3 シンボルのリストテーブル
2バイトごとのデータが並べられている
putw(-1);
シンボルのテーブルは4バイト
シンボルは、種類と値が組になって格納されている
1 + 2 * 3
優先順位を見ていないので、順番に解析をしていく。 普通の算数なら7だが、この式を解析すると9になる。 7にしたいのなら、
1 + [ 2 * 3 ]
と各必要がある。()でくくらないのは、レジスタの(r0)と被るから。
論理和
|
a <<< 8 ||| b
a << | b
a.out
|t| |d| |b|
as1とas2は同じようなコード
as19c シンボルの種類
トークンのなかにシンボルという種類があって、シンボルのなかにも種類がある
参考
.text [SHT_PROGBITS, SHF_ALLOC+SHF_EXECINSTR] プログラムのうち、機械語の部分を格納するためのセクションです。プログラムローダは、実行可能なメモリ領域を確保した後、セクションのデータ(機械語, プログラムコード)を書き込みます。 .data [SHT_PROGBITS, SHF_ALLOC+SHF_WRITE] プログラムのうち、初期値を持つ変数を格納するためのセクションです。C言語では、「0以外の初期値を持つ大域変数」「0以外の初期値を持つ静的局所変数」がここに置かれます。データとして初期値を持ち、プログラムローダは書き込み可能なメモリを確保した後、初期値を書き込みます。 .bss [SHT_NOBITS, SHF_ALLOC+SHF_WRITE] プログラムのうち、初期値を持たない変数を格納するためのセクションです。C言語では、「初期値が指定されない大域変数」「初期値が0の大域変数」「初期値が指定されない静的局所変数」「初期値が0の静的局所変数」が格納されます。C言語の規約では、「この領域はすべて0で初期化されなければならない」と規定されているため、プログラムローダは書き込み可能なメモリを確保した後、すべて0で初期化します。