2017-2018-1 20155333 《信息安全系统设计基础》第十三周学习总结
教材学习内容总结
IA32指令的细节
1、 区分字节与字:Intel使用术语“字”表示16位数据类型而“字节”代表的是8个位的数据。
2、 访问信息
-
传送指令:move 源--> 目的地(两个操作数不能同时指向存储器,需要寄存器周转)
-
指针:就是地址,间接引用指针就是将指针放入一个寄存器中,然后在存储器中使用这个寄存器
栈数据的基本理解:
-
push指令相当于:sub $4, %esp 然后move %ebp, (%esp)
-
pop指令相当于:move (%esp), %eax 然后 add $4, %esp
-
栈的数据结构是向低地址方向增长的,无论如何esp都是指向栈顶顶
3、算数和逻辑操作
加载有效地址指令:leal S, D ==> (&S-->D) 将有效地址写入到目的操作数中去
汇编代码与C语言源码中的顺序可能不同:
4、改变执行顺序
a.机器机制
常见的条件码寄存器有:
可以通过cmp和test设置条件码寄存器:
通过set指令访问条件码,用处是设置值 or 跳转 or 传送数据:
跳转指令(对于理解链接非常重要):
- 直接跳转用:‘.’
- 间接跳转用:'*'
理解跳转指令的目标编码:
jle跳转指令中的0d并不是目标地址,而真正的地址是通过计算0d+0a来确定的,这样做的优点是:通过使用与机器相关目标使得代码简洁,可以使目标代码移到存储器中而不是简单的地址,执行的是程序计数器与目标代码的加法。
b 翻译条件分支
通过将C代码翻译成不良好的goto语句可以方便我们理解汇编代码的执行方式。汇编程序通过条件测试和跳转来实现循环,常见的循环语句其实都是翻译成了do-while形式的:
while循环会先转成do-while形式:
for循环也是一样的道理,先转成do-while形式:
switch语句:使用一个数组作为跳转表
如何调用函数
- 单个过程分配一个栈帧结构:
1、 转移控制
其中call先将返回地址入栈,然后跳转到函数开始的地方执行。(返回地址是开始调用者执行call的后面那条指令的地址)当遇到ret指令的时候,弹出返回地址,并跳转到该处继续执行调用者剩余部分。
2、递归的过程
递归的调用其实与其他函数的调用是一样的,因为计算机使用的是栈帧结构,为每个单独的调用创建了一个栈帧,每次调用都有私有的状态信息。
数组的分配与访问
1、基本原则
声明过后数组的具体位置
汇编代码使用move指令来简化访问:
movl (%edx , %ecx, 4), %eax
假设E是一个int类型的数组,要计算E[i]的值,在此,E的地址放于edx中,而i放于ecx中,我们通过上面的指令就完成了Xe + 4i来读取其中的值,放在了eax中去。
2、指针运算:对指针的运算其实际是按照相应的数据大小进行了伸缩
point + i = Xp + (数据大小)L * i
如何计算二维数组的大小呢?
定义一个int D[5][3]的数组,形如
如果我们要计算D[4,2]的地址,就可以使用
D[i][j] = Xd + L(C * i + j) = D[0,0] + 4 * (3 * 4 + 2)
由于每组有3个数据,所以跳过一组就要乘以3,跳过4组就12个,再加上偏移的2,就是最后一个数据的地址了。
3、 指针
①指针用&符号创造、用*符号间接引用
②指针从一个类型 转为另外一个类型,只是伸缩因子变化,不改变它的值
③指针可以指向函数:int (*f)(int *)从f开始由内往外阅读,首先f代表的是一个指向函数的指针,这个函数的参数是int * 返回值是int
教材学习中的问题和解决过程
- 问题1:c语言代码、汇编代码、机器代码之间的关系?
- 问题1解决方案:这三者关系的大概顺序是:
①C预处理器扩展源代码,展开所以的#include命名的指定文件;
②编译器产生汇编代码(.s);
③汇编器将汇编代码转化成二进制目标文件(.o)。
- 问题2:帧指针与栈指针的不同之处?
- 问题2解决方案:ebp在参数与返回地址的最下方,方便计算参数的偏移位置;而esp一直在栈顶,可以通过push将数据压入,通过pop取出,增加指针来释放空间。
- 问题3:什么情况下会使用栈帧结构?
- 问题3解决方案:
-
- 局部变量太多,不能都放在寄存器中;
-
- 有些局部变量是数组或者结构;
-
- 函数用取地址操作符(&)来计算一个局部变量的地址;
-
- 函数必须将栈上的某些参数传递到另一个函数;
-
- 在修改一个被调用者保存寄存器之前,函数需要保存它的状态。
- 问题4:寄存器使用惯例
- 问题4解决方案:
-
- %eax、%edx、%ecx被划分为调用者保存(caller save)寄存器。
-
- %ebx、%esi、%edi被划分为被调用者保存(callee save)寄存器。
- ...
代码调试中的问题和解决过程
- 问题1:XXXXXX
- 问题1解决方案:XXXXXX
- 问题2:XXXXXX
- 问题2解决方案:XXXXXX
- ...
代码托管
上周考试错题总结
- 错题1及原因,理解情况
- 错题2及原因,理解情况
- ...
结对及互评
点评模板:
- 博客中值得学习的或问题:
- xxx
- xxx
- ...
- 代码中值得学习的或问题:
- xxx
- xxx
- ...
- 其他
本周结对学习情况
- [2015532](http://www.cnblogs.com/zjy1997/)
- 结对照片
- 结对学习内容
- 教材第三章
- 实验五通讯协议设计
- ...
其他(感悟、思考等,可选)
xxx
xxx
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 10/10 | 1/1 | 10/10 | |
第二周 | 80/90 | 1/2 | 15/25 | |
第三周 | 100/190 | 1/3 | 15/40 | |
第四周 | 150/340 | 1/4 | 18/58 | |
第五周 | 2/6 | 20/78 | ||
第六周 | 2/8 | 20/98 | ||
第七周 | 2124/ | 2/10 | 20/118 | |
第八周 | 2/12 | 30/148 |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
-
计划学习时间:25小时
-
实际学习时间:20小时
-
改进情况:
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)