20145316 《信息安全系统设计基础》第六周学习总结
教材学习内容总结
第四章 处理器体系结构
4.1 Y86指令集体系结构
Y86是ISA的一个子集
- 可见状态: 寄存器、存储器、条件码、PC、程序状态。
- 寄存器:8个,每一个寄存器可以存储一个字,也就是一个32位二进制。
条件码:一个一位二进制的寄存器,保存着最近的算术或逻辑运算所造成的影响的信息。 - PC:程序计数器,记录当前正在执行的指令的地址。
- 存储器:很大的字节数组,保存着程序和数据,用虚拟地址来访问存储器,硬件和操作系统会将虚拟地址翻译为实际的(或物理)地址。
- 状态码:stat表明程序执行的总体状态(正常还是出现某种异常)。
指令
- xxmovl:数据传送指令,其中r代表寄存器,m代表存储器,i代表立即数。比如rrmovl指令,则代表将一个寄存器的值,赋给另外一个寄存器。(不允许:存储器地址直接传给存储器地址;立即数传给存储器。)
- opl:操作指令,只对寄存器数据进行操作,设置三个条件码zf、sf、of。
- jxx:条件跳转指令,根据分支指令类型和条件码设置进行跳转。
- cmovxx:条件传送指令,后面的xx代表的是条件。(只发生在两个寄存器之间,不会将数据传送到存储器。)
- call:将返回地址入栈,并跳到目标地址。
- ret:将返回地址入PC,并跳到返回地址。
- push与pop:入栈和出栈操作。
- halt:终止指令的执行。(处理器停止,并将状态码设置成HLT。)
指令编码
- 指令的字节级编码规则:高4位为代码部分,低四位为功能部分,功能值只有在一组相关指令共用一个代码时才有用。
- 8个程序寄存器当中,每个都有相应的0~7的寄存器标识符。程序寄存器存在CPU中的一个寄存器文件中,这个文件就是一个小的、以寄存器ID作为地址的随机访问存储器。
- 附加寄存器指示符字节:指定一个或者两个寄存器。
- 附加4字节的常数字:作为irmovl的立即数数据,rmmovl和mrmovl的地址指示符的偏移量,以及分支指令和调用指令的目的地址。
Y86异常
状态码stat:描述程序执行的总体状态
1 AOK,正常操作
2 HLT,处理器执行halt指令
3 ADR,遇到非法地址
4 INS,遇到非法指令
遇到异常,处理器停止执行指令。
Y86代码与IA32代码主要区别:
Y86需要多条指令来执行一条IA32指令完成的功能。
Y86没有伸缩寻址模式。YIS:指令集模拟器,目的是模拟Y86机器代码程序的执行。
4.2 逻辑设计和硬件语言HCL
- 数字系统由三部分组成:组合逻辑、存储器元素、时钟信号。
- HCL:硬件控制语言,描述不同处理器设计的控制逻辑。
逻辑门
- HCL表示与、或、非:
a&&b
、a||b
、!a
。每个门产生的输出等于他输入的某个布尔函数。 - 将很多逻辑门组合成一个网,就能构建计算块,称为组合电路。
- 限制:两个及以上逻辑门的输出不能连接在一起(会产生信号矛盾)。
- 网必须是无环的,不可以有路径经一系列门而形成回路。
- 检测位相等:
bool eq=(a&&b)||(!a&&!b)
。 - MUX:多路复用器,根据输入控制信号的值,从一组不同的数据信号中选出一个。
bool out=(s&&a)||(!a&&b)(s是控制信号)
。
存储器和时钟
- 组合电路从本质上讲,不存储任何信息。它们只是简单地响应输入信号,产生等于输入的某个函数的输出。
- 为了产生时序电路,也就是有状态并且在这个状态上进行计算的系统,我们必须引入按位存储信息的设备。
- 存储设备都是由同一个时钟控制,时钟是一个周期性信号,决定了什么时候要把新值加载到设备中。
- 大多数时候,寄存器都保持在稳定状态(x),产生的输出等于它的当前状态。信号沿着寄存器前面的组合逻辑传播,这时,产生了一个新的寄存器输入(y),但只要时钟是低电位的,寄存器的输出就仍然保持不变。当时钟变成高电位的时候,输入信号才加载到寄存器中,成为下一个状态y,直至下一个时钟的上升沿。
- 寄存器是作为电路不同部分中的组合逻辑之间的屏障。每当每个时钟到达上升沿时,值才会从寄存器的输入传送到输出。
4.3 Y86顺序实现
各阶段及其内执行操作
取指
从存储器读取指令字节,放到指令存储器(CPU中)中,地址为程序计数器(PC)的值。
按顺序的方式计算当前指令的下一条指令的地址(即PC的值加上已取出指令的长度)译码
从寄存器文件读入最多两个操作数。读入指令rA、rB字段指明的寄存器。执行
根据指令的类型,将算数/逻辑单元(ALU)用于不同的目的。
计算增加或减少栈指针;
计算有效地址;
只是简单地加0,将一个输入传递到输出;
也可能设置条件码;访存
将数据写入存储器;或从存储器读出数据。
数据存储器(CPU中)读出或写入一个存储器字。指令和数据存储器访问的是相同的存储器位置,但是用于不同的目的。写回
最多可以写两个结果到寄存器文件。
寄存器文件有两个写端口。端口E用来写ALU计算出来的值,而端口M用来写从数据存储器中读出的值。更新PC
将PC设置成下一条指令的地址。
SEQ时序
- SEQ的实现包括:组合逻辑和两种存储器设备
时钟寄存器:程序计数器、条件码寄存器
随机访问存储器:寄存器文件、指令存储器、数据存储器 - 需要用时序进行明确控制:程序计数器、条件码寄存器、寄存器文件、数据存储器。
- 每个时钟周期,程序计数器都会装载新的指令地址。
只有在执行整数运算指令时,才会装载条件码寄存器。
只有在执行mov、push、call指令时,才会写数据存储器。
Y86模拟器的安装
实验楼安装Y86模拟器
- 实验楼的安装比较顺利,按照娄老师在实验楼编写的教程做就好。
完成。虚拟机Ubuntu平台上安装Y86模拟器
- 我的虚拟机Y86模拟器安装过程比较曲折,虽然有十分完备的教程,但还是因为自己的粗心出了问题,问题截图如下。
- 因为发现找不到指令
yas
,还尝试过重新配置环境变量 - 后来找到了问题所在,发现
bixon flex
词法分析工具没有安装,从头再来一遍,完成。教程大家都写得比较完整,在此不做赘述,只演示一下过程截图。
代码的调试与运行
- p240 4.1.5中的Sum代码
- p241 练习题4.5中自己编写的AbsSum代码
- p251示例中的代码
课后习题的解答
p234 4.1
- 4.1和4.2都考察了指令编码,难度不大。对照前面的表格做就可以。但要注意
按字节反序
和负数的表示方法
。
p235 4.2
p241 4.5
- 本题考察了大家写汇编代码的能力。要理解AbsSum和Sum的区别就在于多了一个将负数取相反数的过程(注释#部分为添加部分)。同时注意,题目要求用
条件传送指令
,就是cmovXX
。
p241 4.6
- 由课本知识得,当执行pushl%esp指令时,处理器的行为有两种约定:1)压入%esp的原始值,2)压入减去4得%esp的值。
subl是减法指令,用于做两个数之间的比较。这个减法结果为0告诉我们压入栈中的值是起始值。
p244 4.8
先写出xor的HCL表达式:
bool xor=(!a&&b)||(a&&!b)
;很明显,这个式子与上述eq表达式互补。p247 4.10
int Mid3 = [
A<=C && A>=B :A;
A<=B && A>=C :A;
B<=A && B>=C :B;
B<=C && B>=A :B;
1 :C;
];这道题很简单,冒号前面是条件,冒号后面是输出结果,回忆一下大二上HDL硬件描述语言的知识。
p253 4.11
- 4.11,4.12,4.16这三道题题型类似,意在分析某一指令在处理器中的具体实现过程,找到规律就不难。
通用
一列规则已给出,直接在具体
那一列套具体数值即可。 - 我做这几道题的时候都进行了
查指令编码表
的操作,比如下面这张表: - 答案
p255 4.12
p257 4.16
p264 4.17
bool need_valC =
icode in {IIROMVL,IRMMOVL,IMRMOVL,IJXX,ICALL};
家庭作业
4.48
取指阶段 icode:ifun=M1[PC]=C:0
rA:rB<-M1[PC+1]
valC<-M4[pc+2]
valP<-PC+6
译码阶段 valB<-R[rB]
执行阶段 valE<-valB+valC
SetCC
写回阶段 R[rB]<-valE
本周代码托管截图
- 截图
代码托管地址: xxy745214935/week06
感悟与思考
- 这周的学习的内容为“处理器体系结构”,比起前几章更加深入计算机内部。在安装Y86模拟器的时候碰到了一些麻烦,但所幸克服了。当时安装了很久,各种方法都尝试了,甚至以为是老师给的压缩包有问题,后来才发现是自己的粗心。在查错过程中,自己早就应该想到“再装一次”这种解决措施,但当时的我却没有,导致浪费了很多时间和精力。
这一周因为需要敲的代码不是很多,对课后习题比以前更上心了一点,不再像往周只侧重于理论学习,毕竟“纸上得来终觉浅,绝知此事要躬行”。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 0/0 | 1/2 | 15/30 | |
第二周 | 56 /56 | 2/3 | 15/45 | |
第三周 | 89/145 | 1/4 | 20/65 | |
第五周 | 500/645 | 1/5 | 20/85 | |
第六周 | 150/795 | 1/6 | 20/105 |