20145227 《信息安全系统设计基础》第六周学习总结
20145227 《信息安全系统设计基础》第六周学习总结
第四章 处理器体系结构
4.1 Y86指令集体系结构
一、程序员可见的状态:
每条指令都会读取或修改处理器状态的某些部分,称为程序员可见状态。
1、8个程序寄存器:%eax,%ecx,%edx,%ebx,%esi,%edi,%esp和%ebp。
2、条件码:ZF(零)、SF(符号)、OF(有符号溢出)
3、程序计数器(PC):存放当前正在执行的指令的地址
4、存储器:很大的字节数组,保存着程序和数据。Y86系统用虚拟地址来引用存储器的位置,硬件和操作系统软件联合起来将虚拟地址翻译成实际或物理地址。
5、状态码(stat):表明程序执行的总体状态。(异常处理)
二、Y86指令
1、movl指令
IA32 movl指令:irmovl,rrmovl,mrmovl,rmmovl
(1)源操作数:i-立即数;r-寄存器;m-存储器
(2)目的操作数:r-寄存器;m-存储器
(3)指令附加的寄存器指示符字节依次是数据源(如果是立即数,把这一位设置成0xf)、目的寄存器/基址寄存器。
(4)有些指令需要附加四字节的常数字,采用小端法(倒序)编码
2、四个整数操作指令
- addl 加
- subl 减
- andl与
- xorl异或
三个条件码:
- ZF-零
- SF-符号
- OF-溢出
3、七个跳转指令——分支控制:
- jmp 直接跳转
- jle(SF^OF)|ZF 有符号数≤
- jl SF^OF 有符号<
- je ZF 相等/零
- jne ~ZF 不相等/非零
- jge ~(SF^OF) 有符号≥
- jg (SF^OF)&ZF 有符号>
根据分支指令的类型和条件码的设置来选择分支。
4、六个条件传送指令:
- cmovle
- cmovl
- cmove
- cmovne
- cmovne
- cmovg
与寄存器-寄存器传送指令rrmovl一样,但只有当条件码满足所需要的约束时才会更新目的寄存器的值。
5、call和ret:
- call:返回地址入栈,然后跳到目的地址;
- ret指令从这样的过程调用中返回。
6、pushl和popl:
入栈和出栈
7、halt:
停止指令的执行
三、指令编码
1、指令的字节级编码。每条指令需要1-6个字节不等。每条指令的第一个字节表明指令的类型。
该字节分为两个部分,每部分4位:高4位是代码部分,低4位是功能部分。功能值只有在一组相关指令共用一个代码时才有用。
2、整数操作:代码部分均为6,功能部分区分addl,subl,andl,xorl
分支指令:代码部分均为7
传送指令:代码部分均为2
3、8个程序寄存器当中,每个都有相应的0~7的寄存器标识符。
4、程序寄存器存在CPU中的一个寄存器文件中,这个文件就是一个小的、以寄存器ID作为地址的随机访问存储器。
5、有的指令只有一个字节,而有的需要操作数的指令编码更长一点,就可能有附加的寄存器指示符字节,指定一个或两个寄存器,这些寄存器字段为rA,rB
6、附加4字节的常数字:这个字作为irmovl的立即数数据,rmmovl和mrmovl的地址指示符的偏移量,以及分支指令和调用指令的目的地址。
四、Y86异常
1、状态码Stat可能取值
- AOK 正常操作
- HLT 处理器执行一条halt指令(指令停止)
- ADR 遇到非法地址
- INS 遇到非法指令
2、异常处理
Y86——处理器停止运行指令。
五、Y86程序
1、Y86和IA32的区别
1.需要多条指令来执行一条IA32指令所完成的功能
2.以“.”开头的词是编辑器命令
3.命令 .pos0告诉编辑器应该从地址0处开始产生代码,这个地址是所有Y86程序的起点
4.声明标号Steak,并用一个.pos命令指明地址0x100
4.2 逻辑设计和硬件控制语言HCL
电子电路中,用1.0V左右的高电压表示逻辑1,用0.0V左右的低电压表示逻辑0。
一、逻辑门
AND Y=a&&b
OR Y=a||b
NOT Y=!a
二、组合电路和HCL布尔表达式
很多逻辑门组合成一个网,构建计算块。构建这些网有两条限制。
1、两个或多个逻辑门的输出不能连在一起,否则可能会使线上的信号矛盾,导致一个不合法的电压或电路故障
2、这个网必须是无环的
三、字级的组合电路和HCL整数表达式
所有字级的信号都声明为int,并不指定字的大小
多路复用函数是用情况表达式来描述的,格式如下:
[
select_1 : expr_1
select_2 : expr_2
……
select_k : expr_k
]
从逻辑上讲,这些选择表达式是顺序求值的。
不同选择表达式之间允许不互斥.
四、集合关系
通用格式:iexpr in {iexpr1,iexpr2,...,iexprk}
其中被测值iexpr和待匹配的值iexpr1-iexprk均为整数表达式。
五、寄存器和时钟
- 组合电路简单的响应输入信号,产生等于输入的某个函数的输出,并存在状态在这个状态上进行计时,如此产生了时序电路。
- 随机访问存储器:存储多个字,用地址来选择应该读写哪个字。
- 时钟寄存器:存储单个位或字,时钟信号控制寄存器加载输入值。
- 硬件寄存器工作时,每当每个时钟到达上升沿时,值才会从寄存器的输入传送到输出。
- 寄存器文件读数据是一个地址为输入,数据为输出的组合逻辑块,写入字是由时钟信号控制的。
4.3 Y86的顺序实现
一、将处理组织成阶段
1、取指:从存储器读取指令字节,地址为程序计数器(PC)的值。指令指示符字节两个四位部分,称为icode(指令代码)和ifun(指令功能)。vaIP(下一条指令的地址)=PC+已取出指令的长度。
2、译码:从寄存器文件读入最多两个操作数,得到valA和/或valB。
3、执行:算数逻辑单元(ALU)根据ifun的值执行指令指明的操作,计算存储器引用的有效地址,或者增加或减少栈指针。得到的值称为valE。也可根据条件码执行跳转。
4、访存:将数据写入存储器,或者从存储器读出数据。读出的值为valM。
5、写回:最多可以写两个结果到寄存器文件。
6、更新PC:将PC设置成下一条指令的地址。
二、SEQ硬件结构
1、取指:将程序计数器寄存器作为地址,指令存储器读取指令的字节。PC增加器计算valP,即增加了的程序计数器。
2、译码:寄存器文件有两个读端口A和B,从这两个端口同时读寄存器的值valA和valB。
3、执行:根据指令类型将算数/逻辑单元(ALU)用于不同的目的。条件码寄存器有三个条件码位,ALU负责计算条件码的新值,当执行跳转指令时会根据条件码和跳转类型来计算分支信号Cnd。
4、访存:数据存储器读出或写入一个存储器字。指令和数据存储器访问的是相同的存储器位置,但用于不同的目的。
5、写回:寄存器文件有两个写端口,E用来写ALU计算出来的值,M用来写从数据存储器中读出来的值。
三、SEQ的时序
- 四个硬件单元:
程序计数器
条件码寄存器
数据存储器
寄存器文件
- 它们通过一个时钟信号来控制。
- Y86指令集的计算原则:处理器从来不需要为了完成一条指令的执行而去读由该指令更新了的状态.
四、SEQ阶段的实现
1、取指阶段,包括指令储存器硬件单元
2、译码和回写阶段
3、执行阶段,包括算数/逻辑单元
4、访存阶段,读或写程序数据
5、更新PC阶段
6、SEQ小结
四、实验
- 实验楼构建YIS环境:
- 运行make指令后:
- 此时查看目录下内容,可以看到只有.ys文件
- 用make all命令编译:
- 编译后再查看目录下内容,可以看到已经有编译后的.yo文件,用vim进入后可以查看:
- 教材p239页图4-7上的代码,在系统中叫做asuml.yo,把它的内容打印在屏幕上:
- 教材p251页图4-17,我自己建立了一个p251.ys进入后,输入代码,然后用make p251.yo编译,编译后用vim进入p251.yo:
本周代码托管链接
https://git.oschina.net/20145227/IS-Design-20145227/tree/master/ch06
本周代码总数
其他(感悟、思考等,可选)
本章主要学习了Y86指令集体系结构、逻辑设计和硬件控制语言HCL、Y86的顺序实现,根据教材上的详细图示我了解了Y86汇编程序与I32汇编程序的不同,掌握了Y86指令OP1、rrmovl、irmovl、rmmovl、mrmovl、pushl、popl等指令在顺序实现中的计算。这一章的内容总体学起来比较陌生,看起来很吃力,只能对着课本磕磕绊绊的去做,但是做的过程中会发现它并没有我们想象的那么难。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 0 | 2/2 | 20/20 | |
第二周 | 100/100 | 1/3 | 20/40 | |
第三周 | 200/300 | 1/4 | 22/62 | |
第五周 | 200/500 | 1/5 | 22/84 | |
第六周 | 274/774 | 1/6 | 22/106 |