2017-2018-1 20155220 《信息安全系统设计基础》第十四周学习总结
2017-2018-1 20155220 《信息安全系统设计基础》第十四周学习总结
学习目标
找出全书你认为学得最差的一章,深入重新学习一下,要求(期末占5分):主要学习第四章
- 总结新的收获
- 给你的结对学习搭档讲解或请教,并获取反馈
- 参考上面的学习总结模板,把学习过程通过博客(随笔)发表,博客标题“学号 《信息安全系统设计基础》第十四周学习总结”,博客(随笔)要通过作业提交,截至时间本周日 23:59。
教材学习内容总结
Y86指令集体系结构
- 内容:定义一个指令集体系结构,包括定义各种状态元素、指令集和它们的编码、一组编程规范和异常事件处理
程序员可见状态:
- Y86程序中的每条指令都会读取或修改处理器状态的某些部分。
- Y86具体包括:8个程序寄存器、3个条件码ZF\SF\OF、程序计数器(PC)。
- Y86用虚拟地址引用存储器位置。 程序状态的最后一个部分是状态码Stat,它表明程序执行的总体状态。
Y86指令
指令介绍:
- halt:这个指令将会终止指令的执行
- nop:这是一个占位指令,他不做任何事,后续为了实现流水线,它有一定的作用
- xxmovl:这是一系列的数据传送指令,其中r代表寄存器,m代表存储器,i代表立即数.比如rrmov指令,则代表将一个寄存器的值,赋给另外一个寄存器
- opl:操作指令,比如加法,减法等等
- jxx:条件跳转指令,根据后面的条件进行跳转
- cmovxx:条件传送指令,后面的xx代表的是条件.特别的是,条件传送只发生在两个寄存器之间,不会将数据传送到存储器.
- call与ret:方法的调用和返回指令.一个将返回地址入栈,并跳到目标地址.一个将返回地址入PC,并跳到返回地址.
- push和pop:入栈和出栈操作
Y86异常
- 对Y86来说,程序员可见的状态中就有stat状态码,它标志了程序执行的状态.Y86需要有能力根据stat去做一些处理.捕获为了简单起见,这里除了正常执行之外,都将停止指令的执行.真实当中,会有专门的异常处理程序.
- Y86有四种不同的状态码:AOK(正常),HTL(执行halt指令),ADR(非法地址)和INS(非法指令).
Y86程序
- Y86指令和IA32代码的主要区别在于,它可能需要多条指令来执行一条IA32指令能完成的所有功能。
- Y86没有伸缩寻址模式。
- 以“.”开头的词是汇编器命令,命令.pos0告诉汇编器应该从地址0处开始产生代码。
- 创建Y86代码的唯一工具是汇编器。
- YIS:指令集模拟器
- Y86和X86的区别在于,有的时候Y86需要两条指令来达到X86一条指令就可以达成的目的.
逻辑设计和硬件控制语言HCL
逻辑门
- 逻辑门是数字电路的基本计算元素,它们的输出,等于它们输入位值的某个布尔函数。
- 逻辑门总是活动的,一旦一个门的输入变化,在短时间内,输出就会跟着变化。。
组合电路和HCL布尔表达式
-
组合电路:将很多的逻辑门组合成一个网,能构建计算块。
-
多路复用:根据输入控制信号的值,从一组不同的数据信号中选出一个。
-
构建这些网有2条限制:
- (1)两个或多个逻辑门的输出不能连接在一起
- (2)这个网必须是无环的。
-
HCL表达式和C语言中逻辑表达式的区别:
- (1)组合逻辑电路的输出会持续地响应输入的变化;C表达式只有在程序执行过程中被遇到时才会求值。
- (2)C的逻辑表达式允许参数是任意整数,0表示FLASE,其他任何值都表示TRUE;逻辑门只对位值0和1进行操作。
- (3)C的逻辑表达式可能只被部分求值;组合逻辑没有部分求值的规则,逻辑门只是简单地响应输入的变化。
字级的组合电路和HCL整数表达式
- 执行字级计算的组合电力根据输入字的各个为,用逻辑门来计算输出字的各个位。
- 用中等粗度的线来表示携带字的每个位的线路,用虚线来表示布尔信号结果。
- 在HCL中,多路复用函数用情况表达式来描述。
- 算术/逻辑单元是一种很重要的组合电路。
集合关系
- 判断集合关系的通用格式是:
iexpr in {iexpr1,iexpr2,……,iexprk}
存储器和时钟
-
存储设备都是由同一个时钟控制,两类存储器设备包括:
- 时钟寄存器(寄存器):储存单个位或字,用时钟信号控制寄存器加载输入值。
- 随机访问储存器(储存器):储存多个字,用地址选择该读/写哪个字。
-
硬件和机器级编程中的寄存器有细微差别,分为称为“硬件寄存器”和“程序寄存器”。
- 在硬件中,寄存器直接将它的输入和输出线连接到电路的其他部分;
- 在机器级编程中,寄存器代表的是CPU中为数不多的可寻址的字,这里的地址是寄存器ID。 Y86处理器会用时钟寄存器保存程序计数器(PC)、条件代码(CC)、程序状态(Stat)。
-
Y86处理器会用时钟寄存器保存程序计数器PC,条件代码CC和程序状态Stat。
-
处理器有一个随机访问存储器来存储程序数据。
-
处理器还包括另外一个只读存储器,用来读指令。
-
在大多数实际系统中,这两个存储器被合并为一个具有双端口的存储器:一个用来读指令,一个用来读或写数据。
Y86的顺序实现
- SEQ处理器:每一个时钟周期上,SEQ执行处理一条完整指令所需的所有步骤。
将处理组织成阶段
- 取址:valP:PC的值加上已取出指令的长度。
- 译码:读入指令rA和rB字段指明的寄存器。
- 执行:ALU执行指令指明的操作,计算存储器引用的有效地址,要么增加或者减少栈指针,得到的值为valE;
- 跳转指令来说,这个阶段会检验条件码和分支条件。
- 访存:可以将数据写入存储器,或者从存储器读出数据。置为valM。
- 写回:最多可以写两个结果到寄存器文件。
- 更新:将PC设置成下一条指令的地址。
SEQ的时序
- SEQ的实现包括组合逻辑和两种存储器设备:时钟寄存器(程序计数器和条件码寄存器),随机访问存储器(寄存器文件、指令存储器和数据存储器)。
- 每个时钟周期,程序计数器都会装在新的指令地址;只有在执行整数运算指令时,才会装载条件码寄存器;只有在执行rmmovl、pushl或call指令时,才会写数据存储器;寄存器文件的两个写端口允许每个时钟周期更新两个程序寄存器。
SEQ阶段的实现
- 在控制逻辑中必须被显式引用的常数:
1.取指阶段
-
以PC为第一个字节的地址,一次读6个字节。
-
icode:控制逻辑块计算指令
-
ifun:功能码
-
三个一位的信号(根据icode值计算):
- instr_valid:发现不合法的指令;
- need_regids:包含寄存器指示符字节码;
- need_valC:包括常数字码
-
后五个字节是寄存器指示符字节和常数字的组合编码。
2.译码和写回阶段
- 都需要访问寄存器文件,根据四个端口的情况,判断应该读哪个寄存器产生信号valA、valB。
- 寄存器文件,支持同时进行两个读和两个写,每个端口有一个地址连接(寄存器ID)和一个数据连接(32根线路),既可以作为寄存器文件的输出字,又可以作为他的输入字。
3.执行阶段
- 包括算数/逻辑单元(ALU),输出为valE信号。ALU通常作为加法器使用
- 包括条件码寄存器
- 每次运行产生:零、符号、溢出、产生信号set_cc
4.访存阶段
- 读或者写程序数据。
- 两个数据块产生存储器地址和存储器输入证据的值,两个产生控制信号表明应该是读还是写。当执行读操作时,数据存储器产生valM。
- 根据icode,imem_error,instr_valid,dmem_error,从指令执行的结果计算状态码Stat。
5.更新PC阶段
- 产生程序计数器的新值,依据指令的类型和是否要选择分支,新的PC可能是valC、valM或者valP。
课后作业及实现
-
确定下面的Y86指令序列的字节编码。".pos 0x100”那一行表明这段目标代码的起始地址应该是Ox100。
-
答案:这段编码有以下特性值得注意:
十进制的15(第2行)的十六进制表示为0x0000000f。以反向顺序来写就是0f 00 00 00。
十进制-3(第5行)的十六进制表示为0xfffffffd。以反向顺序来写就fd ff ff ff。
代码从地址0x100开始。第一条指令需要6个字节,而第二条需要2个字节。因此,循环的目标地址为0x00000108。以反向顺序来写就是08 01 00 00。 -
确定下列每个字节序列所编码的Y86指令序列。如果序列中有不合法的字节,指出指令序列中不合法值出现的位置。每个序列都先给出了起始地址,冒号,然后是字节序列。
-
答案:
-
根据下面的C代码,用Y86代码来实现一个递归求和函数rSumint :
{ if (Count <=0)
return 0;
return *Start+rSum(Start+1,Count-1)
}
-
答案:
-
填写下表的右边一栏,这个表描述的是图4-17中目标代码第7行上的popl指令的处理情况:
-
答案:我们可以看到指令位于地址。0x01c,由两个字节组成,值分别为0xb0和0x08。pushl指令(第6行)将寄存器%esp设为了124,并且将9存放在了这个存储器位置。
代码托管
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 0/0 | 2/2 | 5/5 | |
第二周 | 100/100 | 3/4 | 10/15 | |
第三周 | 100/200 | 4/5 | 20/35 | |
第四周 | 200/400 | 2/7 | 25/60 | |
第五周 | 1000/1400 | 2/9 | 35/95 | |
第六周 | 300/1700 | 3/12 | 50/135 | |
第七周 | 200/1900 | 2/14 | 45/180 | |
第八周 | 200/2100 | 1/15 | 55/235 | |
第九周 | 300/2400 | 3/18 | 45/280 | |
第十周 | 200/2600 | 0/18 | 20/300 | |
第十一周 | 100/2700 | 2/20 | 45/345 | |
第十四周 | 100/2800 | 1/24 | 35/445 |