第十二回: コード生成
2012 年 7 月 6 日
http://www.sw.it.aoyama.ac.jp/2012/Compiler/lecture12.html
© 2005-12 Martin J. Dürst 青山学院大学
(assembly language)
;
後)命令 | 被演算子 | 説明 (コメント) |
LOAD | R1, a | メモリの変数 a の値をレジスタ R1 に代入 |
STORE | a, R1 | レジスタ R1 の値をメモリの変数 a に代入 |
CONST | R1, 5 | レジスタ R1 に 5 の定数を代入 |
JUMP | label | 無条件に label へジャンプ |
JUMP< | R1, label | レジスタ R1 が 0 より小さい時 label へジャンプ (JUMP>=, JUMP!= などは同様) |
ADD | R1, R2, R3 | R2 と R3 を足して R1 に代入。同じレジスタを何回使ってもよい。同様に SUB、MUL、DIV がある。 |
入力のプログラムの一部:
sum += price * 25;
出力:
LOAD R1, price ; R1 (レジスタ1) に price というアドレスからロード CONST R2, 25 ; R2 (レジスタ2) に 25 の定数をロード MUL R1, R1, R2 ; R1 に R1 と R2 の掛け算の結果を入れる LOAD R2, sum ; R2 に sum というアドレスからロード ADD R2, R1, R2 ; R2 に R1 と R2 の合計を入れる STORE sum, R2 ; sum というアドレスに R2 を入れる
if
文などのコード生成if
文のコード生成の例元の文: if (a>10) b = 15;
生成されるコード:
LOAD R1, a CONST R2, 10 SUB R3, R1, R2 ; R3 = a-10 JUMP<= R3, endif ; jump over if part if a-10<=0 CONST R4, 15 STORE b, R4 endif:
while
文、for
文はなしgoto
は使えるif
文の後は goto
のみif
文の条件は 0 との比較のみ元の文:
if (a>10) b = 15;
条件を 0 との比較にする:
if (a-10>0) b = 15;
ラベルの追加:
if (a-10>0) b = 15; endif:
条件の反転と goto
の導入:
if (a-10<=0) goto endif; b = 15; endif:
if
・else
文のコード生成C のプログラム
if (a > b) c = a; else c = b;
参考: C のプログラムの変形
if (a-b <= 0) goto else; c = a; goto end; else: c= b; end:
アッセンブリのプログラム
LOAD R1, a LOAD R2, b SUB R1, R1, R2 ; a-b > 0 JUMP<= R1, else LOAD R1, a STORE c, R1 JUMP end else: LOAD R1, b STORE c, R1 end:
if (a>10 || b < 3) c = 5;
コードの変更:
if (a>10) c = 5; else if (b < 3) c = 5;
LOAD R1, a CONST R2, 10 SUB R1, R1, R2 ; a-10 > 0 JUMP<= R1, else CONST R1, 5 STORE c, R1 JUMP end else: LOAD R1, b CONST R2, 3 SUB R1, R1, R2 ; b-3 < 0 JUMP>= R1, end CONST R1, 5 STORE c, R1 end:
関数呼び出しスタックの内容 (関数フレーム):
(提出不要)
for
文や while
文のコード生成を考えて、例を作って提案する
お願い: 自由記述に必ず良かった点、問題点を具体的に書くこと
(悪い例: 発音が分かりにくい; 良い例: さ行が濁っているかどうか分かりにくい)