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

    • 改进情况:

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

    参考资料

  • 相关阅读:
    U9在SQL Server上的性能优化经验(转述) — 之 分页
    家里买了XBOX 360 Kinect
    哦,真是“不幸”的消息
    U9在SQL Server上的性能优化经验(转述) — 之 包含列索引
    Silverlight 4处理StartWith的BUG
    IIS HTTP重定向配置、参数设置
    【代码保留】怎样添加一个多选搜索引擎
    NSLog 使用
    ObjectiveC(IOS)推荐的属性读写方法
    16进制颜色(html颜色值)字符串转为UIColor
  • 原文地址:https://www.cnblogs.com/rh123456/p/8053880.html
Copyright © 2020-2023  润新知