2017-2018-1 20155223 《信息安全系统设计基础》第5周学习总结
2017-2018-1 20155223 《信息安全系统设计基础》第5周学习总结
教材学习内容总结
逆向工程
正常的设计过程是设计人员在脑中构思出产品结构、性能和大致的技术参数,然后在细节设计中完善各类数据模型,最后将模型导入总设计中以完成产品设计。而逆向工程则是先获取已有的成品,然后通过反向分析推导出完成该产品所需的大部分数据。在计算机编程当中,使用逆向工程通常指的是对已有软件进行反汇编(反向开大日代码……),通过汇编代码来得到目标软件的设计思路及实现方式。
指令集体系结构
ISA(指令集体系结构)包含以下四种: 复杂指令集运算(Complex Instruction Set Computing,CISC);精简指令集运算(Reduced Instruction Set Computing,RISC) ;显式并行指令集运算(Explicitly Parallel Instruction Computing,EPIC);超长指令字指令集运算(VLIW)。其中CISC、EPIC能在64位操作系统中使用;RISC不能在Windows系统下运行;VLIW是一种将多条指令缩编到一个指令字上的指令集运算,能够有效利用计算机CPU。
函数调用栈帧的变化
某份被反汇编的代码:
#include<stdio.h>
int fun(int x, int y)
{
int c = 0xcccccccc;
return c;
}
int main()
{
int a = 0xaaaaaaaa;
int b = 0xbbbbbbbb;
int ret = fun(a, b);
printf("You should runing here!\n");
return 0;
}
- 先是主函数的堆栈基址入栈,以保存之前任务的信息。
- 然后将主函数的栈顶指针的值赋给堆栈基址,作为新的基址(即被调用的函数fun()的栈底)。
- 然后在这个基址(fun()函数的栈底)上开辟(一般用sub命令)相应的空间用作被调用者fun()函数的栈空间。
- 函数fun()返回后,从当前栈帧的栈底即恢复为调用者函数main()的栈顶,使栈顶恢复函数fun()被调用前的位置,然后调用者main()再从恢复后的栈顶弹出之前的ebp值(可以这么做是因为这个值在函数调用前前一步被压入栈”main():retaddr”)。这样,堆栈基址和栈顶指针就都恢复了调用函数fun()之前的位置,也就是栈恢复函数fun()调用前的状态。
浮点机器代码
与C语言、Java不同,汇编语言只有一种浮点数float。AVX2指令集比原来的代码,更能提升CPU的浮点数运算能力。AVX的浮点数运算代码与汇编语言的整数运算代码相似,都使用一组寄存器保存和操作数值,也用同一组寄存器来传递函数参数。
教材学习中的问题和解决过程
- 问题1:ISA体系下有四种指令集运算,其中2种明确只能在64位机器上使用,VLIW是将多条代码缩编到一个指令字上,并没有明确说明适用于32位机或64位机或两者皆可。那么32位机的ISA是怎么样的?
- 问题1解决方案:已经上网寻找答案,但是网上并没有直接给出32位机的ISA体系结构。现在的情况是:ISA体系下的四种指令集中有两种(EPIC和CISC)是不可能在我的32位机使用的,VLIW尚不清楚,只剩RISC一种我是确定能使用的(在虚拟机)。
- 问题2:AVX2浮点数计算基于x86-64CPU,然而我的笔记本确定是台32位机,能不能用我心里没底。
- 问题2解决方案:虚拟机是64位的,就可能用得上AVX2的浮点代码。
代码调试中的问题和解决过程
- 问题1:反汇编出来的代码看不太懂。
- 问题1解决方案:下载一份汇编代码汇总,看到一条代码就翻汇总,就不信看不懂!
代码托管
上周考试错题总结
活动在博客发布前活动还没有结束,查不到错题。
其他(感悟、思考等,可选)
有谁知道哪里或那位高人可以魔改笔记本电脑的吗?我想把
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
第一周 | 31/31 | 1/1 | 20/20 | |
第三周 | 24/55 | 2/3 | 24/44 | 知道浮点数怎么储存的 |
第四周 | 177/328 | 2/5 | 17/61 | 现在我的C语言程序也会在Linux命令行下使用了:*) |
第五周 | 54/382 | 2/7 | 18/79 | 复习一遍汇编语言 |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
-
计划学习时间:15小时
-
实际学习时间:>=18小时
-
改进情况:用电脑解决问题的时间延长。
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)