《深入理解计算机系统》第六周学习笔记

第四章 处理器体系结构

(一)知识点总结

一、Y86指令集体系结构

  1.Y86处理器状态类似于IA32,有8个程序寄存器:

  %eax、%ecx、%edx、%ebx、%esi、%edi、%esp、%ebp。处理器的每个程序寄存器存储一个字。%esp被入栈、出栈、调用和返回指令作为栈指针。

  2.3个一位的条件吗:ZF、SF、OF,它们保存最近的算术或逻辑指令所造成影响的有关信息。程序计数器PC存放当前正在执行指令的地址。

  3.程序状态的最后一个部分是状态码stat,它表明程序执行的总体状态

  4.Y86指令集如下(所有数值都用十六进制表明)

  

  5.IA32的movl指令:irmovl、rrmovl、mrmovl、rmmovl。指令名字第一个字母代表源的类型。源可以是立即数(i)、寄存器(r)、存储器(m),目的可以是寄存器(r)、存储器(m)

  6.两个存储器传送指令中的存储器引用方式是基址和偏移量形式

    ①4个整数操作指令:addl、subl、andl、xorl

    ②7个跳转指令:jmp、jle、jl、je、jne、jge、jg

    ③6个条件传送指令:cmovle、cmovl、cmove、cmovne、cmovge、cmovg

    ④Halt指令停止指令的执行

  7.指令编码

    ①每条指令需要1—6个字节不等。每条指令的第一个字节表示指令的类型,这个字节分为两个部分,每部分4位:高4位是代码部分,低4位是功能部分

  

    ②rrmovl与条件传送有同样的指令代码,可以看做“无条件传送”,jmp是“无条件跳转”,它们的功能代码都是0.

    ③8个寄存器对应的0-7寄存器标识符

    

    ④可能有附加的寄存器指示符字节,指定一个或两个寄存器,这些寄存器字段为rA、rB。

    ⑤有些指令要一个附加的4字节常数字,能作为irmovl的立即数数据,rmmovl和mrmovl的地址指示符的偏移量,以及分支指令和调用指令的目的地址(是绝对地址)。所有整数采用小端法编码,当指令按照反汇编格式书写时,这些字节以相反顺序出现。

  8.Y86异常

  

  以“.”开头的词是汇编器命令,它们告诉汇编器调整地址,以便在那里产生代码或插入一些数据

  9.信息= 位+上下文。  第4章,位(串)就是Y86机器码,上下文就是图4-2,信息就是Y86指令集。

二、逻辑设计和硬件控制语言HCL

  1.逻辑门:&&、|| 、!

  2.组合电路:很多逻辑门组合成一个网,构建计算块。构建这些网有两条限制

    ①两个或多个逻辑门的输出不能连接在一起,否则可能会使线上的信号矛盾,导致一个不合法的电压或电路故障

    ②网必须无环

  3.字级的组合电路和HCL整数表达式

  一些位级信号代表一个整数或一些控制模式。执行字级计算的组合电路根据输入字的各个位,用逻辑门来计算输出字的各个位。

  4.多路复用器:根据输入控制信号的值,从一组不同的数据信号则选出一个。多路复用函数是用情况表达式描述的。

  5.算数/逻辑单元是很重要的组合电路,有三个输入,标号为A、B的两个数据输入和一个控制输入。根据控制输入的设置,电路会对数据输入执行不同的算数或逻辑操作。

  6.判断集合关系的通用格式

  Iexpr in {iexpr1,iexpr2,…,iexprk}

  7.两类存储器设备

    ①时钟寄存器(简称寄存器)存储单个位或字,时钟信号控制寄存器加载输入值

    ②随机访问存储器(简称存储器)存储多个字,用地址来选择该读或该写哪个字

  8.Y86处理器会用时钟寄存器保持程序计数器(PC)、条件代码(CC)、程序状态(Stat)

  9.寄存器文件有两个读端口(A、B)还有一个写端口(W),多端口随机访问存储器允许同时进行多个读和写操作。

