2017-2018-20155336 《信息安全系统设计基础》第七周学习总结
教材学习内容总结
Y86指令集体系结构
-
Y86指令
Y86指令集基本上是
IA32
指令集的一个子集,只包括四字节整数操作,寻址方式比较少,操作也较少。汇编码表示和字节编码参见课本232页。
-
movl指令:源操作数(
i-立即数
、r-寄存器
、m-存储器
)、目的操作数(r-寄存器
、m-存储器
) -
四个整数操作指令:
addl 加
、subl 减
、andl 与
、xorl 异或
-
七个跳转指令——分支控制:
jmp 直接跳转
、jle(SF^OF)|ZF
有符号数≤、jl SF^OF
有符号<、je ZF
相等/零、jne ~ZF
不相等/非零、jge ~(SF^OF)
有符号≥、jg ~(SF^OF)&~ZF
有符号> -
六个条件传送指令:
cmovle
、cmovl
、cmove
、cmovne
、cmovge
、cmovg
-
call
和ret
:call
指令将返回地址入栈,然后跳到目的地址,ret
指令从这样的过程调用中返回。 -
pushl
和popl
:实现入栈和出栈 -
halt
指令:halt
指令停止指令的执行,执行此指令会导致处理器停止,并将状态码设置为HLT
。
-
-
类比IA32:hlt指令与之类似,但是IA32的应用程序不允许使用这条指令,因为它会导致整个系统暂停运行。
-
Y86异常
AOK
正常操作HLT
处理器执行halt指令ADR
遇到非法地址INS
遇到非法指令
逻辑设计和硬件控制语言HCL
-
逻辑门
-
逻辑门产生的输出,等于它们输入位值的某个布尔函数。
-
逻辑门对应的HCL表达式:
AND &&
、OR ||
、NOT !
-
-
组合电路和HCL布尔表达式
- 构建计算块(组合电路)时的限制:两个或多个逻辑门的输出不能连接在一起、必须无环
-
组合逻辑电路和c语言中逻辑表达式的区别
-
组合电路的输出会持续响应输入变化,c语言表达式只有在执行过程中被遇到才求值
-
逻辑门只对0和1操作,c语言表达式中参数可以是任意整数,0是FALSE,不是0的都是TRUE
-
c的逻辑表达式可能被部分求值
-
Y86顺序实现
-
将处理组织成阶段:取指、译码、执行、访存、写回、更新PC
-
SEQ阶段的实现:取指阶段、译码和写回阶段(都需要访问寄存器文件,根据四个端口的情况,判断应该读哪个寄存器产生信号valA、valB)、执行阶段(包括算术/逻辑单元ALU,输出的是valE、包括条件码寄存器)、访存阶段(读或者写程序数据)、更新PC阶段(会产生程序计数器的新值。)
-
Y86指令集的计算原则:处理器从来不需要为了完成一条指令的执行而去读由该指令更新了的状态
Y86模拟器的安装(实验楼中)
-
1.mkdir ~/xxx创建一个专属文件夹
-
2.cd ~/xxx进入该专属文件夹
-
3.wget http://labfile.oss.aliyuncs.com/courses/413/sim.tar去网站下载sim压缩包
-
4.tar -xvf sim.tar解压
-
5.cd sim进入sim文件夹
-
6.sudo apt-get install bison flex tk安装bison flex tk
-
7.sudo ln -s /usr/lib/x86_64-linux-gnu/libtk8.6.so /usr/lib/libtk.so
-
8.sudo ln -s /usr/lib/x86_64-linux-gnu/libtk8.6.so /usr/lib/libtcl.so
-
9.make
-
10.cd y86-code
-
11.make xxx.yo
Y86模拟器的安装(虚拟机中)
-
下载sim压缩包
-
解压sim压缩包:tar -xvf sim.tar
-
进入sim文件夹:cd sim
-
安装TCL/TK以致有图形界面:sudo apt-get install tcl8.5-dev tk8.5-dev tcl8.5 tk8.5
-
修改文件,用记事本打开makefile文件夹下面的文件,GUIMODE=-DHAS_GUI (去掉原有注释),TKLIBS=-L/usr/lib/ -ltk8.5 -ltcl8.5,TKINC=-I/usr/include/tcl8.5。
代码调试
P4.45
-
首次编译。。。。。。。发现结果竟然不对~~~
-
调整后就好了
课后作业中的问题和解决过程
-
首先遇到的问练习题4.1中的两个问题,练习题中阐述了。
.ops 0x100
表明代码的起始地址是0x100,那为什么第一个指令irmovl $15 , %ebx
不是从0xF+0x100
呢?后来发现这样的做法是错误的,把基本概念都混肴了,一个是%ebx
的值,另一个则是地址的值,二者不一样,二者也是不会相互影响的。所以答案直接就是0xF ,最终答案应该是30F30F000000
-
之后针对于练习4.1每一行代码的地址遇到了问题。为什么执行完代码
irmovl $15 , %ebx
后地址变为0x106
?通过分析书上的P234页的例子就可以知道,需要4字节常数,每两个数算作一字节。加上imovl命令的编码30F30F000000
所以一共为6位,地址变化为0x106,之后的也一样,指令编码和4字节常数,不同的Y86指令又有不同的要求,理解图4-2、4-3的表就可以理解了。
代码托管
其他(感悟、思考等,可选)
- 有些地方。。。。。真的根本看不懂啊 也不知道该怎么问问题 难过
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 200/200 | 2/2 | 20/20 | |
第二周 | 300/500 | 2/4 | 18/38 | |
第三周 | 500/1000 | 3/7 | 22/60 | |
第四周 | 600/1300 | 4/9 | 30/90 | |
第五周 | 650/1300 | 5/9 | 40/90 | |
第六周 | 700/1300 | 6/9 | 50/90 | |
第七周 | 800/1300 | 7/9 | 60/90 |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
-
计划学习时间:10小时
-
实际学习时间:10小时
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)