2017-2018-1 20155333 《信息安全系统设计基础》第十三周学习总结

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小时

  • 改进情况:

(有空多看看现代软件工程 课件
软件工程师能力自我评价表
)

参考资料

posted @ 2017-12-17 23:29  弥光  阅读(169)  评论(0编辑  收藏  举报