• 20145208 《信息安全系统设计基础》第六周学习总结


    20145208 《信息安全系统设计基础》第6周学习总结

    Y86模拟器安装教程

    • 虽然实验楼中给的参考链接打不开,但是在实验楼的教学代码中有一个命令同样可以下载Y86模拟器到虚拟机中
    • 使用wget http://labfile.oss.aliyuncs.com/courses/413/sim.tar命令可以下载sim.tar文件到虚拟机中
    • 在搜索Y86相关资料的时候,发现了一个较为详尽的Y86安装教程,参考里面的过程完成了安装(资料链接在下方已经给出,感谢博主的分享让我在安装过程中可以减少很多麻烦)
    • 1.首先需要安装bisonflex词法分析工具,这个可以在终端中输入sudo apt-get install bison flex来安装。
    • 2.sim.tar文件的下载除了实验楼中的下载方式,该博主也提供了一种,但是可能是我的网络问题,给的网页链接打不开。
    • 3.如果想要看到图形化的界面需要我们自己安装Tcl/Tk
      • 通过终端命令sudo apt-get install tcl8.5-dev tk8.5-dev tcl8.5 tk8.5来安装
      • 在安装的过程中可能出现如下错误,提示资源占用的问题,使用rm命令关闭即可

    • 4.使用图形界面还需要对makefile进行改动(makefile文件在sim文件夹下)
    GUIMODE=-DHAS_GUI                   (本来是#GUIMODE=-DHAS_GUI 的,也就是把#去掉)
    TKLIBS=-L/usr/lib/ -ltk8.5 -ltcl8.5
    TKINC=-I /usr/include/tcl8.5                (前面那个是大写的i,就是include的意思。不是小L,路径是自己虚拟机种``tk.h``和``tcl.h``文件的路径)
    
    • 5.然后就可以通过make *.yo来编译文件了,也可以直接makemake all来编译所有的代码。

    • 6.这之后就可以在pipe文件夹下打开终端输入 ./psim -t -g ../y86-code/*.yo来使用Y86模拟器对y86-code文件夹中的*.yo文件进行操作了

    • 以后每次可以通过将汇编代码写入*.ys然后用make编译成*.yo,然后用Y86模拟器操作

    教材学习内容总结

    4.1Y86指令集体系结构

    • ISA:指令集体系结构,一个处理器支持的指令和指令的字节级编码程序员可见的状态

    程序员可见的状态

    • Y86程序中的每条指令都会读取或修改处理器状态的某些部分,称为程序员可见状态。其中包括:
      • 8个程序寄存器:%eax,%ecx,%edx,%ebx,%esi,%edi,%esp和%ebp。
      • 条件码:ZF(零)、SF(符号)、OF(有符号溢出)
      • 程序计数器(PC):存放当前正在执行的指令的地址
      • 存储器:很大的字节数组,保存着程序和数据。Y86系统用虚拟地址来引用存储器的位置,硬件和操作系统软件联合起来将虚拟地址翻译成实际或者物理地址。
      • 状态码(stat):表明程序执行的总体状态。(异常处理)

    Y86指令

    • movl:irmovl、rrmovl、mrmovl、rmmovl,分别显式地指明源和目的地的格式。第一个字母表明源的类型,i(立即数)、r(寄存器)或m(存储器 ),第二个字母代表目的,可以是r或者m。

    • 两个存储器传送指令中的存储器引用方式是简单地基址和偏移量形式,即:
      Imm(Eb) M[Imm+R[Eb]](基址+偏移量)寻址

    • 不允许从一个存储器地址直接传送到另一个存储器地址,也不允许将立即数传送到存储器。

      • OPl(整数操作指令):addl、subl、andl和xorl。只对寄存器数据进行操作,同时还设置条件码。
      • jXX(跳转指令):jmp、jle、jl、je、jne、jge、jg,根据分支指令的类型和条件码的设置来选择分支。
      • cmovXX(条件传送指令):cmovle、cmovl、cmove、cmovne、cmovge和comvg,与寄存器-寄存器传送指令rrmovl一样,但只有当条件码满足所需要的约束时才会更新目的寄存器的值。
      • call和ret:call指令将返回地址入栈,然后跳转到目的地址。ret指令从这样的过程调用中返回。
      • pushl和popl:入栈和出栈。
      • halt:停止指令的执行。

    指令编码

    • 指令的字节级编码规则:高4位为代码部分,低四位为功能部分,功能值只有在一组相关指令共用一个代码时才有用。
      8个程序寄存器当中,每个都有相应的0~7的寄存器标识符。程序寄存器存在CPU中的一个寄存器文件中,这个文件就是一个小的、以寄存器ID作为地址的随机访问存储器。
    数字   寄存器名字
    0       %eax
    1       %ecx
    2       %edx
    3       %ebx
    4       %esp
    5       %ebp
    6       %esi
    7       %edi
    
    • 附加寄存器指示符字节:指定一个或者两个寄存器。
    • 附加4字节的常数字:作为irmovl的立即数数据,rmmovl和mrmovl的地址指示符的偏移量,以及分支指令和调用指令的目的地址。

    Y86异常

    状态码:描述程序执行的总体状态。
    值       名字      含义
    1       AOK     正常操作
    2       HLT     处理器执行halt指令(指令停止)
    3       ADR     遇到非法地址
    4       INS     遇到非法指令
    
    • Y86中,任何AOK以外的代码都会使处理器停止执行指令,而没有异常处理程序。

    4.2逻辑设计和硬件控制语言HCL

    • 实现一个数字系统需要的三个组成部分:计算对位进行操作的函数的组合逻辑、存储位的存储器元素,以及控制存储器元素更新的时钟信号。

    计算对位进行操作的函数的组合逻辑

    • 逻辑门是数字电路的基本计算元素,输出等于输入位值的某个布尔函数。
      • 与:out=a&&b
      • 或:out=a||b
      • 非:out=!a
      • 异或:out=(!a)b+a(!b)

    存储器和时钟

    • 为了产生时序电路,必须引入按位存储信息的设备,存储设备由同一个时钟信号控制。
    • 随机访问存储器:存储多个字,用地址来选择应该读写哪个字。
    • 时钟寄存器:存储单个位或字,时钟信号控制寄存器加载输入值。
    • 寄存器首先保持稳定(输出等于当前状态),时钟上升沿来到时,加载输入信号。Y86处理器用时钟寄存器保存程序计数器(PC),条件代码(CC)和程序状态(Stat)。
    • 寄存器文件有两个读端口(A和B),一个写端口(W),允许同时进行多端口读写操作。

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

    习题4.1

    • 确定下面的Y86指令序列的字节编码。.pos 0x100表明这段代码的起始地址应该是0x100
    .pos 0x100 
    	irmovl $15,%ebx
    	rrmovl %ebx,%ecx
       loop:
    	rmmovl %ecx,-3(%ebx)
    	addl %ebx,%ecx
    	jmp loop
    
    • 通过Y86模拟器清楚的看到所有的信息:

      0x100:              | .pos 0x100 
      0x100: 30f30f000000 | 	irmovl $15,%ebx
      0x106: 2031         | 	rrmovl %ebx,%ecx
      0x108:              |    loop:
      0x108: 4013fdffffff | 	rmmovl %ecx,-3(%ebx)
      0x10e: 6031         | 	addl %ebx,%ecx
      0x110: 7008010000   | 	jmp loop
    

    习题4.2

    • 确定下列每一个字节序列所编码的Y86指令序列。如果有不合法字节,指出其位置。
    A.
    0x100:30f3fcffffff   ;irmovl $-4,%ebx
    0x106:406300080000   ;rmmovl %esi,0x800(%ebx)
    0x10c:00             ;halt
    B.
    0x200:a06f           ;pushl %esi
    0x202:8008020000     ;call proc
    0x207:00             ;halt
    0x208:               ;proc:
    0x208:30f30a000000   ;irmovl $10,%ebx
    0x20e:90             ;ret
    C.
    0x300:505407000000   ;mrmovl 0x7(%esp),%ebp
    0x306:10             ;nop
    0x307:f0             ;非法
    0x308:b01f           ;popl %ecx
    D.
    0x400:               ;loop:
    0x400:6113           ;subl %ecx,%ebx
    0x402:7300040000     ;je loop
    0x407:00             ;halt
    E.
    0x500:6362           ;xorl %esi,%edx
    0x502:a0             ;非法
    0x503:f0             ;非法
    

    习题4.10

    • 写一个电路的HCL代码,对于输入字A,B,C,选择中间值。
    int Med3 = [
            A<=B && A>=C :A;
            A<=C && A>=B :A;
            B<=A && B>=C :B;
            B<=C && B>=A :B;
            1            :C;
    ];
    

    练习题4.17

    • 写出SEQ中实现need_valC的HCL代码
    bool need_valC =
     icode in {IIROMVL,IRMMOVL,IMRMOVL,IJXX,ICALL};
    

    练习题4.19

    • 这段代码类似于disE的代码:
    detM=[
        icode in{IMRMOVL,IPOPL}:rA;
        1:RNONE;
    ]
    

    代码托管

    代码托管链接

    学习进度条

    代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
    目标 5000行 30篇 400小时
    第一周 0/0 1/2 20/20 学会了虚拟机安装和Ubuntu的基本操作
    第二周 56/56 1/3 20/40 学会了Ubuntu终端下的C语言编写
    第三周 110/166 1/4 30/70 熟悉了gdb的基本操作,了解了计算机信息表示和处理
    第四周 110/166 1/5 10/80 复习了前几周的知识
    第五周 42/208 2/6 30/110 学习了linux下的汇编语言内容
    第六周 1147/1355 1/7 30/140 了解了linux下Y86模拟器的使用

    参考资料

  • 相关阅读:
    Anti-Aliasing SSAA MSAA MLAA SRAA 简介
    开源二维码QR CODE编码/解码 识别 库
    Shadow Map阴影贴图技术之探
    3D场景的制作步骤
    python实现对excel数据进行修改/添加
    selenium3 + python 爬虫
    Mock实现模拟python的对象
    Moco模拟服务器实现请求&响应 (一)
    python之Beautiflusoup操作
    python使用ddt模块对用例执行操作
  • 原文地址:https://www.cnblogs.com/20145208cy/p/5988323.html
Copyright © 2020-2023  润新知