20145326蔡馨熠《信息安全系统设计》第6周学习总结

教材学习内容总结

书上有的内容我就不重复赘述了,只需要将部分重要的知识点归纳总结一下。

Y86指令集体系结构

  • Y86处理器状态类似于IA32,可以访问和修改程序寄存器:%eax,%ecx,%edx,%ebx,%esi,%edi,%esp和%ebp。

  • 指令的字节级编码规则:高4位为代码部分,低四位为功能部分,功能值只有在一组相关指令共用一个代码时才有用。指令集的一个重要性质就是字节编码必须有唯一的解释。

  • Y86指令集的那张图是重点!还要注意pushl %esp指令压入的是%esp寄存器的旧值。

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

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

  • 字级的组合电路:HCL中,所有字级的信号都声明为int,不指定字的大小。为了产生时序电路,必须引入按位存储信息的设备,存储设备由同一个时钟信号控制。

Y86的顺序实现

  • 将处理组织成阶段:取指;译码;执行;访存;写回;更新PC。

  • 在设计硬件时,降低复杂度的一种方法是让不同的指令共享尽量多的硬件。

  • SEQ的实现包括组合逻辑和两种存储器设备:时钟寄存器(程序计数器和条件码寄存器)、随机访问存储器。

  • Y86指令集的计算原则:处理器从来不需要为了完成一条指令的执行而去读由该指令更新了的状态。

  • SEQ阶段的实现:取指;译码和写回;执行;访存;更新PC。

  • SEQ唯一的问题就是它太慢了,时钟必须非常慢,以使信号能在一个周期内传播所有的阶段

学习过程

一、Y86的安装

1.安装bison和flex词法分析工具,在终端中输入sudo apt-get install bison flex

2.根据娄老师给的下载地址,在虚拟机中下载sim,并解压。

3.图形界面必须要安装tcl/tk

  • 在终端输入sudo apt-get install tcl8.5-dev tk8.5-dev tcl8.5 tk8.5

  • 在解压后的sim文件夹中找到makefile文件,作如下改动并保存:

    GUIMODE=-DHAS_GUI // 将#去掉

    TKLIBS=-L/usr/lib/ -ltk8.5 -ltcl8.5 // 加上8.5

    TKINC=-I /usr/include/tcl8.5 //将isystem改为大写的I,在最后加上tcl8.5

4.在sim文件夹下右键选择在终端中打开,输入make clean;make

5.现在模拟器就可以用了,例如pipe文件夹下在终端中打开,输入./psim -t -g ../y86-code/asum.yo

6.进入y86-code文件夹,可以找到asuml.yo

7.以教材251的代码为例来练习。首先make clean一下,然后这时只剩.ys文件了,然后可以make P251.yo,然后可以cat P251.yo查看,如下图所示,make all可以汇编运行所有代码。

二、练习

练习题4.1

确定下面的Y86指令序列的字节编码。.pos 0x100表明这段代码的起始地址应该是0x100

irmovl $15,%ebx
rrmovl %ebx,%ecx
loop:
rmmovl %ecx,-3(%ebx)
addl %ebx,%ecx
jmp loop

解答:

irmovl $15,%ebx   ##30f30f000000
rrmovl %ebx,%ecx  ##2031
loop:   
rmmovl %ecx,-3(%ebx)  ##4013fdffff   
addl %ebx,%ecx  ##6031
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:  
0x208:30f30a000000  ##irmovl $10,%ebx  
0x20e:90  ##ret  

(此题应该是在熟练掌握各项指令(尤其是特殊指令)的编码基础上进行求解的。)

C.
0x300:505407000000  ##mrmovl 0x7(%esp),%ebp  
0x306:10##nop  
0x307:f0##非法  
0x308:b01f  ##popl %ecx  
练习题4.5

修改P238图4-6中的Y86代码,实现函数AbsSum,使其能计算一个数组的绝对值的和。在内循环中使用条件传送指令。

int Sum(int *Start,int Count)
{
int sum = 0;
while(Count)
{
sum+=*Start;
Start++;
Count--;
}
return sum;

对于内循环的Y86代码,如要计算绝对值之和,只需要在相对于“sum+=*Start”的部分做下改动,加上条件分支(负数取反,正数不变)。如果要用条件传送,则适合cmovg或者cmovge。

loop:
mrmovl (%ecx),%esi  get x = *Start
irmovl $0,%edi       0
subl %esi,%edi       -x
cmovg %edi,%esi      if -x > 0 then x = -x
addl %esi,%eax     add x to sum
irmovl $4,%ebx
addl %ebx,%ecx     Start++
irmovl $-1,%ebx
addl %ebx,%edx     Count--
jne loop        Stop when 0
练习题4.8

写出信号xor的HCL表达式,xor就是异或,输入为a和b。信号xor和上面定义的eq有什么关系?

bool xor = (a && !b) || (!a && b)
与bool eq = (!a && !b) || (a && b)的区别为:二者互补
练习题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;
];

代码托管情况

代码托管链接

代码统计行数:

学习进度条

  代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时  
第一周 0/0 1/2 20/20  
第二周 58/58 1/3 20/40  
第三周 150/208 1/4 22/62  
第五周 150/358 1/5 21/83  
第六周 136/494 1/6 25/108  

心得体会

本周主要是对于第四章——处理器体系结构的学习,我将大部分时间和精力放在了前三节(因为娄老师说前三章比较重要)。Y86指令集体系结构的相关知识并不是特别难,要结合之前的IA32来学习,其中教材232页的那张Y86指令集的图一定要熟记并深入理解!Y86指令序列的字节编码也是重点,不过很简单,跟着书上的例子走一遍就会了。然后就是HCL这部分,因为之前学过HDL,所以理解起来并不困难。其中HCL整数表达式是重点,要熟悉理解。再者,“Y86的顺序实现”这一部分的知识得亲自动手实践才行,光看书 远远不够!这部分是重点也是难点。最后SEQ部分的知识同样如此。

由于之前对汇编的学习不系统,理解得也不够透彻,所以本周的学习还是相对有一些吃力的,不过我静下心来,挨着一页页的看教材,边看边理解,加上实验楼部分的实践,最后还是很有收获。本周投入了相当多的时间来学习,星期二到星期五全在看教材,理解教材,周末用来实践。先是对于Y86的安装,虽然也出现了各种问题,不过最后都通过百度解决了。然后就是借用Y86模拟器这个平台,将书上相关代码走一遍,探索其原理与运行过程。

本周的知识点比较集中,主要还是汇编这块的。所以感觉学习的时候很有连贯性,以前的知识都能用上,这种感觉很棒。

我一直认为完全不看教材,一心想走捷径是绝对不行的,要想有收获,必须投入大量时间与精力。最重要的还是摆正心态,不要应付,不要敷衍。我们应该挖掘学习的乐趣,享受学习的过程,这才是完美的。我会每周给自己定一个小目标~ 不断前进!!!

原文地址:https://www.cnblogs.com/cxy1616/p/5991015.html