Next: 8.1 コード表示
Up: ソフトウェア特論 講義資料 Scheme コンパイラ処理系
Previous: 7 関数呼び出し部のコンパイル
コンパイルしたコードは,ラベルが入ったコードになっていますが,
このラベルを実際のアドレス値へ変換する処理を行います.
アセンブラは2パスで処理します.まず,生成されたコードのリストの中
のラベルとそのラベルのおかれているアドレスを調べます.
次に,そのラベルを使っている命令(ここでは,jump, fjump)
があったらば,その命令のラベルの部分をそのアドレス値におきかえます.
ここでは,アセンブルされたコードを配列で表現することに
します.
(defun assemble (code)
(let ((length 0) (labels nil))
;;; first path
(dolist (instr code)
(if (atom instr)
(push (cons instr length) labels)
(incf length)))
;;; second path
(let ((addr 0)
(code-vector (make-array length)))
(dolist (instr code)
(unless (atom instr)
(if (member (car instr)
'(jump fjump))
(setf (cadr instr)
(cdr (assoc (cadr instr) labels))))
(setf (aref code-vector addr) instr)
(incf addr)))
code-vector)))
generated through LaTeX2HTML. M.Inaba 平成18年5月6日