20145238《信息安全系统设计基础》第6周学习总结 教材学习内容总结
4.1 Y86指令集体系结构
Y86处理器状态类似于IA32,有8个程序寄存器:%eax、%ecx、%edx、%ebx、%esi、%edi、%esp、%ebp。处理器的每个程序寄存器存储一个字。%esp被入栈、出栈、调用和返回指令作为栈指针。
ZF、SF、OF,它们保存最近的算术或逻辑指令所造成影响的有关信息。程序计数器PC存放当前正在执行指令的地址。
程序状态的最后一个部分是状态码stat,它表明程序执行的总体状态
IA32的movl指令:irmovl、rrmovl、mrmovl、rmmovl。指令名字第一个字母代表源的类型。源可以是立即数(i)、寄存器(r)、存储器(m),目的可以是寄存器(r)、存储器(m)
两个存储器传送指令中的存储器引用方式是基址和偏移量形式:4个整数操作指令:addl、subl、andl、xorl;7个跳转指令:jmp、jle、jl、je、jne、jge、jg;6个条件传送指令:cmovle、cmovl、cmove、cmovne、cmovge、cmovg;Halt指令停止指令的执行
Y86异常:以“.”开头的词是汇编器命令,它们告诉汇编器调整地址,以便在那里产生代码或插入一些数据
4.2 逻辑设计和硬件控制语言HCL
- 逻辑门是数字电路的基本计算元素。逻辑门总是活动的,一旦一个门的输入变化了,在很短的时间内,输出就会相应地变化。
- 将很多的逻辑门组合成一个网,就能构建计算块,称为组合电路。限制:1.两个或者多个逻辑门的输出不能连接在一起;2.这个网必须无环
- 多路复用电路(MUX):根据输入控制信号的值,从一组不同的数据信号中选出一个。
- HCL:1.HCL中所有字级的信号都声明为int;2.在画字级电路的时候,用中等粗度的线表示携带字的每个位的线路,用虚线来表示布尔信号的结果;3.在HCL中,表示默认情况(即所有条件都没有被选中的情况)一般用1
- 时钟寄存器&随机访问存储器:1.时钟寄存器存储单个位或者字。时钟信号控制寄存器加载输入值 2.随机访问存储器存储多个字,用地址来选择该读入或者该写哪个字
4.3 Y86的顺序实现
- 将处理组织成阶段
①取指:取指阶段从存储器读取指令字节,地址为程序计数器PC的值
②译码:译码阶段从寄存器文件读入最多两个操作数
③执行:在执行阶段,算数/逻辑单元要么根据ifun的值执行指令指明的操作,计算机存储器引用的有效地址,要么增加或减少栈指针
④访存:访存阶段可以将数据写入存储器,或从存储器读出数据
⑤写回:写回阶段最多可以写两个结果到寄存器文件
⑥更新PC:将PC设置成下一条指令的地址
irmovl指令的处理与rrmovl类似,但是因为是长指令格式,所以程序计数器要加6
指令call和ret与之前的popl和pushl类似。对于指令call,我们要将valP也就是call之后的那条指令的地址压入栈中在更新PC阶段,将PC设置为valC,也就是调用目的地
SEQ的实现包括组合逻辑和两种存储器设备:时钟寄存器、随机访问存储器
SEQ阶段的实现
①取指阶段:包括指令存储器单元。一次从存储器中读出6个字节。第一个字节分为ocode,ifun。根据icode的值,计算:instrvalid(发现不合法指令),needregids,need_valC。instrvalid和imemerror在访存阶段被用来产生状态码。
②S译码和写回阶段:都需要访问寄存器文件。寄存器文件有四个端口,它支持同时进行两个读和两个写;每个端口都一个地址连接和数据连接。如果某个地址端口上的值为特殊标识符0xf,则表明不需要访问寄存器。
③执行阶段:包括算术/逻辑单元(ALU)。这个单元革命家alufun信号的设置,对输入aluA和aluB执行ADD,SUB,AND,XOR运算。ALU的输出就是valE信号。还包括条件码寄存器。每次运行时,ALU都会产生三个与条件码相关的信号——零,符号,溢出。用set_cc来控制是否应该更新条件码寄存器。
④访存阶段:两个控制块产生存储器地址和存储器输入数据的值;另外两个块产生控制信号表明应该执行读操作还是写操作。当执行读操作时数据存储器产生值valM。
⑤更新PC阶段:SEQ中最后一个阶段会产生程序计数器的新值,依据指令的类型和是否要选择分支,新的PC可能是valC、valM、valP
实验楼学习
根据老师提供的信息构建YID环境:
cd ~/Code/shiyanlou_cs413
wget http://labfile.oss.aliyuncs.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
make
用make all指令编译
可以看到编译后的.yo文件
查看教材p239页的代码
教材学习中的问题和解决过程
-根据张晓涵同学的博客安装了Y86
同时也更改了makefile
但一直无法编译.yo文件
只好用实验楼来完成内容
代码调试中的问题和解决过程
我仔细回想了以下好像第一步安装bison和flex词法分析工具好像并没有成功,我就删了解压的文件重新来了一遍确实是没有安装
之后强行用了> sudo apt-get -f install bison flex 还是不行。。。
之后百度了解决方法> apt-get --fix-broken install
之后就成功啦~~~
进入y86-code文件夹,可以找到asuml.yo:
make clean Y86-code文件夹,可以看到只有.ys文件了
之后再> make all 可以汇编运行所有代码。
本周代码托管
代码托管链接
其他(感悟、思考等,可选)
本周大多数都是验证类的题目,需要认真思考和理解,感觉把更多的时间抽出来真正的理解课本内容更为重要。
本周还进行了家庭作业整理工作,其实觉得很枯燥(但可以加分。。。),就在翻看学姐的博客是我发现了闫佳昕学姐的第一周博客,上面详细的分析了每一条汇编指令执行的过程,寄存器的指向变化以及出栈如栈的情况,每周在读汇编代码的时候都非常难理解,但今天有了非常具体的认识,然而这是学姐第一周的博客·····早就听说学姐是超级无敌大学霸,其实何为学霸,并不是她们生来就比我们的大脑发达,只是人家在遇到问题时就及时的去解决了问题,我从第二周遇到的问题在第六周才解答,,,这就是比不上别人的原因,从以后开始要认真反思自己,不要再为了写博客而写博客,要切实的!去解决!自己遇到的问题!!!
学姐的参考博客
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 200/200 | 2/2 | 20/20 | |
第二周 | 300/500 | 2/4 | 18/38 | |
第三周 | 500/1000 | 3/7 | 22/60 | |
第五周 | 300/1300 | 2/9 | 30/90 | |
第六周 | 100/1400 | 2/9 | 30/90 |
参考资料
- 《深入理解计算机系统V2》学习指导
- http://www.cnblogs.com/hrhguanli/p/4594724.html
- http://blog.csdn.net/bulljordan23/article/details/7723495