三、Y86的顺序实现

  1.将处理组织成阶段

    ①取指:取指阶段从存储器读取指令字节,地址为程序计数器PC的值

    ②译码:译码阶段从寄存器文件读入最多两个操作数

    ③执行:在执行阶段,算数/逻辑单元要么根据ifun的值执行指令指明的操作,计算机存储器引用的有效地址,要么增加或减少栈指针

    ④访存:访存阶段可以将数据写入存储器,或从存储器读出数据

    ⑤写回:写回阶段最多可以写两个结果到寄存器文件

    ⑥更新PC:将PC设置成下一条指令的地址

  2.执行rrmovl指令和执行算术运算类似,不过不需要取第二个寄存器操作数。将ALU的第二个输入设为0,先把它和第一个操作数相加,得到valE=valA,然后再把这个值写到寄存器文件。

  3.对irmovl的处理与上类似,除了ALU的第一个输入为常数值valC。因为是长指令格式,对于irmovl,程序计数器必须加6。所有这些指令都不改变条件码

  4.pushl指令开始时很像前面讲过的指令,但在译码阶段,用%esp作为第二个寄存器操作数的标识符,将栈指针赋值为valB。在执行阶段用ALU将栈指针减4,减过4的值就是存储器写的地址,在写回阶段还会存到%esp中。

  5.popl指令的执行与pushl的执行类似,除了在译码阶段要读两次栈指针以外。popl应该首先读存储器,然后再增加栈指针。

  6.call指令、ret指令和pushl、pop类似。指令call:将call指令后面跟着的那条指令的地址valP压入栈中,在更新PC阶段将PC设为调用目的地valC。指令ret:在更新PC阶段,将从栈中取出的值valM赋值给PC。

  7.SEQ的实现包括组合逻辑和两种存储器设备:时钟寄存器、随机访问存储器。

  8.需要对时序进行明确控制的四个硬件单元——程序计数器、条件码寄存器、数据存储器、寄存器文件。

  9.计算原则:处理器从不需要为了完成一条指令的执行而去读由该指令更新了的状态。在时钟上升开始下一个周期时,处理器就可以同时执行寄存器写和存储器写。

  有些指令(整数运算)会设置条件码,有些指令(跳转指令)会读取条件码,但没有指令必须既设置又读取条件码。虽然到时钟上升开始下一个周期时才会设置条件码,但是在任何指令试图读之前,它们都会更新。

  10.常用常数

  11.SEQ阶段的实现

    ①取指阶段

    取指阶段包括指令存储器硬件单元。以PC作为第一个字节(字节0)的地址,这个单元一次从存储器读出6个字节,第一个字节被解释称指令字节,分为两个4位数。标号为“icode”和“ifun”的控制逻辑块计算指令和功能码等于从存储器读出值,或者当指令地址不合法时(imem_error指明),这些值对应于nop指令

    ②译码和写回阶段

    都要访问寄存器文件。寄存器文件有四个端口,支持同时进行两个读(端口A、B)和两个写(E、M),每个端口都有一个地址连接和一个数据连接。根据指令代码icode以及寄存器指示值rA和rB,可能还会根据执行阶段计算出的Cnd条件信号。

    ③执行阶段

    执行阶段包括算术/逻辑单元(ALU)第一步每条指令的ALU计算,执行阶段还包括条件码寄存器

    ④访存阶段

    访存阶段的任务是读或者写程序数据,两个控制块产生存储器地址和存储器输入数据的值,另外两个块产生控制信号表明应该执行读操作还是写操作。当执行读操作时数据存储器产生值valM

    ⑤更新PC阶段

    SEQ中最后一个阶段会产生程序计数器的新值,依据指令的类型和是否要选择分支,新的PC可能是valC、valM、valP

(二)实验过程

构建YIS环境:

YIS测试:

cd y86-code进入测试代码,教材p239页代码为asuml.ys,可以通过make asuml.yo进行汇编,asuml.yo就是汇编后的结果

make all可以汇编运行所有代码结果:

(三)参考资料

  1.《深入理解计算机系统》

  2.《嵌入式Linux应用程序开发标准教程》

  3.《Y86 Tools》

(四)学习感想及总结

  本章主要学习了Y86指令集体系结构、逻辑设计和硬件控制语言HCL、Y86的顺序实现,根据教材上的详细图示我了解了Y86汇编程序与I32汇编程序的不同,掌握了Y86指令OP1、rrmovl、irmovl、rmmovl、mrmovl、pushl、popl等指令在顺序实现中的计算。在构建YIS环境的实验中,我一开始也遇到了不能解析命令地址这个问题。在老师把外网地址修改成内网地址之后就成功地连接到了主机,不过实验最后显示make:***[all]错误,我不知道这个什么错误以及错误原因,望老师指正。

时间: 2024-10-03 21:07:41

《深入理解计算机系统》第六周学习笔记的相关文章

《Linux内核分析》第六周学习笔记

<Linux内核分析>第六周学习笔记 进程的描述和创建 郭垚 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 [学习视频时间:1小时 撰写博客时间:2小时] [学习内容:进程创建的过程.使用gdb跟踪分析内核处理函数sys_clone] 一.进程的描述 1.1 进程描述符task_struct数据结构(一) 1. 进程控制块PCB——task_struct 为了管理进程,内核

