20145335郝昊 《信息安全系统设计基础》第六周学习总结
20145335郝昊 《信息安全系统设计基础》第六周学习总结
教材学习内容总结
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指令集的计算原则:处理器从来不需要为了完成一条指令的执行而去读由该指令更新了的状态 
代码调试中的问题和解决过程
- 
使用命令 sudo apt-get install bison flex安装bison和flex词法分析工具。
 ![]() 
- 
使用命令 sudo apt-get install tcl8.5-dev tk8.5-dev tcl8.5 tk8.5安装Tcl/Tk支持图形界面。
- 
安装 sim,起初使用命令的地址http://csapp.cs.cmu.edu/public/students.html显示错误,连接超时。
- 
后来在实验楼的指导下成功安装了sim 
 ![]() 
- 
注意可能会有提示make后错误,可能是因为没有修改 makefile
- 
修改前 

- 
注意没有注释一共有3行,对后面进行修改,修改第二行根据 libtcl.so和libtk.so的路径以便gcc能找到库,所以是usr/lib;第三行根据tcl.h和tk.h的路径,所以是/usr/include/tcl8.5。
- 
进行测试 ls列出所有代码
 ![]() 
- 
编译p239的asuml.ys,使用命令 make asuml.yo。
 ![]() 
- 
得到结果,如果使用 make all可以汇编所有代码的结果
 ![]() 
课后作业中的问题和解决过程
- 
首先遇到的问练习题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的表就可以理解了。
- 
关于练习4.5 - 
函数AbsSum的Y86代码 
 ![]() 
- 
进行汇编 
 ![]() 
- 
汇编后 abssum.ys代码结果
 ![]() 
 
- 
本周代码托管截图
代码托管连接:https://git.oschina.net/20145335/Linux-besti-is-20145335
其他(感悟、思考等,可选)
本周的知识点的学习重点在于4.3,对于Y86的顺序实现过程中,用了很多的时间去学习的,很多知识点都是建立于栈帧的知识点上的。之前的基本功不扎实,学起来就会比较困难。但是关于HCL的知识,因为之气学过verilog与HDL设计课程的基础,理解起来就会容易许多
学习进度条
| 代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
|---|---|---|---|---|
| 目标 | 5000行 | 30篇 | 400小时 | |
| 第一周 | 200/200 | 2/2 | 20/20 | 掌握核心的linux命令,了解了linux操作系统 | 
| 第二周 | 300/500 | 2/4 | 18/38 | 学会了虚拟机上的C编程 | 
| 第三周 | 500/1000 | 3/7 | 22/60 | 初步学习计算机中各种数的表示和运算 | 
| 第四周 | 300/1300 | 2/9 | 30/90 | 通过学习汇编,了解逆向的思想应用 | 
| 第五周 | 300/1500 | 2/11 | 28/110 | 安装了Y86处理器,了解了ISA抽象 | 
 
                     
                    
                 
                    
                







 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号