本文原创所有,未经允许不得转载,请尊重作者权利。
-----------------------------------------------------------------------------------------------
前段时间在知乎看到一个问题,国外的计算机专业 是如何教 《计算机组成原理》 这门课的?http://www.zhihu.com/question/38838088
就如题主反应的一样,国内对计算机组成原理(国外多称计算机系统Computer System)的教学大多刻板,艰深晦涩。
本文通过整理澳大利亚国立大学对Computer System的教学过程,借鉴先进技术,利用学习工具,也再一次对计算机组成原理的知识进行了一次复习。
学习的核心是依靠一款Java编程的工具rPeANUt,可以在bitbucket上找到,但是网站提供的版本并非最新。
文末将会附贴最新的rPeANUt下载链接和英文原版使用说明。
------------------------------------------------------------------------------------------------------------------------
rPeANUt是一个汇编机微处理器,可以在其中进行基本的代码开发和理解真实的微处理器内部是如何进行处理的(即硬件内部的执行步骤)。
下图是rPeANUt机的内部构成。
介绍
rPeANUt机是一个用于在澳大利亚国立大学中教学计算机系统所制作的一个简单微处理器。这是一个Java编程实现的汇编模拟器。这份文件旨在描述一个汇编机微处理器,为了学生可以进行代码编程和理解真实的微处理器内部是如何进行编程开发的。
rPeANUt机 – 概述
rPeANUt是一个32位微处理器,拥有16位地址、32位寄存器以及可寻址的字长32位内存存储。最大的地址存储数目是216=65536字长即262144字节(256K)。只有0x0000到0x7FFF地址被用于实际存储,0x8000到0XFFFF地址用于内存的IO映射(实际上只有3个地址单元被使用)。当微处理器重置指令寄存器(IP)为0x0200,因此通常一个程序会被装载到这个位置执行。0x0000到0x00FF地址被保留用于中断向量和其他操作系统代码,而且实存最后的960个单位被用作缓冲区。
微处理器包括以下的32位寄存器:
l 8个通用寄存器,可以用作存储数据或地址。记作R0,R1,…R7。
l 1个指令寄存器(IR),用于保存当前正在被执行的指令。
l 1个状态寄存器(SR),包含CPU状态信息。0位被用作整形数溢出(OF),位1被用作中断屏蔽(IM),位2被用作启动中断计时器(TI)。
l 3个常量寄存器,记作ONE,ZERO和MONE。它们分别包含常数1,0和-1。
微处理器包括以下的16位寄存器:
l 1个栈指针(SP),指向栈顶,用于方法的调用和返回,当微处理器被重置时SP被设定到0x7000。
l 1个程序计数器(PC),包含下一个要执行指令的地址。
注意指令寄存器不直接通过指令集访问,尽管指令的执行显然会影响到这个寄存器。
微处理器也包含一个控制单元,使CPU的数据按照一定顺序运行。微处理器有以下所示的执行周期:
do {
IR = mem[PC];
PC = PC + 1;
execute_instruction in IR;
check for interrupts;
} while(!halt);
rPeANUt指令集
指令均为单字长(32位)。寄存器被标记为R0,R1,…R7,SP,SR,PC,ONE,ZERO,MONE并拥有半字节(4位)的机器码。这种半字节编码方式为:R0记为0x0,R1记为0x1,…,R7记为0x7,SP记为0x8,SR记为0x9,PC记为0xA,ONE记为0xB,ZERO记为0xC,MONE记为0xD。如果寄存器编码是0xE那么在指令最后16位的立即值会被使用。地址和值占用32位机器编码指令中的16位,值从16位扩展到32位。下表的指令集描述假定指令字已经被加载到指令寄存器,并且程序计数器已经指向下一个指令字。
指令名称 |
汇编指令 |
机器码 |
描述 |
加 |
add <RS1> <RS2> <RD> |
0x1<RS1><RS2><RD><value> |
RD <- R |