• 2017-2018-1 20155319 《信息安全系统设计基础》第七周学习总结


    2017-2018-1 20155319 《信息安全系统设计基础》第七周学习总结

    教材学习内容总结

    1. Y86指令集体系结构

    (1)内容
    定义一个指令集体系结构,包括定义各种状态元素、指令集和它们的编码、一组编程规范和异常事件处理。

    (2)程序员可见状态

    • 概念:Y86程序中的每条指令都会读取或修改处理器状态的某些部分,称之为处理器可见状态。

    • Y86处理器状态类似于I32。可以访问和修改程序寄存器、条件码、程序计数器和存储器,状态码指明程序是否运行正常。

        RF:程序寄存器	%eax,%ecx,%edx,%ebx,%esi,%edi,%esp(出栈、入栈、调用和返回指令作为栈指针),%ebp
        CC:条件码		ZF、SF、OF(都是一位条件码,用来保存最近的算术或逻辑指令所造成影响的有关信息。)
        PC:程序计数器	存放当前正在执行的指令
        DMEM:存储器	很大的字节数组,保存着程序和数据。Y86程序用虚拟地址来引用存储器位置。
        Stat:程序状态码	它表明程序执行的总体状态。它会指示是正常运行还是出现了某种异常。
      

    (3)Y86指令

    • IA32指令集的一个子集,只包括四字节整数操作。寻址方式比较少,操作也比较少。

    • 指令编码长度从1个字节到6个字节不等,一条指令含有一个单字节的指令指示符,可能含有一个单字节的寄存器指示符,还可能含有一个四字节的常数字。字段fn指明是某个整数操作(OPL)、数据移动条件(cmovXX)或是分支条件(jXX)。所有数值都用十六进制表示

    • IA32的movl指令分成了4个不同的指令:irmovl、rrmovl、mrmovl和rmmovl。分别显示地指明源和目的的格式。

        	源操作数:	立即数i、寄存器r、存储器m
        	目的操作数:	寄存器r、存储器m
      

      两个存储器传送指令中的存储器引用方式是简单的基址和偏移量形式。

      • 在地址计算中,不支持第二变址寄存器和任何寄存器值的伸缩。
      • 不允许从一个存储器地址直接传送到另一个存储器地址。也不允许将立即数传送到存储器。
    • 4个整数操作指令

        addl、subl、andl、xorl
      
    • 7个跳转指令(jXX)

        jmp、jle、jl、je、jne、jge、jg
      
    • 有6个条件传送指令(cmovXX)

        cmovle、cmovl、cmove、cmovne、cmovge、cmovg
        只有当条件码满足所需要的约束时,才会更新目的寄存器的值。
      
    • call指令将返回地址入栈,然后跳到目的地址。ret指令从这样的过程调用中返回。

    • pushl和popl指令实现了入栈和出栈。

    • halt指令停止指令的执行。对于Y86来说,执行halt指令会导致处理器停止,并将状态码设置为HLT。

    (4)指令编码

    • 每条指令的第一个字节表明指令的类型。这个字节分为两个部分,每部分4位:高4位是代码部分,低4位是功能部分。功能值只有在一组相关指令共用一个代码时才有用。

        - 整数操作里代码部分均为6,功能部分区分addl,subl,andl,xorl
        - 分支指令里代码部分均为7
        - 传送指令里代码部分均为2
      
    • 8个程序寄存器中每个都有相应的0~7的寄存器标识符。

    • 程序寄存器存在一个寄存器文件中,这个寄存器文件就是一个小的、以寄存器ID作为地址的随机访问存储器。**当需要指明不应访问任何寄存器时,用ID值0xF表示。

    Y86的顺序实现

    • 1、 将处理组织成阶段

    下面是关于各个阶段以及各阶段内执行操作的简略描述:

    取指:取指阶段从存储器读取指令字节,地址为程序计数器(PC)的值。
    译码:译码阶段从寄存器文件读入最多两个操作数,得到val A/val B.
    执行:执行阶段,算术/逻辑单元要么执行指令明确的操作(根据ifun的值),计算存储器引用的有效地址,要么增加或减少栈指针。得到的值称为valE
    访存:访存阶段可将数据写入存储器或从存储器读出数据
    写回:最多可写两个结果到存储器。
    更新PC:将PC设置成下一指令的地址。

    • 2、seq阶段的实现
      参考资料
      1、百度百科
      2、左潇龙的技术博客
      3、bubuko的博客
      4、码迷指导教程

    代码调试中的问题和解决过程

    代码托管

    上周考试错题总结

    • 0<=x,y<2^w, 则
      A .
      x+y的最大值是2^w
      B .
      x+y的最大值是2^w-1
      C .
      x+y的最大值是2^w-2
      D .
      x+y的最大值是2^(w+1)
      E .
      x+y的最大值是2^(w+1)-1
      F .
      x+y的最大值是2^(w+1)-2
      正确答案: D 你的答案: B

    学习进度条

    代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
    目标 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
    • 计划学习时间:15小时

    • 实际学习时间:8小时

    • 改进情况:

  • 相关阅读:
    源码浅析:MySQL一条insert操作,会写哪些文件?包括UNDO相关的文件吗?
    20201024 --各位码农,节日快乐
    Redis的基本使用
    Oracle 11g与12c的审计详解
    Mac 终端 Tomcat 环境配置过程
    Oracle查询如何才能行转列?-sunziren
    Redis命令大全
    MySQL8.0数据库基础教程(二)-理解&quot;关系&quot;
    mysql 5.7.28 中GROUP BY报错问题 SELECT list is not in GROUP BY clause and contains no
    Flink知识散点
  • 原文地址:https://www.cnblogs.com/rhl20155319/p/7788098.html
Copyright © 2020-2023  润新知