MMIX机器简要介绍
学计算机的应该听过Don Knuth的大名吧,他的七卷本著作《the Art of Computer Programming》的第四卷的草稿也出来了。Knuth大神计划在完成第五卷后重新修订一、二、三卷,届时上面的程序就不会用MIX汇编了,而是用MMIX汇编。别看仅仅是多了个M,这差别可大了,MIX和MMIX可以说是完全不同的机器,MIX设计于六十年代,当时计算机体系结构与今日大不相同,如果你看过TAOCP卷一的话肯定能明白MIX汇编的晦涩难懂。三十年过去了,Knuth终于要重新设计一台机器,并且是RISC风格的64位机器。Knuth原话如下:
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汇编的通用后缀名)
以*开头的行是注释
第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虚拟机源码下载
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汇编的通用后缀名)
以*开头的行是注释
第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虚拟机源码下载
posted on 2009-12-06 16:36 John Waken 阅读(7053) 评论(6) 编辑 收藏 举报