第四章:处理器体系结构

ISA指令集体性结构——处理器支持的指令和指令的字节编码

HCL硬件控制语言—描述处理器设计

Y86——定义一个指令集体系结构,包括定义各种状态元素、指令集和他们的编码、一组编程规范和异常事件处理。

一、Y86指令集体系结构

(一)程序员可见的状态

1.Y86程序

每条指令都会读取或修改处理器状态的某些部分

2.程序员

可以是用汇编代码写程序的人,也可以是产生机器级代码的编译器。

3.处理器状态(类似于IA32)

①8个程序寄存器,%eax,%ecx,%edx,%ebx,%esi,%edi,%esp,%ebp

②处理器的每个程序寄存器存储一个字

③寄存器%esp被入栈、出栈、调用和返回指令作为栈指针。在其他情况下,寄存器没有固定的含义或固定值。

④有三个一位的条件码:ZF,SF,OF,它们保存最近的算术或洛基指令所造成英雄的有关信息。

***Y86程序可以用来访问和修改程序寄存器,条件码,程序计数器(pc)和存储器

*** 状态码指明程序是否运行正常后者发生了某个特殊事件

4.存储器

Y86程序用虚拟地址来引用存储器位置,硬件和操作系统软件联合起来将虚拟地址翻译成实际或物理地址

指明数据实际保存在存储器那个位置

5.状态码stat

它表明程序执行的总体状态,会指示是正常运行还是出现了某种异常。

(二)Y86指令

Y86指令集基本上是IA32指令集的一个子集

1.四种movl指令

irmovl,rrmovl,mrmovl,rmmovl

格式:指令 源操作数 目的操作数。

(1)源操作数可以是立即数i、寄存器r、存储器m

(2)目的操作数可以是寄存器和存储器

特别注意:**这里的存储器引用方式是简单的基址和偏移量形式,寻址方式不支持第二变址寄存器和任何寄存器值的伸缩

****两个操作数不能都是来自存储器,也不允许将立即数传送到存储器

2.四个整数操作指令

addl  subl andl xorl

只对寄存器数据进行操作(IA32允许对存储器数据进行这些操作)。

指令会设置三个条件码:ZF零 SF符号 OF溢出

3.七个跳转指令

jmp 、 jle 、jl 、jne 、jge 、jg

(见书本图3-12)

4.六个条件传送指令

cmovle、cmovl、cmove、cmovne、cmovge、cmovg

这些指令的格式与寄存器-寄存器传送指令rrmovl一样,但是只有当条件码满足所需要的约束时,才会更新目的寄存器的值。

5.call和ret

call指令将返回地址入栈,然后跳到目的地址

ret指令从这样的过程调用中返回。

6.pushl和popl:实现入栈和出栈

7.halt指令

与IA32的hlt指令类似,但是IA32的应用程序不允许使用这条指令,因为它会导致整个系统暂停运行

对于Y86来说,halt指令停止指令的执行,执行此指令会导致处理器停止,并将状态码设置为HLT。

(三)指令编码

1.字节级编码

每条指令表明指令的类型,每部分四位,分为两部分

高四位为代码部分,低四位为功能部分

当需要指明不应访问任何寄存器时,用ID值0xF表示

 2.额外的字节

指定一个或两个寄存器,例如rA或者rB

没有寄存器操作数的指令,例如分支指令和call指令,就没有寄存器指示符字节。

只需要一个寄存器操作数的指令(irmovl,pushl,popl)将另一个寄存器指示符设为0xF

3.附加的4字节常数字

irmovl的立即数数据2.rmmol和mrmovl的地址指示符的偏移量3.分支指令和调用指令的目的地址

注意事项

分支指令和调用指令的目的地址是一个绝对地址

所有整数采用小端法编码

(四)Y86 异常

1.状态码Stat取值:Stat描述程序执行的总体状态

名字

含义

1

AOK

正常操作

2

HLT

处理器执行halt命令

3

ADR

遇到非法地址

4

INS

       遇到非法指令 

注意:Y86 出现异常时,会让处理器体制执行命令;调用异常处理机制

(五)Y86程序

(1)Y86代码和I32代码的多条指令主要区别在于:Y86需要多条指令来执行一条I32指令所完成的功能

(2)命令指明应该将代码或数据放在什么位置,以及该如何对齐

(3)以“.”开头的是汇编器命令

(4)创建Y86代码的唯一工具是汇编器,所以程序员必须执行本来通常交给编译器、链接器和运行时系统来完成的任务。

详细参考书本:1、P237-238图4-6的IA32和Y86汇编代码

2、p239-240图Y86汇编代码编写和YAS汇编器的输出的例子(YIS指令集模拟器)

(六)一些Y86指令的详情

在压入/弹出栈指针%esp的时候,popl和pushl有两种不同的约定:

1.压入/弹出%esp的原始值

2.压入/弹出%esp-/+4后的值

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

电子电路中,用1.0V左右的高电压表示逻辑1,用0.0V左右的低电压表示逻辑0.

(一)逻辑门

1.逻辑门产生的输出:等于它们输入位值的某个布尔函数。

