next up previous
Next: 8.1 コード表示 Up: ソフトウェア特論 講義資料 Scheme コンパイラ処理系 Previous: 7 関数呼び出し部のコンパイル

8 アセンブル

コンパイルしたコードは,ラベルが入ったコードになっていますが, このラベルを実際のアドレス値へ変換する処理を行います. アセンブラは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日