学习目标
找出全书你认为学得最差的一章,深入重新学习一下。
本周重点学习第四章:
-
总结新的收获
-
给你的结对学习搭档讲解或请教,并获取反馈
-
参考上面的学习总结模板,把学习过程通过博客(随笔)发表,博客标题“学号 《信息安全系统设计基础》第十四周学习总结”,博客(随笔)要通过作业提交,截至时间本周日 23:59。
教材学习内容总结
4.1
-
Y86具体包括:8个程序寄存器(上一章说过)、3个1位条件码ZFSFOF、程序计数器(PC,存当前正在执行指令的地址)。
-
程序状态的最后一个部分是状态码Stat,它表明程序执行的总体状态(正常还是异常)。
-
指令编码长度从1个字节到6个字节不等,一条指令含有一个单字节的指令指示符,可能含有一个单字节的寄存器指示符,还可能含有一个四字节的常数字。
Y86指令
-
movl:irmovl、rrmovl、mrmovl、rmmovl,分别显式地指明源和目的地的格式。第一个字母表明源的类型,i(立即数)、r(寄存器)或m(存储器 ),第二个字母代表目的,可以是r或者m。
-
整数操作指令OPl:addl、subl、andl和xorl。只对寄存器数据进行操作,同时还设置条件码。
-
跳转指令jXX:jmp、jle、jl、je、jne、jge、jg,根据分支指令的类型和条件码的设置来选择分支。
-
条件传送指令cmovXX:cmovle、cmovl、cmove、cmovne、cmovge和comvg,与寄存器-寄存器传送指令rrmovl一样,但只有当条件码满足所需要的约束时才会更新目的寄存器的值。
-
call指令将返回地址入栈,然后跳转到目的地址。ret指令从这样的过程调用中返回。
-
pushl和popl:入栈和出栈。
-
halt:停止指令的执行。
Y86状态码
-
出现异常时Y86处理器停止运行指令,可以调用一个异常处理程序(配置成不同结果)
-
保证栈不会增长的太大而覆盖程序的数据。
-
模拟器只打印在模拟过程中改变的寄存器或存储器中的字,左边原始值,右边最终值。
-
pushl指令的两种约定:a)压入/弹出%esp的原始值b)压入/弹出%esp-/+4后的值
4.2
- 在4.2.1学习了与或非,4.2.2用这三个逻辑组成位级电路,4.2.3使用多个位级电路组合成字级复合电路,4.2.4判断集合关系的通用格式````iexpr in {iexpr1,iexpr2,……,iexprk```。
4.2.5
-
存储设备都是由同一个时钟控制,两类存储器设备包括:
①:时钟寄存器(寄存器):储存单个位或字,用时钟信号控制寄存器加载输入值。
②:随机访问储存器(储存器):储存多个字,用地址选择该读/写哪个字。 -
硬件和机器级编程中的寄存器有细微差别,分为称为“硬件寄存器”和“程序寄存器”。
-
寄存器文件结构(内含8个程序寄存器):
-
处理器有一个随机访问存储器来存储程序数据。
4.3
- SEQ处理器:每一个时钟周期上,SEQ执行处理一条完整指令所需的所有步骤。
将处理组织成阶段
-
取址:valP:PC的值加上已取出指令的长度。
-
译码:读入指令rA和rB字段指明的寄存器。
-
执行:ALU执行指令指明的操作,计算存储器引用的有效地址,要么增加或者减少栈指针,得到的值为valE;对跳转指令来说,这个阶段会检验条件码和分支条件。
-
访存:可以将数据写入存储器,或者从存储器读出数据。置为valM。
-
写回:最多可以写两个结果到寄存器文件。
-
更新:将PC设置成下一条指令的地址。
-
执行一条指令需要的处理过程
执行指令所表明的操作、计算地址、更新栈指针、确定下一条指令的地址。
-
对于三种控制转移指令的处理:需要注意位信号Cnd。
-
在更新PC阶段,检查这个标志,如果这个标志为1,将PC设为valC(跳转目标),如果为0,就设为valP(下一条指令的地址)。
-
SEQ硬件结构
实现所有Y86指令所需要的计算可以组织成6个阶段:取值、译码、执行、访存、写回和更新PC。 在SEQ中,所有硬件单元的处理都在一个时钟周期内完成。
- SEQ的时序
SEQ的实现包括组合逻辑和两种存储器设备:时钟寄存器(程序计数器和条件码寄存器),随机访问存储器(寄存器文件、指令存储器和数据存储器)。
每个时钟周期,程序计数器都会装在新的指令地址;只有在执行整数运算指令时,才会装载条件码寄存器;只有在执行rmmovl、pushl或call指令时,才会写数据存储器;寄存器文件的两个写端口允许每个时钟周期更新两个程序寄存器。
- 处理器的原则
处理器从来不需要为了完成一条指令的执行而去读由该指令更新了的状态。
- SEQ阶段的实现
nop指令:除了将PC加1,不进行任何处理;
halt指令:将处理器状态设置为HLT,导致处理器停止运行。
ISA
-
ISA简称架构(Architecture),是处理器的一个抽象描述,即设计规范,定义处理器能够做什么。其本质就是一系列的指令集综合。当前主流的ISA有X86、ARM、MIPS、Power、C6000。
-
ISA在编译器编写者和处理器设计人员之间提供了一个抽象层:
-
处理器设计者:依据ISA来设计处理器
-
处理器使用者:依据ISA就知道CPU选用的指令集,就知道自己可以使用哪些指令以及遵循哪些规范
ISA中包含以下内容
指令集
指令集编码
基本数据类型
一组编程规范
寄存器
寻址模式
存储体系
异常事件处理
中断
外部I/O
课后部分作业及实现
- 4.1:确定下面的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。
- 4.2:确定下列每个字节序列所编码的Y86指令序列。如果序列中有不合法的字节,指出指令序列中不合法值出现的位置。每个序列都先给出了起始地址,冒号,然后是字节序列。
答案:
A:带有立即数和地址偏移量的操作。
B:包含函数调用的代码。
C:包含非法指令指示字节0xf0的代码。
D:包含跳转操作的代码。
E:pushl指令中第二个字节非法的代码。
- 4.4:根据下面的C代码,用Y86代码来实现一个递归求和函数rSum
long rsum(long *Start, long Count)
{
if (Count <=0)
return 0;
return *Start+rSum(Start+1,Count-1)
}
答案:
- 4.13:填写下表的右边一栏,这个表描述的是图4-17中目标代码第7行上的popl指令的处理情况:
答案:
我们可以看到指令位于地址。0x01c,由两个字节组成,值分别为0xb0和0x08。pushl指令(第6行)将寄存器%esp设为了124,并且将9存放在了这个存储器的位置。
该指令将%eax设为9,将%esp设为128,并将PC加20。
- 根据图4-18~图4-21中执行阶段第一步的第一个操作数,写出SEQ中信号aluB的HCL描述。
答案:
int aluB=[
icode in { IRMMOVL, IMRMOVL,IOPL, ICALL,
IPUSHL,IRET,IPOPL}: valB;
icode in { IRRMOVL, IIRMOVL }:0;
#Other instructions don't need ALU
];
- 让我们来看看图4-32中的系统,假设将它划分成任意数量的流水线阶段k,每个阶段有相同的延迟300/k,每个流水线寄存器的延迟为20ps。
A.系统的延迟和吞吐量写成k}的函数是什么?
B.吞吐量的上限等于多少?
答案:
每个阶段的组合逻辑都需要300/kps,而流水线寄存器需要20ps。
A.整个的延迟应该是300 + 20k ps,而吞吐量(以GIPS为单位)应该是
1000/(300/k+20)=1000k/(300+20k)
B.当k趋近于无穷大,吞吐量变为1000/20=50 GIPS。当然,这也使得延迟为无穷大。
代码托管
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 7/7 | 1/1 | 4/4 | |
第三周 | 62/69 | 2/3 | 15/19 | |
第五周 | 161/230 | 2/5 | 22/41 | |
第七周 | 82/312 | 1/6 | 17/58 | |
第八周 | 140/452 | 1/7 | 15/73 | |
第九周 | 57/509 | 3/10 | 18/91 | |
第十一周 | 104/613 | 1/11 | 14/105 | |
第十三周 | 276/889 | 2/13 | 19/124 | |
第十四周 | 145/1034 | 1/14 | 15/139 |