Thirty years have passed since the Mix computer was designed. And computer architecture has been converging during those years towards a rather different style of machine. Therefore it is time to replace MIX with a new computer that contains even less saturated fat than its predecessor.
可以看出新的机器必定简单化,实际上Knuth就是在Hennessy和Patterson的帮助下设计MMIX的,那当然是一个RISC机器咯。
MMIX简介
MMIX机器RISC风格的,这意味这它应该有很多寄存器,大部分操作因该都是在寄存器中完成;MMIX是64位机器,说明MMIX的寄存器应该都是64位的。
不错,MMIX有256个通用寄存器,供程序作算术逻辑运算。比如 ADD $0,$1,$2 就是把1号寄存器和2号寄存器的值相加结果存入0号寄存器。
另有32个专用寄存器,供隐式寻址和一些特权指令操作。
MMIX的指令格式为 OP X,Y,Z
操作码和每个操作数各占一字节,就是说MMIX指令的长度永远是4个字节。X一般做目的操作数。
MMIX Hello World
在这里我不能详细描述MMIX,只能提供一些资料,然后写个Helloworld程序,因为我自己所知道的也非常有限。
MMIX模拟器称为mmix,汇编器叫mmixal,下面就写个hello.mms。(mms是MMIX汇编的通用后缀名)
![](https://i-blog.csdnimg.cn/blog_migrate/39ac3c6fe7e489de3147aa7bde9bf72c.png)
以*开头的行是注释
第5行应该很好理解,就是占用一些内存区,在里面存入"Hello, world!"中每个字符的ASCII值,10是换行,0和C语言中的'\0'是一样的意思。
从第6行行开始每行都是一条指令,MMIX汇编格式中的指令分为三部分,标号、操作码、操作数,之间用空白字符隔开。学过其他汇编的人应该很容易理解MMIX汇编的格式,只是要注意一点,操作数之间只能有一个逗号,连空格都不能有,这应该是knuth写的词法分析中的"BUG"。
第6行将字符串首地址String装入最后一个寄存器
然后在第7行执行TRAP指令,TRAP相当于X86中的中断指令。中断服务程序是Fputs(模拟器提供的基本输入输出函数),它把$255中指示的字符串输出到StdOut中。
最后用TRAP执行Halt指令,退出模拟器。
写好后,就如同使用GCC一样,先用mmixal汇编该源文件得到目标文件
mmixal -o hello hello.mms
再将目标文件hello载入mmix模拟器即可
mmix hello
编译安装mmix模拟器、汇编器及相关工具
本来这一节应该放在Hello World前面,但是我觉得上面的编译过程与平常使用GCC没什么区别,所以把最重要的一节放到最后。
在本文最后我提供了最新的MMIX模拟器源码(不仅仅是模拟器,还有一系列工具,如汇编器),请读者先下载。
解压后打开Readme文件仔细阅读,现在就没我什么事儿了。
什么?不想看英文!哎,这怎么能学得好计算机呢。其实就是下面三步
$ make doc // 会得到所有的文档,包括MMIX架构说明,MMIX汇编说明,应该仔细看看
$ make mmix // 得到MMIX模拟器的可执行文件 mmix
$ make mmixal // 得到MMIX汇编器的可执行文件 mmixal
上面的安装并不是经典的 confgiure、make、make install三部曲。实际上就相当于我们自己写好了源码,然后编译得到了可执行文件,所以如果你想在任何目录下都能执行 mmix,mmixal的话,就要把它所在的目录假如PATH变量
OK,现在你可以去编译开始写的hello文件,并在模拟器中运行了。
ps: 读者如果有兴趣的话最好看看make doc产生的三个文档,实际上几乎没有其他的参考资料
对MMIX感兴趣或有研究的朋友可以通过此博客或者 JohnWaken@163.com联系我
MMIX虚拟机源码下载