MIXVM环境搭建

纪浩 2017-10-26 20:13:30

《计算机程序设计艺术》作为算法学科的开山之作,几乎所有程序员都听说过这本书的大名,但真正使用这本书来学习算法的人却寥寥无几,主要的原因有两个,一是书籍开头用接近100页的篇幅讲解书中用到的数学知识,这对于数学不好的同学来说,阅读体验及其不友好;二是作者为了讲解算法,设计了一台虚拟的计算机–MIX,并针对该机器自己设计了一整套汇编指令集–MIXAL,且书中的所有算法都是使用MIXAL来实现的。这对于常年使用高级语言的同学来说,阅读体验及其不友好。

事实上,MIX的汇编语言学习起来并不复杂,按照作者的估算时间,只需要一个下午的时间就可以初步掌握这种语言。但理解代码最直观的手段还是让代码跑起来,本文的主要目的就是介绍MIXVM(由GNU开发的MIX虚拟机)的使用方法。

MIX的基本结构

作为一台假象的计算机,MIX符合冯诺依曼体系(为了方便后文讲解,这里只对结构做简单介绍,结构的详细介绍和指令集的介绍请参考原书)。

它包含:

  • 9个寄存器:
    • A 寄存器(累加器)由五个字节和一个符号位组成;
    • X 寄存器(扩充)同上;
    • I 寄存器(变址寄存器)I1,I2,I3,I4,I5,I6各有两个字节和一个符号;
    • J 寄存器(转移地址)拥有两个字节,它的符号总是: + ;
  • 一个溢出开关
  • 一个比较指示器(L:小于,E:等于,G:大于)
  • 内存:有4000字大小的存储单元
  • 输入/输出设备

为什么要使用MIXVM

作为一个学习工具,MIXVM不仅仅只是能够运行MIX程序,还有【统计运行时间】、【编译代码】、【分步调试】、【查看机器状态】等功能。使用它可以让我们完整的理解MIX程序执行的全过程。

在Mac上安装MIXVM

MIXVM由C语言开发,官方网站有比较详细的下载/安装流程。但由于其依赖较多,建议使用 brew、yum、apt-get等包管理工具进行安装。在mac上可以使用如下命令进行安装

    brew install mdk

安装成功后,可以使用mixvm命令进入虚拟机环境。在虚拟机环境下键入help命令,可以查看帮助(虽然命令较多,但其实并不复杂,文章后续会做介绍)

mix程序编写,调试的流程

一般情况下,编程需要经历【编写】、【编译】、【装载】、【运行】、【调试】等流程,用户可以再不离开MIXVM环境下,完成所有这些行为。

1.编写程序

当我们需要编写一个新程序或修改已有程序时,可以使用“edit [filename]”命令,虚拟机会默认使用vi编辑器(编辑器可以进行配置)对文件进行编辑。

2.编译程序

当我们完成对程序的编写后,可以使用“compile [filename]”命令对源代码进行编译,和大多数编译器一样,我们可以通过输出到控制台的编译信息(成功/失败、错误行等)修改我们的程序。编译成功后输出的文件默认为“filename.mix”

3.装载程序

当我们成功编译一个程序后,如果想在虚拟机上运行它,需要先在虚拟机上装载这个程序,装载的过程也很简单,使用“load xxx.mix”即可装载xxx程序

4.运行程序

程序被装载成功后,我们离最终的胜利就差最后一步了,只要使用“run”命令,就可以让程序跑起来。

下面,我们以经典的”Hello World”程序为例,来尝试一下在MIXVM上编写程序的完整的流程:

首先给出代码

*
* hello.mixal: say 'hello world' in MIXAL
*
* label ins    operand     comment
TERM    EQU    19          the MIX console device number
        ORIG   3000        start address
START   OUT    MSG(TERM)   output data at address MSG
        HLT                halt execution
MSG     ALF    "MIXAL"
        ALF    " HELL"
        ALF    "O WOR"
        ALF    "LD   "
        END    START       end of the program

我们只需要按照图示顺序执行命令,即可看到熟悉的”HELLO WORLD” 图片描述

MIXVM命令概览

下面,我们将浏览一下mix的其它命令,这些命令主要包括:【调试相关命令】,【系统设置命令】,这里我们主要介绍调试命令,其它命令按照下面介绍的原则也可以被快速掌握。

前面提到过,MIXVM不仅只有编译执行程序的功能,还有强大的调试功能。我们在调试的过程中主要的诉求有以下四点:

  • 设置断点
  • 分步执行代码
  • 打印机器状态
  • 设置机器状态

这里用到的mixvm的命令看似很多,但只要我们熟悉几个关键概念的缩写,就可以非常轻松的记住这些命令的功能。

命令的格式一般为 【动词首字母】 + 【名词缩写】

【动词】:

  • print–打印(p)
  • set–设置(s)
  • clear–清除(c)

【名词】:

  • register–寄存器(reg)
  • memory–内存(mem)
  • comparison–比较指示器(cmp)
  • overflow–溢出开关(over)
  • symbol–符号(sym)
  • break point–断点(bp)
    • bp 当执行到指定代码行时中断
    • bpa 当执行到指定内存地址时中断(address)
    • bpr 当指定寄存器的值发生变化时发生中断(regster)
    • bpm 当指定内存行的值发生变化时发生中断(memory)
    • bpc 当比较指示器的值发生变化时发生中断(comparison)
    • bpo 当溢出开关的值发生变化时发生中断(overflow)

这样,我们可以轻松拼写出我们希望使用的命令,比如:

  • 假设我们要打印寄存器状态时,我们应当使用的命令就应该是”pmem”
  • 假设我们需要为代码设置断点时需要使用的命令就应该是”sbp”

当然,在这里写下千言万语,其实都不如一条”help”命令

    help                              #列出所有可用的命令及解释
    help [commend]                    #列出该命令的使用方法

图片描述

文章写到这里也就差不多了,最后住大家在MIXVM上玩的愉快