2017-2018-1 20155334 《信息安全系统设计基础》第十四周学习总结
找出全书你认为学得最差的一章,深入重新学习一下:
- 总结新的收获
- 给你的结对学习搭档讲解或请教,并获取反馈
- 参考上面的学习总结模板,把学习过程通过博客发表。
本周我选择的是第三章程序的机器级表示
3.2 程序编码
计算机机器级编程重要的两类抽象:
-
第一种是将整个计算机中的存储器地址用虚拟地址来抽象,使得存储器地址是一个非常大的字节数组。这个抽象对应的实际计算机基础是一些分离的硬件存储器和操作系统软件。
-
第二种是将机器级程序的格式和行为抽象形成instruction set architecture,即ISA(指令集体系结构)。
ISA有以下基本观念:IA32的ISA
和x86-64的ISA
,在抽象时都将指令按顺序执行抽象。处理器的硬件可以并发地执行许多指令,并且采用了一些保护措施来确保并行执行结果和一条条顺序执行结果一样。
操作系统负责管理虚拟地址空间,将虚拟地址翻译成实际处理器存储器中的物理地址。
当一个源文件生成了'.o'的目标二进制文件后,无法直接查看。对'.o'目标文件使用反汇编,它的输出还是二进制文件,但是,反汇编器将这些二进制按照指令进行了分段,可以知道哪一段是一个指令。
关于ISA的指令,我们要有以下基本观念:
- ISA中每条指令占用字节数不等,常用的指令所需的字节数少,不太常用的指令的字节数多。这样的话,相对于每条指令占用等长字节数的ISA,这种占用字节数不等的ISA为程序产生的总空间要更少。
- ISA中的指令在设计时,达到了一个效果,对于一个二进制指令串,从某个字节开始,译码的结果是唯一的。
- 反汇编器只是基于机器代码文件中的字节序列来确定汇编代码,不需要访问程序的源代码或汇编代码。
3.3 数据格式
由于是从16位体系结构扩展成32位,intel用术语字(word)表示16位数据类型,因此32位为双字(double words),64位数为4字(quad words)。
以下是比较容易模糊的数据类型大小:
32位机上:float 4、long int 4、double 8、longlong 8、char* 4、unsigned long 4
64位机上:float 4、long int 8、double 8、longlong 8、char* 8、unsigned long 8
另外,GCC 用long double表示扩展精度(10字节),出于存储器性能考虑,会被存储为12字节
3.4访问信息
一个IA32 CPU包含一组8个存储32位值的寄存器,用以存整数数据和指针:%eax,%ecx,%edx,%ebx,%esi,%edi,%esp,%ebp。大多数情况下前六个都用作通用寄存器,%eax,%ecx,%edx的保存和恢复惯例不同于%ebx,%edi,%esi;最后两个用于存储指针,由于在过处理中非常重要,分别指向栈帧的顶部和底部。
操作数指示符
大多数指令有一到多个操作数,操作数有三种:
立即数:即常数值
寄存器:表示某个寄存器内容
存储器引用:根据计算出来的地址(通常称有效地址)访问某个存储器位置
因此寻址方式也有多种,如:立即数寻址、寄存器寻址、绝对寻址、间接寻址、变址寻址、比例变址寻址……
数据传送指令
几个重要数据传送指令:MOV类、pop、push。
MOV类,movb传送字节、movw传送字、movl传送双字,MOVS、MOVZ分别为符号扩展、零扩展,它们只拷贝一个字节,源操作数均为单字节,并设置目的操作数中其余的位,效果如下:
初始假设:%dh=CD %eax=98765432
1 movb %dh,%al ;%eax=987654CD
2 movsbl %dh,%eax ;%eax=FFFFFFCD(目的操作数高24位设为源字节最高位,在这里很显然为1,所以前24位为全F)
3 movzbl %dh,%eax ;%eax=000000CD(目的操作数高24位被设为0)
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 75/75 | 1/1 | 5/0 | |
第二周 | 135/210 | 1/2 | 4/9 | |
第三周 | 234/444 | 1/3 | 6/15 | |
第四周 | 486/930 | 1/4 | 8/23 | |
第五周 | 753/1683 | 3/7 | 43/66 | |
第六周 | 503/2186 | 2/9 | 54/120 | |
第七周 | 823/3006 | 2/11 | 43/163 | |
第八周 | 756/3762 | 1/12 | 52/215 | |
第九周 | 1120/4882 | 3/15 | 63/278 | |
第十周 | 420/5302 | 0/15 | 32/310 | |
第十一周 | 531/5833 | 2/17 | 46/356 | |
第十二周 | 243/6076 | 0/17 | 20/376 | |
第十三周 | 359/6435 | 2/19 | 42/418 | |
第十四周 | 126/6561 | 1/20 | 22/440 |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
-
计划学习时间:XX小时
-
实际学习时间:XX小时
-
改进情况:
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)