周围人还关注:CH04 MARIE:简单计算机模型

来源:百度文库 编辑:中财网 时间:2024/03/29 01:26:40
MARIE — An Introduction to a Simple Computer
4.1.1 CPU的基本知识和组成原理
中央处理器(central processing unit, CPU)的任务就是负责提取程序指令,并对指令进行译码,然后按程序规定的顺序对正确的数据执行各种操作.
中央处理器可以分成两部分:
第一部分是数据通道(datapath),它是一种由存储单元(寄存器)和算术逻辑单元(对数据执行各种操作)所组成的网络.这些组件通过总线(总线是传递数据的电子线路)连接起来,并利用时钟来控制时间.
第二部分是控制单元(control unit),该模块负责对各种操作进行排序并保证各种正确的数据适时地出现在所需的地方.
工作任务:提取指令,指令译码和按规定的顺序执行各种操作.
寄存器
寄存器(register)是一种存储二进制数据的硬件设备.寄存器位于处理器的内部,所以处理器可以非常快地访问寄存器中存储的各种信息.
寄存器的大小有:16位,32位和64位.
可以向寄存器写入或从其读取信息,信息也可以在不同的寄存器之间传递.寄存器的编址方式与存储器不同.每一存储器字都有一个唯一的二进制地址,这些地址从0开始进行编码.寄存器则是由CPU内部的控制单元进行编址和处理的.
现代计算机系统中有各种不同类型的专用寄存器:存储信息的寄存器,进行数值移位的寄存器,进行数值比较的寄存器和计数寄存器,还有"中间结果"寄存器用来存储临时数据值,变址寄存器用来控制程序的循环操作,堆栈指针寄存器用于管理所处理的信息堆栈,状态寄存器用于保持各种工作状态或操作模式(比如溢出,进位或一些零条件等 ).
ALU
算术逻辑单元(arithmetic logic unit, ALU)在程序执行过程中用于进行逻辑运算(如比较运算)和算术运算(如加法和乘法运算).
一般情况下,ALU有两个数据输入和一个数据输出.ALU中的各种操作常常会影响状态寄存器(status register)的某些数据位的数值(设置这些数据位是为了指示某些动作,例如是否有溢出发生).通过控制单元发出的信号,控制ALU执行各种规定的运算.
控制单元
控制单元(control unit)是CPU中的"警察"或"交通管理员".控制单元负责监视所有指令的执行和各种信息的传送过程.控制单元负责从内存提取指令,对这些指令进行译码,确保数据适时地出现在正确的地方.控制单元还负责通知ALU应该使用哪一个寄存器,执行哪些中断服务程序,以及对所需执行的各种操作接通ALU中的正确电路,控制单元使用一个称为程序计数器(program counter)的寄存器来寻找下一条要执行的指令的位置,并使用一个状态寄存器来存放某些特殊的操作状态,比如溢出,进位,借位和类似的状态等.
4.1.2 总线
CPU通过总线与其他的部件连接起来.总线(bus)是一组导电线路的组合.
总线由多条线路构成,这样总线允许许多位数据并行传递.
总线的速度通常受总线长度和共享总线的设备数目的影响.各种设备分为主(master)设备和从(slave)设备两种类型,主设备是最初启动的设备,而从设备是响应主设备请求的设备.
总线中以实现以点对点(point-to-point)的方式连接两个特定的设备,或者将总线用作一条公用通道(common pathway)来连接多个设备.要求多个设备共享的总线称为多点(multipoint)总线.
由于需要共享总线,所以总线协议(bus protocol, 使用规则集)非常重要,典型的计算机总线包括数据总线,地址总线,控制总线和电源线.
用于数据传递的总线称为数据总线(data bus).
计算机通过控制总线(control line)指示哪个设备允许使用总线.控制总线也传递有关总线请求,中断和时钟同步信号的响应信号.
地址总线(address line)指出数据读写(如内存中)的位置.
电源线(power line)为计算机提供所需的电力
各种信息的传递都发生在一个总线周期(bus cycle)内.总线周期是完成总线信息传送所需的时钟脉冲的时间间隔
处理器-内存总线(processor-memory bus)是长度较短的高速总线.这类总线可以兼容多种不同的体系结构.
底板总线(backplane bus, 或称为主板总线)实际上是构建在机器主板上的一条总线.也就是所有设备共享一条总线.
PC机使用一条内总线(称为系统总线,system bus)连接CPU,内存和所有其他内部部件.而采用外总线(有时称为扩展总线, expansion bus)来连接各种外围设备,扩展插槽和I/O端口到计算机的其他部分。
还有局部总线(local bus),可以将外设直接连接到CPU的数据总线上.
从物理结构上来说,总线只是一些导线的集合.
同步(synchronous)总线是由时钟控制的,各种事件只有在时钟脉冲到来时才会发生,也就是事件发生的顺序由时钟脉冲来控制.每个设备都由时钟走动的速率,称为时钟频率(clock rate),来进行同步.
总线周期时间不能短于信息在总线上传送所需要的时间.
各种控制线都是使用异步(asynchronous)总线来负责协调计算机的各种操作.这种异步总线必须采用一种较为复杂的握手协议(handshanking protocol)来强制实现与计算机其他操作的同步.
任意时刻都只能有一个设备使用总线.总线主控设备是允许最初的信息传递(控制总线)的设备,而总线受控(从)设备是由主控设备激活的模块,由于各种从设备是响应主控设备的请求来读写数据,所以只有主控设备可以战胜总线以及为准备战胜而保留总线.
对于配备不止有一个主控设备的系统,则需要总线仲裁(bus arbitration)机制,必须为某些主控设备设定一种优先级别,同时又保证各个主控设备都有机会使用总线.
1.菊花链仲裁方式 2.集中式平行仲裁方式, 3:采用选择的分配式仲裁方式 4:采用冲突检测的分配式仲裁方式
4.1.3 时钟
每台计算机都有一个内部时钟.用来控制指令的执行速度.时钟也用来对系统中各个部件的操作进行协调和同步.
CPU使用时钟信号来调控系统的各个进程,检测系统中的各种数字逻辑门电路是否会出现其他不可预测的执行速度.
计算机通常采用时钟周期(clock cycle)数目来量度系统指令的性能,而不是采用时间秒
时钟周期是时钟两次相邻嘀嗒声,即两个相邻的时钟脉冲之间的时间间隔.时钟频率(clock frequency),有时称为时钟速率或时钟速度.是采用MHz来测量的.
时钟脉冲发生从0到1然后从1到0的规律性变化.计算机中的各个寄存器都必须等待时钟脉冲发生跃变才能输入新的数据.在设计时钟周期时存在许多限制,当时钟脉冲发生跃变时,各个寄存器中会被装入新数据,同时寄存器的输出结果也可能发生改变.这些发生弯化的输出值必须通过系统中的电路进行传递,直到下一组寄存器的输入端,然后存储于输入端.因此,时钟的周期时间必须足够长,以保证这些改变可以被传递到下一组的寄存器.
最小的时钟周期时间至少应该大于数据从每组寄存器的输出到下一组寄存器的输入所需要的传递时间,即电路的最大传输延迟时间.
注意,机器的体系结构对计算机的性能有很大影响.乘法操作比加法操作需要更多的时钟周期,浮点运算比整数运算需要更多的时钟周期,而访问存储器要比访问寄存器需要更多的时钟周期.
时钟(clock)是指系统时钟(system clock),即控制CPU和其他部件的主控时钟.然而,某些总线结构也配有自己的时钟.总线时钟(bus clock)通常比CPU时钟慢,这样就造成了系统的瓶颈问题.
4.1.4 输入/输出子系统
人们通过输入和输出设备(input out output device)与计算机进行交流,输入/输出是指各种外围设备和主存储器(也称为内存款额) 之间的数据交换.
输入输出设备通常并不与CPU直接相连,而是采用某种接口(interface)来处理数据交换.接口负责系统总线和各外围设备之间的信号转换,将信号变成总线和外设都可以接受的形式.CPU通过输入输出寄存器和外设进行交流,这种数据交换通常有两种工作方式.在内存交换(映射)的输入输出(memory-mapped I/O)方式中,接口中的寄存器地址就是内在地址的分配表(或称为映射图)中.而对于指令实现的输入输出(instructionbased I/O)方式,CPU需要有专用的指令来实现输入和输出操作.
中断在I/O中扮演了非常重要的角色,因为中断是一种非常有效的方法,可以通知CPU输入或输出是否已经准备就绪.
4.1.5 存储器组成和寻址方式
可以将存储器设想成一个数据位的阵列,阵列的每一行的位长度通常等于机器的字大小.
每个寄存器(通常称为存储单元,memory location)都具有一个唯一的地址编号,存储器的地址通常是从0开始编号,按顺序递增.
存储器的地址几乎都是采用无符号整数来表示.存储器采用的是按字节编址(byte-addressable)的方式.在按字节编址的情况下,如果一个机器字使用了多个字节,那么计算机将使用最低地址的字节来决定整个字的地址.当然计算机的存储器也可以采用按字编址(word-addressable)的方式,即每个机器字(不是每个字节)都具有一个自己的唯一地址,通常,一个存储器的地址存储在一个单一机器字中.
如果计算机系统采用按字节编址的体系结构,并且指令系统的结构字大于一个字节,就会出现一个所谓字节对齐(alignment)的问题.对于32-位字的情形,可以通过将要查找的地址乘以4倍来实现上面这种读取方式.
存储器(指内存)由随机访问存储器(RAM)芯片构成,存储器通常使用符号L x W(长度 x 宽度)来表示.
存储器交叉存储技术(memory interleaving),即从多个存储器模块(或称为存储器组) 中分离存储器单元的技术,交叉存储技术分为:低位交叉存储(low-order interleaving),使用地址的低位来选择存储器组;高位交叉存储(high-order interleaving),使用地址的高位来选择存储器组.
(1) 存储器采用无符号的二进制数值进行编址
(2) 要编址的项目数决定了出现在地址中的二进制数的位数.
4.1.6 中断
反映负责处理计算机中各个部件与处理器之间相互作用的概念: 中断(interrupt).中断就是改变(或中断)系统正常执行流程的各种事件.各种原因可以触发中断:
I/O请求 出现算术错误(例如,被0除) 算术下溢或上溢 硬件故障(例如,存储器奇偶校验错误) 用户定义的中断点(比如,程序调试过程) 页面错误 非法指令(通常由于指针问题引起) 其他原因
由用户或系统发出(启动)的中断请求可以是屏蔽(maskable)中断(可以被禁止或忽略)或非屏蔽(nonmaskable)中断(高优先级别的中断,不能被禁止,必须响应).
4.2 MARIE
MARIE,表示一个真正直观和简单的计算机体系结构.它包括存储器(存储程序和数据)和CPU(由一个ALU和几个寄存器组成).
4.2.1 体系结构
MARIE 具有下列特点
使用二进制数和补码表示法 存储程序和采用字长度 按字(不是按字节的)编址方式 主存储器容量为 4K 字(即每个地址需要使用12位二进制数) 16位数据(16位字) 16位指令,4位操作码和12位地址 一个16位的累加器(AC) 一个16位的指令寄存器(IR) 一个16位的存储器缓冲寄存器(MBR) 一个12位的程序计数器(PC) 一个12位的存储器地址寄存器(MAR) 一个8位的输入寄存器 一个8位的输出寄存器
MARIE体系结构的示意图