软件测试第六周学习笔记之“Win8 APP应用程序的白盒测试”

这周的学习笔记我想写点自己关于实验中碰到的问题和感想. 因为这次做的是白盒测试,所以我决定去测试一下上回测试的app的功能函数. 这次我用的是单元测试项目来做的白盒测试: 创建单元测试的步骤: 1.点击 “文件”->“添加”->“新建项目” 2.选择 windows应用程序-> 单元测试项目 3.在解决方案资源管理器中为单元测试项目下的引用上右击选择添加引用 4.选择解决方案下的项目中的用来测试的win8应用 接下来是单元测试的代码部分的编写了: 我要测试的是该项目中的一个字符串转化编码

第十六周学习笔记

本周的学习笔记主要关于MY SQL日志 1.查询日志是否开启 2.查看慢查询日志 3.查看二进制日志 4.删除所有二进制日志文件 RESET MASTER; 5.只删除部分二进制日志文件 PURGE MASTER LOGS; 原文地址:https://www.cnblogs.com/lzy35/p/8111445.html

Linux内核分析——第六周学习笔记

进程的描述和进程的创建 前言:以下笔记除了一些讲解视频中的概念记录,图示.图示中的补充文字.总结.分析.小结部分均是个人理解.如有错误观点,请多指教! PS.实验操作会在提交到MOOC网站的博客中写.

Linux内核分析——第六周学习笔记20135308

第五周 进程的描述和进程的创建 一.进程描述符task_struct数据结构 1.操作系统三大功能 进程管理 内存管理 文件系统 2.进程控制块PCB——task_struct 也叫进程描述符,为了管理进程,内核需要对每个进程进行描述,它就提供了内核所需了解的进程信息. struct task_struct数据结构很庞大,1235行~1644行 3.Linux进程状态 Linux进程的状态与操作系统原理中的描述的进程状态有所不同 操作系统状态: 就绪态 运行态 阻塞态 linux进程状态: 4.

《机电传动控制》第六周学习笔记

这门课与之前学习的课程的联系: 1.首先这门课有两门基础的课程,就是<大学物理>和<电路基础>,通过这两门课程的学习基础,才能去理解<机电传动控制>课程内的一些原理性内容.比如说对直流电动机电路的分析,以及对三相交流电机的分析 ,这在之前的课程里都有提到过,因此有十分紧密的联系. 2.这门课学习的知识可以运用到<数控技术>中,如数控机床中经常会用到步进电机和伺服电机,因此学好电机,方便对数控机床进行理解. 3.这门课的学习与<工程控制理论>这门课

《深入理解计算机系统》第四周学习笔记

一.知识点总结 1.信息存储 练习题2.4 0x503c+0x8=0x5044 0x503c-0x40=0x4ffc 0x503c+64=0x503c+0x40=0x507c 0x50ea-0x503c=0xae 1)字长:指明整数和指针数据的标称大小.一个字长为w的机器的虚拟地址范围为0~2^(w-1),程序最多访问2^w个字节 int .char 4字节,单精度float 字节,双精度double 8字节 2)小端法:最低有效字节在最前面的顺序存储 大端法:最高有效字节在最前面的顺序存储 练

深入理解计算机系统之存储器层次结构学习笔记

一.存储技术 (一)随机访问存储器 随机访问寄存器(RAM)分为静态随机访问寄存器(SRAM)和动态随机访问寄存器(DRAM).静态RAM可以作为高速缓存寄存器,动态RAM可以用作主存以及图形系统的帧缓冲区.静态RAM将每一个位存储在一个双稳态的存储器单元里,构成静态RAM 的电路可以无限期的保持在两个不同的电压配置或状态之一.动态RAM将每一个位存储为对电容的充电,所以动态RAM要比静态RAM对干扰的敏感度更高.构成动态RAM的电路被干扰后就不会恢复了. 1 传统的DRAM 常规DRAM芯片中

机电传动控制第六周学习笔记——《机电传动控制》和其他课程的联系

机电传动控制就目前学习的情况来看电学方面的东西比较多,但是与其他非电类的课程也有很多联系. 1.电机原理的部分主要是和基础物理学里面的内容有很大关系,比如电磁感应,楞次定律等等,从基础的物理原理讲起: 2.进入控制部分以后我们见到了很多电机,建模的时候有数学建模的思想,利用自定义的参数的变化得到电机随时间的运行状况仿真,并通过探讨这些参数的敏感性牺牲不敏感参数找到整体的最优解: 3.编程的思想和C语言很类似.逻辑性和面向过程编程都很重要: 4.控制时使用的继电器-接触器控制电路与电路的分析很类似