2.对应的HCL表达式:

AND 用&&表示

OR 用||表示

NOT 用!表示

3.注意:逻辑门只对单个位的数进行操作,而不是整个字。

逻辑门总是活动的,输入变化输出很快就跟着变化。

参考C语言中运算符(2.1.9节)

(二)组合电路和HCL布尔表达式

1.构建计算块(称为组合电路)的限制

①两个或多个逻辑门的输出不能连接在一起

②必须无环

2.组合逻辑电路和c语言中逻辑表达式的区别

①组合电路的输出会持续响应输入变化,c语言表达式只有在执行过程中被遇到才求值

②逻辑门只对0和1操作,c语言表达式中参数可以是任意整数,0是FALSE,不是0的都是TRUE

③C 的逻辑表达式有个属性就是他们可能只被部分求值

(三)字级的组合电路和HCL整数表达式

1.关于HCL的几点说明

HCL中所有字级的信号都声明为int;

在画字级电路的时候,用中等粗度的线表示携带字的每个位的线路,用虚线来表示布尔信号的结果

在HCL中,表示默认情况(即所有条件都没有被选中的情况)一般用1

2.多路复用函数的情况表达式描述

[

select_1 : expr_1

select_2 : expr_2

.......

select_k : expr_k

]

从逻辑上讲,这些选择表达式是顺序求值的。

(四)集合关系

判断集合关系的通用格式是:

iexpr in {iexpr1,iexpr2,...,iexprk}

注意:被测试的值iexpr和带匹配的值iexprk等都是整数表达式

(五)存储器和时钟

时序电路两类存储器设备:

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

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

三.Y86的顺利实现

SEQ顺序处理器:实现一个高效的、流水线化的处理器

(一)将处理组织成阶段

1.基本阶段:

  • 取指
  • 译码
  • 执行
  • 访存
  • 写回
  • 更新PC

不同Y86指令在各个阶段的处理:

(1)Y86指令针对OPl(整数和逻辑运算),rrmovl(寄存器-寄存器传送)和irmovl(立即数-寄存器传送)在顺序实现中的计算

  • 其他指令详细内容见书250页-257页

(二)、SEQ硬件结构

硬件单元是与各个处理阶段相关联,有六个基本阶段(详细看p258-259)

(三)SEQ的时序

(1)要控制处理器中活动的时序,只需要寄存器和存储器的时钟控制

(2)除了指令存储器只用来读指令故而可以看作组合逻辑之外,剩余的程序计数器、条件码寄存器、数据存储器和寄存器文件需要通过一个时钟信号来控制(控制时序)

(3)每个时钟周期内,程序计数器都会装载新的指令地址;只有执行整数运算指令的时候,才会装载条件码寄存器。只有执行rmmovl,pushl,call时,才会写数据存储器。

(4)Y86指令集的本质遵循这样一项组织原则:处理器从来不需要为了完成一条指令的执行而去读由该指令更新了的状态

(四)SEQ阶段的实现

HCL描述中使用的参数值(这些值表示的是指令参数、功能码、寄存器ID、ALU操作和状态码 的编码)

nop指令:只是简单地经过各个阶段,除了PC+1,不进行任何处理

halt指令:使处理器状态被设置为HLT,导致处理器停止运行

1.取指阶段

2.译码和写回阶段

根据四个端口的情况,判断应该读哪个寄存器产生信号valA、valB

3.执行阶段

(1)包括算术/逻辑单元ALU,输出的是valE。

ALU常被用作加法器

(2)包括条件码寄存器

零,符号,溢出,产生信号set_cc

4.访存阶段

任务:读或者写程序数据。

两个数据块产生存储器地址和存储器输入证据的值,两个产生控制信号表明应该是读还是写。

5.更新PC阶段

最后一个阶段会产生程序计数器的新值

实验

构建YIS环境:

cd ~/Code/shiyanlou_cs413
wget http://labfile.oss.aliyunce.com/courses/413/sim.tar
tar -xvf sim.tar
cd sim
sudo apt-get install tk
sudo ln -s  /usr/lib/x86_64-linux-gnu/libtk8.6.so /usr/lib/libtk.so
sudo ln -s  /usr/lib/x86_64-linux-gnu/libtk8.6.so /usr/lib/libtk.so


YIS测试:

cd y86-code

进入测试代码,教材p239页代码为asuml.ys,可以通过

make asuml.yo

进行汇编,asuml.yo就是汇编后的结果,见教材p238。

make all

可以汇编运行所有代码结果。

参考资料

1.《深入理解计算机系统》教材第四章《处理器体系结构》

2.https://www.shiyanlou.com/courses/413 实验楼《深入理解计算机系统》实验五——处理器体系结构

3.https://www.shiyanlou.com/courses/413 实验楼《深入理解计算机系统》实验四——程序的机器级表示(复习)

4.信息安全系统设计基础@BESTI小组博客园:20135313吴子怡实验楼实验五YIS构建操作问题 http://group.cnblogs.com/103791/

5.  IA32 and x86-64 Documentation和Y86 Tools

