2017-2018-1 20155302 《信息安全系统设计基础》第5周学习总结
教材学习内容总结
用Unix命令编译.C代码linux> gcc -Og -o p p1.c p2.c
C预处理器扩展源代码插入所有用#include命令指定的文件并拓展所有用#define声明指定的宏。其次编译器产生两个源文件的汇编代码名字分别为p1.o和p2.o。最后链接器将两个目标代码文件与实现库函数的代码合并并产生最终的可执行代码文件p。
程序内存包括:程序的可执行机器代码,操作系统需要的一些信息,用来管理过程调用和返回的运行时栈,以及用户分配的内存块。
在命令行上使用“-S”选项,就能看到C语言编译器产生的汇编代码:linux> gcc -Og -S xxx.c
会产生一个汇编文件xxx.s。
linux> gcc -Og -c xxx.c
产生目标代码文件xxx.o无法直接查看。
反汇编器程序根据机器代码产生一种类似于汇编代码的格式。在linux中带“-d”命令标志的程序OBJDUMP可以充当这个角色。
浮点数主要有两种形式:单精度(4字节)值,对应于C语言数据类型float;双精度(8字节)值,对英语C语言数据类型double。
数据传送指令有四个变种:movb(传送字节)、movw(传送字)、movl(传送双字)、movq(传送四字)。后缀1用来表示双字,因为32位数被看成是“长字(long word)”。
各种不同的操作数的可能性被分为三种类型:第一种类型是立即数,第二种类型是寄存器,第三类操作数是内存引用。
ISA 将指令的执行描述为顺序执行:一条执行完成之后,下一条才开始执行。 但实际上处理器是并发的执行指令,通过一些措施来保证整体的执行顺序和ISA指定的顺序执行顺序完全一致。
每条指令名字的最后两个字符都是大小指示符:第一个字符指定源的大小,而第二个指明目的大小。
指令集体系结构或指令集架构(Instruction set architecture,ISA):定义机器级程序的格式和行为,它定义了处理器的状态,指令的格式,以及每一条指令对状态的影响。
栈是一种数据结构,可以添加或删除值,不过要遵循“后进先出”的原则。通过push操作把数据压入栈中,通过pop操作删除数据;它具有一个属性:弹出的值永远是最近被压入而且仍然在栈中的值。
1 假设过程P(调用者)调用过程Q(被调用者),则Q的参数放在P的栈帧中。 2. 另外,当P调用Q时,P中的返回地址被压入栈中,形成P的栈帧的末尾。 3. 返回地址就是当程序从Q返回时应该继续执行的地方。
程序寄存器组是唯一能够被所有过程共享的资源。 虽然在给定时刻只能有一个过程是活动的,但是我们必须保证当一个过程调用另一个过程时, 被调用者不会覆盖某个调用者稍后会使用的寄存器的值。 根据惯例,寄存器 %eax、%edx、%ecx 被划分为 调用者保存 寄存器。 当过程P调用Q时,Q可以覆盖这些寄存器,而不会破坏任何P所需要的数据。 另一方面,寄存器 %ebx、%esi、%edi 被划分为 被调用者保存 寄存器。
常用条件码:CF:进位标志。ZF:零标志。SF:符号标志。OF:溢出标志。
不是所有的条件表达式都可以用条件传送来编译。最重要的是,无论测试结果如何,我们给出的抽象代码会对then-expr和else-expr都求值。
Gcc和其他汇编器产生的循环代码主要基于两种基本的循环模式。我们会循序渐进地研究循环的翻译,从do-while开始,然后再研究具有更复杂实现的循环,并覆盖这两种模式。
C语言中提供了两种将不同类型的对象组合到一起创建数据类型的机制:结构,用关键字struct来声明,将多个对象集合到一个单位中:联合,用关键字union来声明,允许用几种不同的类型来引用一个对象。
教材学习中的问题和解决过程
3.15 题目:mov指令的地址是多少
XXXXXXX: 72 12 je 8048391
XXXXXXX: b8 00 00 00 00 mov $0x0,%eax
解决方法:根据反汇编器产生的注释,跳转目标是绝对地址ox8048391,得到mov指令地址ox8048391-ox12=ox804837f
十六进制的转化掌握的不牢固,还需多多练习。
代码调试中的问题和解决过程
本周所看课本内容第三章较多,主要学习了课本知识代码也是敲得书中的,没有太多的扩展练习,所以没有发现代码调试中的问题。
代码托管
https://gitee.com/bestiisjava2017/yxc20155302/tree/master/src/信息安全系统设计基础20155302
其他(感悟、思考等,可选)
本周学习章节内容繁多但一部分进制转换的内容以及补码反码等内容在以前的课程中都已学过有所接触,
但其中有符号数和无符号数的计算以及转换,还有反码编码和浮点数的计算及定义还是颇为难以理解的,需要在课下付出更大的努力和更多的时间投入到这章的学习中。
学习进度条
代码行数(新增积) | 博客量(新增积) | 学习时间(新增积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 0/0 | 2/2 | 20/20 | |
第二周 | 0/0 | 2/4 | 18/38 | |
第三周 | 80/80 | 3/7 | 22/60 | |
第四周 | 180/260 | 2/9 | 30/90 | |
第五周 | 218/478 | 2/11 | 20/110 |
-
计划学习时间:XX小时
-
实际学习时间:XX小时
-
改进情况:
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)