2017-2018-1 20155205 《信息安全系统设计基础》第五周学习总结
2017-2018-1 20155205 《信息安全系统设计基础》第五周学习总结
教材学习内容总结
-
数据传送指令有三种:movb(传送字节)、movw(传送字)和movl(传送双字)。
-
调试学习p107代码,产生汇编文件后内容为如下。前面的Ltmp是标签,不是命令。
使用od code.o查看二进制文件:
使用godjdump -d code.o查看目标代码文件的内容:
教材学习中的问题和解决过程
-
问题1:p106提到“编译选项-O1告诉编译器使用第一级优化”其中的第一级优化具体优化了什么?对于编译器一共有多少级优化?
-
问题1解决方案:上网找了一下相关资料,根据编译器三级优化都干了什么?这一博客的内容,我知道了:
GNU编译器提供-O选项供程序优化使用:
- -O 提供基础级别的优化
- -O2提供更加高级的代码优化,会占用更长的编译时间
- -O3 提供最高级的代码优化
- -O4 不优化,这是默认值
第一级:代码调整
代码调整是一种局部的思维方式;基本上不触及算法层级;它面向的是代码,而不是问题; 所以:语句调整,用汇编重写、指令调整、换一种语言实现、换一个编译器、循环展开、参数传递优化等都属于这一级;这个级别的优化需要掌握大量的小的优化技巧和知识,需要不断的积累;这个级别试图执行9种单独的优化功能:-fdefer-pop、-fmerge-constans等。
第二级:新的视角
新的视角强调的重点是针对问题的算法;即选择和构造适合于问题的算法;(冒泡排序还是快排的选择问题是这一级早就应该完成的)很多经典算法都对问题作了一些假设(包括我们当前已经完成的算法实现),而在面对实际问题时“新的视角”提示我们应该重新检视这些假设,并尝试不同的思考问题的角度,寻求适合于问题的新算法。
第三级:表驱动状态机
将问题抽象为另一种等价的数学模型或假想机器模型,比如构造出某种表驱动状态机;这一级其实是第二级的延伸,只是产生的效果更加明显,但它有其本身的特点(任何算法和优化活动都可以看作是他的投影),它整合了第一和第二级别中的左右优化技巧, 还包括其他三种优化。
- 问题2:练习题3.1中的260(%ecx,%edx)值为什么是0x13?
- 问题2解决方案:这里只要注意计算方法(十六进制加法)即可,260(%ecx,%edx),间接寻址,%eax、%edx值相加,再偏置260
代码调试中的问题和解决过程
- 问题1:如何使用GDB调试查看分析寄存器的值?实践而非理论。
- 问题1解决方案:
测试代码为:
int add (int x,int y)
{
return x+y;
}
int main ()
{
int d=add(2,5);
printf("%d\n",d);
return 0;
}
之后进行gdb调试,再main和add处分别设置断点
运行到第一个断点,查看main的汇编代码:
输入命令:c,继续运行到add处,观察add的汇编:
可以用p命令查看esp和edp的值
但是输入x/16bx $edp
出现了下图错误:
并没有像网上教程一样出现寄存器内容,不知道是为什么?
代码托管
上周考试错题总结
- 错题1:针对以上代码:gcc -c *.c 可以得到m.o,swap.o两个模块,哪些符号会出现在swap.o模块的.symtab条目中()
A .buf
B .temp
C .swap
D .buffp0
- 分析:temp是局部变量,不出现在符号表中。
结对及互评
点评模板:
- 博客中值得学习的或问题:
- 对于指令和寄存器的学习很认真,总结很到位。
本周结对学习情况
- [20155218](http://www.cnblogs.com/xzh1996/p/7711413.html)
- 结对照片
- 结对学习内容
- 讨论mybash
其他(感悟、思考等,可选)
汇编的学习在我看来重点就是对指令的记忆。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 65/65 | 1/1 | 10/10 | |
第三周 | 120/185 | 2/3 | 15/15 | |
第五周 | 375/560 | 3/6 | 14/29 |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
-
计划学习时间:14小时
-
实际学习时间:14小时
-
改进情况:
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)