再次强调,存储器中的每一个存储单元都有一个唯一的地址,采用二进制数来表示,并且每个存储单元都可以存放一个数值,表示存储单元地址的二进制数常常很容易与存储单元中存放的内容(也是一个二进制数)混淆.
4.2.2 寄存器和总线
在MARIE中,有下列7种寄存器:
AC:警惕累加器 (accumulator), 用来保持数据值. 它是一个通用寄存器 (general purpose register),作用是保 持CPU需要处理的数据.现在磊部分的计算机都有多个寄存器. MAR: 存储器地址寄存器(memory address register), 用来保持被引用数据的存储器地址. MBR: 存储器缓冲寄存器(memory buffer register), 用来保持刚从存储器中读取或者将要写入存储器的数据. PC: 程序计数器 (program counter), 用来保持程序将要执行的下一条指令的地址. IR: 指令寄存器(instruction register), 用来保持将要执行的下一条指令(指令的二进制内容). InREG: 输入寄存器 (input register), 用来保持来自输入设备的数据 OutREG: 输出寄存器 (output register), 用来保持要输出到输出设备的数据.
MAR,MBR,PC和IR寄存器用来保持一些专用信息,并且不能用作上述规定之外的其他目的
MARIE需要利用总线来将各种数据或指令传入和移出寄存器
MARIE中的数据通道
4.2.3 指令系统体系结构
计算机的指令系统体系结构 (instruction set archiecture, ISA) 详细规定了计算机可以执行的每条指令及其格式.从本质上来说,ISA是计算机软件和硬件之间的接口. 某些计算机的指令系统体系结构常常包含几百条指令.MARIE的每条指令都由16位二进制数所构成.指令最左边的4位,从第12位到第15位,组成机器的操作码(opcode).操作码表示的是要执行的指令,MARIE总共可以有16条指令,而右边的12位,第0位到第11位,用来形成一个地址.因此,机器允许的最大存储器的大小为2^12-1.

