by shigemk2

当面は技術的なことしか書かない

2014/5/6 #ikebin メモ

(オリジナルのUNIX V6のアセンブラはアセンブリ言語で書かれており、それをC言語に書きなおしたものの流れを追ってみる)

v6ac コード解析メモ

123(r0)

1文字1文字読み込み、識別していく

123|(|ro|)|

1区切りをトークンといい、切り分ける

これがreadopの役割

oplineとexpresで意味の解析をしていく。

oplineで命令を、expresで式を解析する。

opline mov r0, r1 expres 1 + 2 = 3

各トークンをreadopで解析する。

(r0

readopで文法チェック

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とか

.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で初期化します。