2017-2018-1 20155225 《信息安全系统设计基础》第七周学习总结
教材学习内容总结
学习目标:
- 了解ISA抽象的作用
ISA:一个处理器支持的指令和指令的字节级编码称为它的指令集体系结构。
ISA在编译器编写者(只需知道允许哪些指令以及指令编码)和处理器设计者(建造出执行这些指令的处理器)之间提供了一个概念抽象层。
但现代处理器实际工作方式并非ISA模型里的顺序执行,而是同时执行多条指令的不同部分。
- 掌握ISA,并能举一反三学习其他体系结构
学习重点:
4.1 Y86-64指令体系架构
学习Y86首先需要安装并学会使用Y86模拟器。
安装过程可以参考ubuntu12.04 安装CS:APP Y86模拟器
Y86模拟器使用详解参考CS:APP2e Y86处理器模拟器∗指南
以课堂实践为例:
“求命令行传入整数参数的和”C语言程序代码如下:
#include <stdio.h>
int main(int argc,char *argv[])
{
int sum=0;
int num[argc];
int i;
for(i=0;i<argc;i++)
{
num[i]=atoi(argv[i]);
sum=sum+num[i];
}
printf("%d",sum);
}
在课堂上完成了编写C语言程序和反汇编。接下来补充说明如何翻译X86为Y86
参考书上251页和252页两个实例。将x86汇编翻译为y86汇编,代码类似,需要注意以下几点:
- Y86中要将常数加载到寄存器再进行计算,它在算术指令中不能使用立即数。
- 要实现从内存读取一个数值并将其与一个寄存器相加,Y86需要两条指令。
- Y86的整数操作指令会设置条件码,不需要testq指令。
- 由于Y86-64指令集中所以操作都以8个字节为单位,所以在转换“movl,addl”这些四字节指令时要注意。
基于以上四点,列举几处我翻译的Y86汇编代码如下:
subq $56, %rsp改为irmovq $56,%r8;subq %r8,%rsp
movl %edi, -52(%rbp)改为rmmovq %rdi,-52(%rbp)
movl $0, -48(%rbp) 改为
irmovq 0xffffffff00000000,%r8
mrmovq -48(%rbp),%r9 #取8字节的内存单元-48(%rbp) 的值
andq %r8,%r9 #给低四个字节置0,高四个字节不变
rmmovq %r9, -48(%rbp)
addl $1, -44(%rbp)改为
mrmovq -44(%rbp),%r13
irmovq $1,%r12
addq %r12,%r13
X86汇编代码和Y86汇编代码均在码云上,代码
4.2 逻辑设计和硬件控制语言HCL
- 逻辑门是数字电路的基本计算元素,它们产生的输出,等于它们输入位值的某个布尔函数。一旦一个门的输入变化,在短时间内,输出就会跟着变化。
- 将很多逻辑门组合成一个网,就能构建计算块,称为组合电路。
- 通过将逻辑门组合成大的网,可以构造出能计算更加复杂函数的组合电路。能对数据字进行操作的电路,称为字级的组合电路。
- 在处理器设计中,很多时候需要将一个信号与许多可能匹配的信号做比较,一次来检测正在处理的某个指令代码是否属于某一类指令代码。可以用集合关系来表示这样的属性。
- 为了产生时序电路,引入按位存储信息的设备,都由同一个时钟控制。两类存储器设备:时钟寄存器,随机访问存储器。时钟寄存器保存程序计数器(PC)、条件代码(CC)、程序状态(Stat)。
4.3 Y86-64的顺序实现
-
处理一条指令的阶段:
- 取指(fetch)
- 译码(decode)
- 执行(execute)
- 访存(memory)
- 写回(write back)
- 更新PC(PC update)
-
SEQ硬件结构(顺序的硬件结构)
在SEQ中,所有的硬件单元的处理都是在一个时钟周期内完成的。
SEQ的实现包括组合逻辑和两种存储器设备,遵循处理器从不回读的原则。
教材学习中的问题和解决过程
-
问题1:书上p251,Y86-64code,第5行代码andq %rsi,%rsi (Set CC),看不懂
-
问题1解决方案:看了书后面练习题4.5的答案,知道了这是设置条件码(condition codes)。
-
问题2:练习题3.3中,movb $0xf , (%ebx),这行代码的错误原因是%ebx不能作为地址寄存器。
-
问题2解决方案:参考什么时候应该使用ebx这个寄存器,3.3题解答
-
问题3:练习题3.9中,在将移位量放入%cl中时,移位量存放在%rsi中。是movl %esi , %ecx;但移位量仅由cl决定啊,为什么不直接是movb %sil , %cl;
-
解决方案:这里是为了和前面的代码统一。
代码调试中的问题和解决过程
- 问题1:在翻译x86为Y86汇编时,发现存在问题:跳转语句和跳转标签无效
解决方案:我又重新仔细看了书上Y86跳转语句的实现。发现在x86里用的标签是.L2,.L3等,但在Y86里是用的loop,test等标签,尝试修改看能不能成功。
修改后编译成功。
其他(感悟、思考等,可选)
Y86指令集的数据类型、指令、寻址方式比较少,通过仔细手动翻译x86汇编程序帮助我对汇编命令理解得更仔细。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 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 | |
第五周 | 500/1000 | 3/7 | 22/60 | |
第六周 | 300/1300 | 2/9 | 30/90 | |
第七周 | 200/1300 | 2/9 | 15/90 |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
-
计划学习时间:15小时
-
实际学习时间:10小时
-
改进情况: