第四章 处理器体系结构
4.1 Y86指令集体系结构
一、程序员可见的状态
程序员可见状态:程序中的每条指令都会读取或修改处理器状态的某些部分
*8个程序寄存器:%eax,%ecx,%edx,%ebx,%esi,%edi,%esp,%ebp.他们都可以存储一个字;
%esp被入栈、出栈、调用和返回指令作为栈指针;
其他情况时寄存器没有固定的含义或固定值
*PC(程序计数器):存放当前正在执行指令的地址。
*Stat:状态码,程序状态的最后一个部分,表明程序执行的总体状态,指示是正常运行还是出现了某种异常
二、Y86指令
指令集:P232图
*在movl指令中,指令名字的第一个字母就表明了源类型。指令第二个字母指明了目的类型。立即数(i)、寄存器(r)、存储器(m)。两个存储器传送指令中的存储器引用方式是简单地基址和偏移量形式。在地址计算中,不支持第二变址寄存器和任何寄存器值的伸缩。不允许从一个存储器地址直接传送到另一个存储器地址,也不允许将立即数传送到存储器。
*addl,subl,andl,xorl是四个整数操作指令,Y86中只允许对寄存器数据进行操作(IA32中还允许对存储器数据进行操作),这些指令会设置条件码ZF、SF、OF。
*call指令将返回地址入栈,然后跳到目的地址。ret指令从这样的过程调用中返回。
*pushl和popl指令实现了入栈和出栈。
三、指令编码
整数操作、分支指令、传送指令具体编码:P233图
程序寄存器标识符:P234图
*有的指令只有一个字节长,因为可能附加有寄存器指示符字节,指定一个或两个寄存器。这些寄存器字段为rA,rB。有则有,无则无,只有一个的则将第二个设为0xF。
*代码值1:命名为AOK,表示程序执行正常
*代码值2:命名为HLT,表示处理器执行了一条halt指令
*代码值3:命名为ADR,遇到非法地址
*代码值4:命名为INS,表示遇到了非法的指令
五、Y86程序和Y86指令详情
*Y86代码与IA32代码的主要区别在于,它可能需要多条指令来执行一条IA32指令所完成的功能。
*Y86没有伸缩寻址模式。
*创建Y86代码的唯一工具是汇编器。
4.2 逻辑设计和硬件控制语言HCL
一、逻辑门
*&& || !
二、组合电路和布尔表达式
*两个或多个逻辑门的输出不能连接在一起,否则可能会使线上的信号矛盾,导致一个不合法的电压或电路故障
*网必须无环
三、字级的组合电路和HCL整数表达式
*P245图
一些位级信号代表一个整数或一些控制模式。执行字级计算的组合电路根据输入字的各个位,用逻辑门来计算输出字的各个位。
四、集合关系
判断集合关系的通用格式:
Iexpr in {iexpr1,iexpr2,…,iexprk}
五、存储器和时钟
*时钟寄存器(简称寄存器)存储单个位或字,时钟信号控制寄存器加载输入值
*随机访问存储器(简称存储器)存储多个字,用地址来选择该读或该写哪个字
4.3 Y86的顺序实现
一、将处理组织成阶段
*取指:取指阶段从存储器读取指令字节,地址为程序计数器PC的值
*译码:译码阶段从寄存器文件读入最多两个操作数
*执行:在执行阶段,算数/逻辑单元要么根据ifun的值执行指令指明的操作,计算机存储器引用的有效地址,要么增加或减少栈指针
*访存:访存阶段可以将数据写入存储器,或从存储器读出数据
*写回:写回阶段最多可以写两个结果到寄存器文件
*更新PC:将PC设置成下一条指令的地址
*具体通用步骤:P252图
二、SEQ硬件结构和时序
*抽象视图:P258
三、SEQ阶段的实现
*取指阶段:取指阶段包括指令存储器硬件单元。
*译码和写回阶段:都要访问寄存器文件。
*执行阶段:执行阶段包括算术/逻辑单元(ALU)第一步每条指令的ALU计算,执行阶段还包括条件码寄存器。
*访存阶段:访存阶段的任务是读或者写程序数据,两个控制块产生存储器地址和存储器输入数据的值,另外两个块产生控制信号表明应该执行读操作还是写操作。当执行读操作时数据存储器产生值valM。
*更新PC阶段:SEQ中最后一个阶段会产生程序计数器的新值,依据指令的类型和是否要选择分支,新的PC可能是valC、valM、valP
!实验楼
p239
!遇到的问题
1.如何确定优先级的问题:比如对于指令pop%esp,E,M两个写端口会用到同一个地址,但是写入的数据又不一样,所以必须对两个端口设立一个优先级
!参考资料
1.最重要的当然是课本
2.参考了上周博客写得很好的几位同学的