实验五 第四章 处理器体系结构
本章重点是4.1-4.3
重点习题:4.1 4.2 4.5 4.6 4.8 4.10 4.11 4.12 4.16 4.17 4.19 4.21 4.24
本章重点内容是:处理器结构,各种逻辑门,功能单元,指令集,指令的执行,指令执行的流水线
首先要定义一个简单的指令集,作为我们处理器实现的运行示例。受到IA32指令集的启发,他被俗称为x86,即Y86指令集。与IA32相比,Y86指令集的数据类型,指令和寻址方式都要少一些
Y86程序中的每条指令都会读取或修改处理器状态的某些部分,称为程序员可见状态
Y86的处理器状态类似于IA32。有八个程序寄存器:%eax %ebx %ecx %edx %esi %edi %esp %ebp。处理器的每个程序寄存器存储一个字。寄存器%esp被入栈,出栈,调用和返回指令作为栈指针。在其他情况中,寄存器没有固定的含义或固定值。有三个一位的条件码:ZF SF OF,他们保存最近的算术或逻辑指令所造成影响的有关信息。程序计数器(PC)存放当前正在执行指令的地址
存储器:从概念上来说就是一个很大的字节数组,保留着程序和数据。Y86程序用虚拟地址来引用存储器位置。硬件和操作系统软件联合起来将虚拟地址翻译成实际或物理地址,指明数据实际保存在存储器中哪个地方
关于Y86:
1.IA32的movl指令分成了4个不同的指令:irmovl,rrmovl,mrmovl,rmmovl,分别显式的指名源和目的的格式。源可以是立即数(i)寄存器(r)或存储器(m)。指令名字的第一个字母就表明了源的类型。目的可以是寄存器(r)或存储器(m)。指令名字的第二个字母指明了目的类型
2.有4个整数操作指令addl,subl,andl,xorl
3.7个跳转指令jmp,jle,jl,je,jne,jge,jg
4.6个条件传送指令cmovle,cmovl,cmove,cmovne,cmovge,cmovg
5.call指令将返回地址入栈,然后跳到目的地址。ret指令从这样的过程调用中返回
6.pushl和popl指令实现了入栈和出栈
7.halt指令停止指令的执行
指令集的一个重要性质就是字节编码必须有唯一的解释
值 | 名字 | 含义 |
1 | AOK | 正常操作 |
2 | HLT | 处理器执行halt指令 |
3 | ADR | 遇到非法地址 |
4 | INS | 遇到非法指令 |
Y86状态码(在我们的设计中,任何AOK以外的代码都会使处理器停止)
对于Y86,当遇到这些异常的时候,我们就简单的让处理器停止执行指令。在更完整的设计中,处理器通常会调用一个异常处理程序
YIS:指令集模拟器,它的目的是模拟Y86机器代码程序的执行,而不用试图去模拟任何具体处理器实现的行为
大多数Y86指令是以一种直接的方式修改程序状态的,所以定义每条指令想要达到的结果并不困难
pushl指令会把栈指针减4,并将一个寄存器值写入存储器中。因此,当执行pushl%esp指令时,处理器的行为是不确定的,因为要入栈的寄存器会被同一条指令修改.通常有两种约定(1)压入%esp的原始值 (2)压入减去4的%esp的值
对于popl%esp指令也类似。可以将%esp置为从存储器中读出的值,也可以置为加上4后的栈指针
HCL(硬件控制语言)表达式 | C语言 | |
AND | && | & |
OR | || | | |
NOT | ! | ~ |
不用C语言的符号是因为逻辑门只对单个位的数进行操作,而不是整个字
假设我们想设计一个逻辑电路来找一组字A,B,C中的最小值,用HCL来表达就是:
int Min3 =[
A <= B && A <= C : A;
B <= A && B <= C : B;
1 : C;
];
两类存储器设备:时钟寄存器,随机访问存储器
处理一条指令包括很多操作(实现所有Y86指令所需要的计算可以组织成的六个基本阶段):
1.取指
2.译码
3.执行
4.访存
5.写回
6.更新PC
处理器从来不需要为了完成一条指令的执行而去读由该指令更新了的状态