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 有符号>

    • 六个条件传送指令:cmovlecmovlcmovecmovnecmovgecmovg

    • callret:call指令将返回地址入栈,然后跳到目的地址,ret指令从这样的过程调用中返回。

    • pushlpopl:实现入栈和出栈

    • 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安装bisonflex词法分析工具。
    884698-20161023170636685-168406843.png

  • 使用命令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
    884698-20161023170755388-1448130855.png

  • 注意可能会有提示make后错误,可能是因为没有修改makefile

  • 修改前

884698-20161023172751685-1796188313.png

  • 注意没有注释一共有3行,对后面进行修改,修改第二行根据libtcl.solibtk.so的路径以便gcc能找到库,所以是usr/lib;第三行根据tcl.htk.h的路径,所以是/usr/include/tcl8.5。

  • 进行测试ls列出所有代码
    884698-20161023171249420-1638987148.png

  • 编译p239的asuml.ys,使用命令make asuml.yo
    884698-20161023171816435-667676140.png

  • 得到结果,如果使用make all 可以汇编所有代码的结果
    884698-20161023171833654-1798158505.png

课后作业中的问题和解决过程

  • 首先遇到的问练习题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代码
      884698-20161023170910013-1289595976.png

    • 进行汇编
      884698-20161023171858201-1984079297.png

    • 汇编后abssum.ys代码结果
      884698-20161023171911388-762587472.png

本周代码托管截图

代码托管连接:https://git.oschina.net/20145335/Linux-besti-is-20145335

其他(感悟、思考等,可选)

本周的知识点的学习重点在于4.3,对于Y86的顺序实现过程中,用了很多的时间去学习的,很多知识点都是建立于栈帧的知识点上的。之前的基本功不扎实,学起来就会比较困难。但是关于HCL的知识,因为之气学过verilog与HDL设计课程的基础,理解起来就会容易许多

学习进度条

代码行数(新增/累积)博客量(新增/累积)学习时间(新增/累积)重要成长
目标5000行30篇400小时
第一周200/2002/220/20掌握核心的linux命令,了解了linux操作系统
第二周300/5002/418/38学会了虚拟机上的C编程
第三周500/10003/722/60初步学习计算机中各种数的表示和运算
第四周300/13002/930/90通过学习汇编,了解逆向的思想应用
第五周300/15002/1128/110安装了Y86处理器,了解了ISA抽象

参考资料

转载于:https://www.cnblogs.com/20145335hh/p/5990427.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值