5.2 一个寄存器机器的模拟器

5.2  一个寄存器机器的模拟器

为了很好的理解寄存器机器,我们必须测试 我们设计的机器能否
按预期执行程序。 测试一个设计的一个方法是手工模拟控制器的操作,如在5.5中的练习题。
如果不是针对于最简单的机器,这就是极其麻烦的。 在这部分中,我们用寄存器机器
语言为机器构造了一个模拟器。 这个模拟器是一个有四个接口程序的SCHEME模式程序。
第一个程序 使用了寄存器机器的描述 构造了一个机器模型(一个数据结构
对应于被模拟机器)。 其它三个允许我们以操作模型的方式模拟机器。

(make-machine  <register-names> <operations> <controller>)
  组装和返回给定寄存器,操作,控制器的机器模型。

(set-register-contents!  <machine-model> <register-name>  <value>)
在给定的机器中的模拟寄存器中存储一个数值。

(get-register-contents <machine-model> <register-name> )
返回在给定的机器中的模拟寄存器中的值。

(start <machine-model>)
模拟给定机器的执行,从控制器的执行序列的开头开始,当到达序列的结尾时停止。

作为这些程序如何被使用的一个例子,我们能够定义 gcd-machine 作为5.1.1
部分的GCD机器的一个模型,如下所示:

(define   gcd-machine
      (make-machine
        '(a b t)
 (list (list  'rem remainder)  (list  '=  =))
          '(test-b
                (test  (op =) (reg b) (const 0))
                (branch  (label  gcd-done))
                (assign  t  (op rem)  (reg  a) (reg b))      
                (assign  a  (reg b))
                (assign  b  (reg t))
                (goto (label  test-b))
         gcd-done
 )))

 make-machine的第一个参数是一个寄存器名称的列表。
 第二个参数是一个表格(元素是两个列表的列表)
 数对中的任何一个操作名称有一个scheme程序
 来执行相应的操作。(也就是相同的输入值产生相同的输出值)
 最后的参数指定了一个控制器,它是标签与机器指令的列表
 如5。1部分中的例子。

为了用这个机器来计算GCD,我们设置了输入寄存器,
开始机器,当模拟结束时检查结果:

(set-register-contents!  gcd-machine  'a  206)
done
(set-register-contents!  gcd-machine   'b  40)
done
(start gcd-machine)
done
(get-register-contents  gcd-machine  'a)
2

这个计算将比一个在scheme写成的GCD的程序运行得更慢。
因为我们将用更多的复杂的操作来模拟底层的机器指令,例如赋值指令。

练习5。7
使用模拟器来测试你在练习5。4中设计的机器。

猜你喜欢

转载自blog.csdn.net/gggwfn1982/article/details/83154231
5.2