二进制指令又称为机器指令(machine instruction). 而对应的助记符号指令则称为汇编语言指令(assembly language instruction). 汇编语言和机器指令之间存在一一对应关系.
4.2.4 寄存器传输表示法
其实每条汇编指令实际上都包含多个操作.包含了多个"微指令(mini-instruction)"的执行过程. 这些微指令又称为微操作(microoperation). 微指令规定了对寄存器中存储的数据可以执行各种最基本的操作.
描述计算机微操作的行为的符号表示法称为寄存器传输表示法(register transfer notation, RTN),或者称为寄存器传输语言 (register transfer language, RTL). 寄存器之间的数据传送包含下面两个步骤:数据先从源寄存器传送至总线,然后脱离总线传送到目的寄存器.
MARIE的完整指令集
注: MBR和AC之间设置有专门的连接通路,所以从MBR到AC的数据传送可以在数据被放入MBR后立刻进行,而不必等待总线周期
操作码
指令
说明
RTN
0000
JnS X
(跳转-和-存储) 指令可以对某个返回指令存储一个地址指针,然后继续处理对不同的指令设置新的PC值.利用这条指令可以进行过程调用和其它子程序的调用,而当子程序执行完成后系统又会返回到原程序代码中的调用点.
MBR ← PC
MAR ← X
M[MAR] ← MBR
MBR ← X
AC ← 1
AC ← AC + MBR
PC ← AC
0001
Load X
这条指令是将存储单元X中的内容装到AC寄存器.首先必须将地址X放入到MAR中.接着将单元M[MAR](或地址X)的数据移动至MBR中.最后,将这个数据移入AC寄存器中.
MAR ← X
MBR← M[MAR]&
AC ← MBR
0010
Store X
使用这条指令可以将AC中的内容存放到地址X 处的存储器单元中
MAR ← X &
MBR ← AC
M[MAR] ← MBR
0011
Add X
将存储在地址X 处的数据值加到AC累加器中.
MAR ← X
MBR ← M[MAR]
AC ← AC + MBR
0100
Subt X
类似于Add指令,从累加器中减去存储在地址X 处的数值,然后将计算结果返回到AC中
MBR ← X
MBR ← M[MAR]
AC ← AC – MBR
0101
Input
这条指令是将来自输入设备的任何输入数据首先发送到InREG寄存器,然后再转移到AC中
AC ← InREG
0110
Output
这条指令是将AC中的内容先放到寄存器OutREG,然后发送到输出设备上
OutREG ← AC
0111
Halt
没有与寄存器有关的操作,该指令简单地使机器终止程序的执行
1000
Skipcond
记住这一指令使用地址域中位10和位11的两位来决定对累加器AC所进行的比较运算.根据这两个位的不同组合,机器会检查AC中的数值,决定这个数值是否为负数,等于0,或者是大于0.如果给定的条件为真,则会跳过下一条指令.这种跳转操作是通过将PC寄存器中的指针进行增量加工能力来实现的
If IR[11-10]=00 then
If AC<0 then
PC←PC+1
Else If IR[11-10]=01 then
If AC=0 then
PC ← PC+1
Else If IR[11-10]=10 then
If AC>0 then
PC ← PC+1
1001
Jump X
指令执行一个转向给定地址X处的无条件分去转移.所以,在执行这条指令时,地址X必须先行装入到PC中.
PC ← IR[11-0]
1010
Clear
指令会将累加器的全部二进制位设置为0.
AC ← 0
1011
AddI X
指令采用的是不同的寻址方式(addressing mode)前面介绍的所有指令都假定了指令数据部分的数值就是指令所需要的操作数的直接地址(direct address).而 AddI 指令则是采用间接寻址方式(indirect addressing mode).
MAR ← X
MBR ← M[MAR]
MAR ← MBR
MBR ← M[MAR]
AC ← AC+MBR
1100
JumpI X
采用的是不同的寻址方式
MAR ← X
MBR ← M[MAR]
PC ← MBR
4.3 指令的执行过程
现在所有的计算机系统都遵循一个基本循环过程: 取指,译码和执行周期
4.3.1 取指-译码-执行周期
取指-译码-执行(fetch-decode-execute)表示计算机运行程序时所遵循的步骤.CPU首行撮一条指令,即将指令从主存储器转移到指令寄存器; 接着对指令进行译码,即确定指令的操作码和提取该指令所需的数据; 然后执行这条指令,即执行指令规定的各种操作.
第一条指令的地址必须被装入到PC中.

