anchor.diff:              (number? x)       x
               (instruction? x)  (assemble-instruction x)
               (case x.
  -              'label        (assemble-label x)
  -              'assignment   (assemble-assignment x)
  -              'directive    (assemble-directive x)
  -              'identifier   (assemble-identifier x)
  -              'expression   (assemble-toplevel-expression x)
  +              'label       (assemble-label x)
  +              'assignment  (assemble-assignment x)
  +              'directive   (assemble-directive x)
  +              'identifier  (assemble-identifier x)
  +              'expression  (assemble-toplevel-expression x)
                 (assembler-error "Unexpected parsed expression ~A." x)))
       (= *pc* (update-pc ! *pc*))))
   
  
positive.code:   (aprog1 (assemble-parsed-expressions x)
      (++! *pass*)))
  
  (defun assemble-multiple-passes (out-name dump-name x &key (unassigned-segment-blocks nil)
                                                             (segments (make-queue)))
    (clear-labels)
    (= *pass* 0)
    (prog1 (while (| *label-changed?*
  
negative.code:     (!? *sourceblock-stack*
          (assembler-error "Block(s) with no END: ~A" !))))
  
  (defun assemble-parsed-files (x)
    (= x (assemble-multiple-passes x))
    (unless *unassigned-segment-blocks*
      (return x))
    (format t "Assembling again to assign BLOCKs to SEGMENTS…~%")
    (sort-unassigned-segment-blocks)
    (with-temporary *assign-blocks-to-segments?* t
      (assemble-multiple-passes x :unassigned-segment-blocks *unassigned-segment-blocks*
                                  :segments *segments*)))
  
  (defun assemble-files (out-name &rest in-names)
    (with-temporary *unassigned-segment-blocks* nil
      (let dump-name (+ out-name ".lst")
        (format t "Assembling to '~A'. Dump file is '~A'…~%" out-name dump-name)
        (print (assemble-parsed-files (parse-files in-names))))
      (check-on-unassigned-blocks)
      (rewind-labels))
    nil)
  