学计算机的应该听过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虚拟机源码下载

转载于:https://www.cnblogs.com/john-d/archive/2009/12/06/1618056.html

MMIX机器简要介绍相关推荐

  1. [翻译]敏捷软件开发 一 之简要介绍

    敏捷软件开发一之简要介绍       原则.模式与实践是重要的,但是这三个要素都要由人来使得它们协同工作.正如Alistair Cockburn所说:"一个成功的项目,过程与技术永远都是排第 ...

  2. Dalvik虚拟机简要介绍和学习计划

    出自:http://blog.csdn.net/luoshengyang/article/details/8852432 我们知道,Android应用程序是运行在Dalvik虚拟机里面的,并且每一个应 ...

  3. openstack及组件简要介绍

    openstack及组件简要介绍 为什要用云? 一.简单的说就是对资源更加合理的分配,使用,比如硬件的数量,带宽等等这些,因为你不能机器买来不需要了再卖掉(当然也可以),带宽跟机房签合同得来一年的,中 ...

  4. 数据结构的简要介绍:堆栈如何工作

    by Michael Olorunnisola 通过Michael Olorunnisola 数据结构的简要介绍:堆栈如何工作 (A Gentle Introduction to Data Struc ...

  5. 简要介绍语音识别技术在各领域的应用

    语音识别作为信息技术中一种人机接口的关键技术,具有重要的研究意义和广泛的应用价值.介绍了语音识别技术发展的历程,具体阐述了语音识别概念.基本原理.声学建模方法等基本知识,并对语音识别技术在各领域的应用 ...

  6. 简要介绍的卡拉OK机的历史

    简要介绍的卡拉OK机的历史 我们可以跟踪第一个卡拉OK机背的盒式磁带的时间.它包括一个麦克风,音频输出和一个方法来调整记录音乐的音调.随着技术变得更加成熟,卡拉OK机也变得更加复杂,从而保持与这些年来 ...

  7. 【测试】linux FIO命令详解(一):磁盘IO测试工具 fio (并简要介绍iostat工具)

    目录 随看随用 FIO介绍 FIO 工具常用参数: fio工作参数可以写入配置文件 IO状态监控: Iostat介绍 与FIO相似的工具 fio测试脚本 提取iops和bw gunplot画图 Fio ...

  8. Android资源管理框架(Asset Manager)简要介绍和学习计划

    Android应用程序主要由两部分内容组成:代码和资源.资源主要就是指那些与UI相关的东西,例如UI布局.字符串和图片等.代码和资源分开可以使得应用程序在运行时根据实际需要来组织UI.这样就可使得应用 ...

  9. Hadoop学习笔记一 简要介绍

    Hadoop学习笔记一 简要介绍 这里先大致介绍一下Hadoop.     本文大部分内容都是从官网Hadoop上来的.其中有一篇介绍HDFS的pdf文档,里面对Hadoop介绍的比较全面了.我的这一 ...

最新文章

  1. 直方图_20210420
  2. C++ 虚函数与存虚函数
  3. 程序员被公司辞退12天,领导要求回公司讲代码
  4. 如果你铁了心要好好搞科研,我强烈建议你看一下这个帖子
  5. C语言编程,从菜鸟到高手
  6. JavaScript的DOM操作-重点部分-第一部分
  7. MFC 字符串截取成数组 wcstok
  8. C语言将不固定的表达式转换为后缀表达式(附完整源码)
  9. Ribbon源码解析(一)
  10. myeclipse链接数据库,SQL语句实现增删改查
  11. LeetCode 654. 最大二叉树(递归)
  12. (需求实战_01) SpringBoot2.x 整合RabbitMQ_生产端
  13. Failure to find com.oracle:ojdbc6:jar:11.2.0.1.0
  14. (大数据工程师学习路径)第五步 MySQL参考手册中文版----MySQL视图
  15. vue 复制 长按_Vue
  16. 程序员一般都浏览这些网站,不仅仅提升编程水平!
  17. Xcode 开发 控件如何和代码配合使用
  18. Ansible之roles使用
  19. qcom charger
  20. 怎么用计算机算钱,亚马逊fba费用计算器要怎么使用?

热门文章

  1. AutoHotkey纯命令获取Chrome等浏览器的当前网址
  2. 使用maven profile实现多环境可移植构建
  3. IE8下submit表单没反应
  4. HNCU 1328: 算法2-18~2-19:双向循环链表
  5. 【矩阵】概念的理解 —— span、基
  6. Combotree--别样的构建层级json字符串
  7. 测试开发面试准备之python selenium API
  8. 前端面试被问到性能优化该肿么办!
  9. 谁是颠覆者?最全盘点25条区块链主链
  10. 删除两个字符串中的特定字符使其相等,统计删除的字符的ASCII和