现代计算机系统,具有宠大的指令集,超长的指令和巨大的存储器系统,可以在瞬间执行几百万个这种取指-译码-执行的循环过程
4.3.2 中断和输入/输出
从物理上来说,这两个寄存器所使用的定时机制非常重要.例如,如果采用键盘输入,并且打字的速度很快时,计算机必须有足够的时间来阅读输入寄存器的每一个字符.如果在计算机能够有机会处理完当前的字符之前,又有另外一个字符被送入到输入寄存器,那么当前的那个字符就会丢失.一种更可能发生的情况是,由于处理器的速度非常快,而键盘输入的速度很慢,所以处理器可能会多次从寄存器重复读取同一个字符.
在MARIE模型中,使用中断控制的输入输出(interrupt-driven I/O)来解决上述这些问题.
CPU收到一个来自I/O设备的信号(中断信号),表示输入或输出的准备工作已经完成. 利用某些方法可以CPU从正常的取指-译码-执行周期去"识别"这个中断请求.
计算机中有三种类型的中断: 由外部事件(比如输入/输出, 或电源掉电等) 产生的外部中断; 由于程序中的一些异常(例如,被0除,堆栈溢出,或保护系统侵犯等)产生的内部中断以及执行程序中的某条指令(例如,要求程序的执行从一种运行环境,如用户层,转到另一个运行环境,如内核层等)所引起的软件中断.
CPU要去执行中断服务程序时,必须先存储PC中的内容,CPU的所有寄存器中的内容,以及原始程序中原有的各种状态条件.而在中断服务程序完成时,CPU必须严格恢复到原始程序运行的真实环境,然后又开始对原来运行的程序进行取指,译码和执行指令的操作
4.5 有关编译程序的讨论
4.5.1 编译程序的功能
编译程序的任务就是使用助记符号将汇编语言转换成机器语言,即完全由二进制数,或者说完全由0和1的数字串组成的语句.编译程序阅读的是由汇编语言编写的源文件(source file),生成的是由机器代码组成的目标文件(object file)
可以使用标记符号(label)(简单名称)来标识或命名一些特定的存储器地址.MARIE 则要求标号后面必须要加一个","的标点符号.
在第一次通读时,编译程序会建立一组称为符号表(symbol table)的对应关系.
第二次通读时,编译程序使用符号表来填充空白地址,并且生成相应的机器语言指令.
4.5.2 为什么使用汇编语言
学习汇编语言不但可以了解计算机的基本体系结构,而且可以真正认识处理器的方式并深刻理解所编程的特定的计算机系统的具体内部结构,而且可以真正认识处理器的工作方式并深刻理解所编程的特定的计算机系统的具体内部构造.
通常,利用混合编程的方法即一个程序的大部分内容使用高级语言,但某些部分直接使用汇编语言,可以让程序员充分发挥这两种语言的各自优势.
4.7 有关译码的讨论:硬件译码和微程序控制译码
对于每条指令,控制单元都能够控制CPU按正确的步骤执行操作.
可以采用两种方法来正确设置各条控制线.第一种方法是从物理上将各条控制线与实际的机器指令连接起来.这种方法称为硬连接控制(hardwired control).
硬连接控制的优点是速度快,缺点是指令集和控制逻辑通过特殊的电路直接连接,使得电路变得比较复杂,设计或修改都比较困难.
另外一种控制方法是微编程(microprogramming),即使用软件来进行控制,微程序其实是一个用微代码(microcode)编写的翻译器,这些微程序被存储在计算机固件(如ROM,PROM或EPROM等)中,称为控制存储器(control store).
微编程在设计方面非常灵活简单,而且有助于设计功能强大的指令集.