2019-2020-1 20175320 《信息安全系统设计基础》第五周学习总结
一、教材学习内容总结
本周我们了解了在计算机系统中程序的机器级表示。通过反汇编器可以将机器码转化为类似汇编代码的格式,而该章节内容的主要介绍了在x86-64中的汇编指令以及汇编指令与c代码之间的转化。虽然同样是汇编,但与我们上学期学习的8086中的汇编语句有着一定的区别,以下是本章节需要注意的内容:
- objdump命令:通过
objdump -d 文件名+后缀
可以将机器码转化为汇编代码,这是进行分析的重要前提条件。 - 寄存器的前缀不同,对应的存储长度不同。%r是64位、%e是32位、%是16位及以下的寄存器,在进行算术和逻辑操作时,必须通过前缀选择正确长度的寄存器。
- 操作数有多种寻址方式,我们需要熟悉各种虚拟地址的寻址方式。
- x86-64中的数据传送指令以及各种算术和逻辑操作指令的两个操作数的关系相较于8086是相反的,这是与8086最大的区别。
- 各种操作指令可以通过后缀来指定数据的位数,或者进行数据长度之间的转换,但操作指令规定的长度一定要与寄存器长度相匹配,比如movq、movabsq、movswl等指令。
- 在使用mov指令时,不可以两个操作数同为存储器,且立即数不能作为目的地址。
- 在x86-64中,栈操作指令总是以四字作为出以及入栈的单位。
- 在移位操作中,左移与右移的效果有所区别。shl与sal的效果是一样的,sar是补充零比特,shr是补充符号位。
- cmp以及test指令的作用与8086中的效果类似,set指令根据条件码的某种组合,将一个字节设置为0或者1。
- 有些指令分有符号数以及无符号数的情况,通过这些指令可以推出操作数的数据类型。
- 跳转指令有PC相对以及绝对两种寻址方式,相对寻址方式会将目标指令的地址与紧跟在跳转指令后面那条指令的地址之间的差作为编码,且该差值用补码的方式表示,且跳转指令本身占据两个字节的空间。
- 通过条件控制以及条件传送语句可以实现条件分支。
- 使用跳转表可以实现c语言中的switch语句,跳转表中的内容是代码指针,跳转表名称是一个指向代码指针块地址的指针。
二、教材学习中的问题和解决过程
由于有上学期8086下汇编的基础,对于教材内容的理解并没有问题,只是需要注意x86-64汇编语言与8086汇编细节部分的区别,并熟悉x86-64中修改以及添加的概念以及指令。
三、代码调试过程
主要是练习将生成的.s汇编文件通过vim进行查看,并通过objdump命令来将.o文件进行反汇编,运行结果如图:
四、上周考试错题总结
问题一:
问题一解析:字符串与字符,ascii码与字符要区分清楚。
五、其他(感悟、思考等,可选)
本周内容的重点是如何看懂由机器码反编译而来的基于x86-64的汇编代码,在学习过程中可以参考8086中的汇编语言,这可以一定程度上减轻我们的负担,但一定要注意与8086的区别,不可以用旧有的思维方式看待x86-64中的问题。虽然可以通过以前的内容来方便我们的理解,但实际上本章的内容仍然十分繁琐,需要我们有一定的耐心。
六、学习进度条
博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | ||
---|---|---|---|---|
目标 | 30篇 | 400小时 | ||
第一周 | 1/1 | 13/13 | ||
第二周 | 1/2 | 22/35 | ||
第三周 | 1/3 | 30/65 |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。 耗时估计的公式 :Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
- 计划学习时间:XX小时
- 实际学习时间:XX小时
- 改进情况:
(有空多看看现代软件工程 课件 软件工程师能力自我评价表)