转载于:https://www.cnblogs.com/20135223heweiqin/p/4889491.html

20135223何伟钦—信息安全系统设计基础第六周学习总结相关推荐

  1. 20135223何伟钦—信息安全系统设计基础第七周学习总结

    第六章 存储器层次结构 [学习时间:6小时] [学习任务:<深入理解计算机系统>第六章] 6.1存储技术 6.1.1随机访问存储器 分为两类:静态(SRAM)和动态(DRAM). (1)S ...

  2. 20135223何伟钦—信息安全系统设计基础第五周学习总结

    第三章 程序的机器级表示 一.历史观点 Intel处理器(X86) 二.程序编码 gcc -01 -o p p1.c p2.c ①编译选项-01 表示编译器使用第一级优化 ②编译选项-02 表示编译器 ...

  3. 信息安全系统设计基础第六周学习总结—20135227黄晓妍

    第四章 ISA 指令集体系统结构:一个处理器支持的指令和指令的字节级编码. 不同的处理器家族有不同的ISA. Y86 本章定义的一个简单的指令集.包括各种状态元素.指令和它们的编码.一组编程规范和异常 ...

  4. # 2017-2018-1 20155224 《信息安全系统设计基础》第九周学习总结

    2017-2018-1 20155224 <信息安全系统设计基础>第九周学习总结 教材学习内容总结 存储器 随机访问存储器(RAM): 静态RAM:用来作为高速缓存存储器,每个位存储在一个 ...

  5. 2018-2019-1 20165206 《信息安全系统设计基础》第九周学习总结

    - 2018-2019-1 20165206 <信息安全系统设计基础>第九周学习总结 - 教材学习内容总结 计算机系统的主存被组织成一个由M个连续的字节大小的单元组成的数组.每个字节都有一 ...

  6. 20135203齐岳 信息安全系统设计基础第十三周学习总结

    20135203齐岳 信息安全系统设计基础第十三周学习总结 学习计时:8/9共小时(计划/实际) 读书:4/5 代码:1/1 作业:1/1 博客:2/2 第十二章 并发编程 一.学习目标 掌握三种并发 ...

  7. # 20155337 2017-2018-1 《信息安全系统设计基础》第一周学习总结

    20155337 2017-2018-1 <信息安全系统设计基础>第一周学习总结 教材学习内容总结 1.1信息就是位+上下文 hello.c程序是以字节序列的方式储存在文件中的.每个字节都 ...

  8. 20135219洪韶武——信息安全系统设计基础第五周学习总结

    信息安全系统设计基础第五周学习总结 学习任务:教材第四章[处理器体系结构] 学习时间:10小时  一.教材知识点梳理[4.1-4.3] 1.ISA[指令集体系结构] 一个处理器支持的指令和指令的字节级 ...

  9. 20145227《信息安全系统设计基础》第一周学习总结

    20145227<信息安全系统设计基础>第一周学习总结 学习内容总结 Linux是一个操作系统.如果使用GUI,Linux和Windows没有什么区别.Linux学习应用的一个特点是通过命 ...

最新文章

  1. ArcGIS Engine开发-TOCControl中实现图层的拖放
  2. CNN 与 LSTM 模型复杂度分析
  3. [OS复习]存储管理2
  4. 初窥wireshark fiddler等抓包工具及部分实现分析
  5. java 模块 分工_Java秒杀系统实战系列~构建SpringBoot多模块项目
  6. IMPDP导入实例(oracle)
  7. 调试nodejs项目接口,使用Posman,用req.body拿不到数据
  8. 设计模式8(享元模式,解释器模式)
  9. python从文件初始化失败_iOS 6:libpython2.7.a初始化导入错误
  10. 10分钟搞懂:亿级用户的分布式数据存储解决方案!
  11. 我的docker随笔15:MySQL启动时自动创建数据库
  12. 隐藏在你电脑里面的电影
  13. Asp.net直接保存文件到客户端
  14. Lwip协议netif结构体详解
  15. VC++ IE缓存管理研究
  16. linux转录组kegg注释,蛋白质组学KEGG注释详解
  17. SCCM 2012 R2部署,SCCM配置(五)
  18. 教师计算机技能培训方案,教师计算机技能培训方案
  19. 阴暗的底层阶级版罗密欧与朱丽叶——甲贺忍法帖
  20. 个人笔记使用(wolai,OneNote)

热门文章

  1. c语言中键盘标点符号怎么输入,C语言中怎么输入带标点符号的一句话
  2. Java并发编程(五):计算机基础-机器语言、高级语言和操作系统
  3. 金融学考研和计算机考研难度,考研难度专业排行榜!你这些专业知道吗?
  4. 机器学习(周志华) 第十二章计算学习理论
  5. WPF中使用浏览器控件WebBrowser
  6. 什么是 I18N 和 L10N ?
  7. java getpath()_Java File getAbsolutePath()方法
  8. AIX 存储挂载MPIO多路径配置问题导致磁盘无法使用
  9. 程序员面试金典--笔记(精华篇)
  10. 上海亚商投顾:沪指延续调整 机器人概念股掀涨停潮