2017-2018-1 20155320 《信息安全系统设计基础》第五周学习总结
《信息安全系统设计基础》第3周学习总结
参考老师提供的教材内容导读
教材学习内容总结
- Intel处理器系列俗称X86,寻址方式经历三代:
1 DOS时代的平坦模式,不区分用户空间和内核空间,很不安全
2 8086的分段模式
3 IA32的带保护模式的平坦模式
gcc -S xxx.c
就能看到C语言编译产生的汇编代码
gcc -c hello.c
会编译并汇编该代码
64位机器上想要得到32代码:gcc -m32 -S xxx.c
objdump -d xxx 反汇编
- Intel 用术语“字”表示16位数据类型,32位称为双字。
- 二进制文件可以用od 命令查看,也可以用gdb的x命令查看。
有些输出内容过多,我们可以使用 more或less命令结合管道查看,也可以使用输出重定向来查看
od code.o | more
od code.o > code.txt
- 了解Linux和Windows的汇编格式有点区别:ATT格式和Intel格式
- Intel代码省略了指示大小的后缀。我们看到指令push和mov,而不是pushq和movq
- Intel代码省略了寄存器名字前面的‘%’符号,用的是rbx,而不是%rbx。
- Intel代码用不同的方式来描述内存中的位置,例如是‘QWORD PTR[rbx]’而不是‘(%rbx)’
- 在带有多个操作数的指令情况下,列出操作数的顺序相反。
- 大多数GCC生成的汇编代码指令都有一个字符后缀,表明操作数的大小。数据传送指令有四个变种:movb(传送字节),movw(传送字)、movl(传送的双字)、movq(传送四字)。
。 - 寄存器要深入理解,esi edi可以用来操纵数组,esp ebp用来操纵栈帧。
1.8086系统中:8个16位寄存器,从%ax到%bp
2.IA32架构:8个32位寄存器,从%eax到%ebp.
3.x86-64:原来的8个扩展到64位,标号从%rax到%rbp,还新增了8个新寄存器,从%r8到%r15
-
操作数分为三种类型:立即数、寄存器、存储器
-
有效地址的计算方式为: Imm(Eb,Ei,s) = Imm + R[Eb] + R[Ei]*s
-
MOV相当于C语言的赋值”=“,注意ATT格式中的方向, 另外注意不能从内存地址直接MOV到另一个内存地址,要用寄存器中转一下
-
栈通过push把数据压入栈中,通过pop操作删除数据,它具有一个属性:弹出的值永远是被压入而且仍在栈中的值。栈顶元素的地址是所有栈中元素地址中最低的。栈指针%rsp保存着栈顶元素的地址。
- 加载有效地址的指令leaq,虽然形式是从内存读数据到寄存器,但实际上他根本没有引用内存,而是将有效地址写入到目的操作数。
- call/ret; 函数返回值存在%eax中
教材学习中的问题和解决过程
-
问题1:能区分MOV,MOVS,MOVZ
-
问题1解决方案:通过查找资料,在一篇博客中找到了答案
1.MOV相当于C语言的赋值”=“
2.MOVS将作了符号扩展的字节传送到字
3.MOVZ将作了零扩展的字节传送到字
代码调试中的问题和解决过程
-
问题1:在课本P116页的练习时,出现了如下错误
-
问题1解决方案:发现是有一个~没有删除,修改后结果为
代码托管
结对及互评
本周结对学习情况
- 20155326
-
结对照片
-
结对学习内容
- 第三章内容
-
其他(感悟、思考等,可选)
本周学习内容比较多,让我感觉压力比较大。第三章的内容和上学期上的汇编课程相关联比较多,融会贯通的学感觉效果更好。同时仍感觉自己的学习效率不高,需要提升。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 200小时 | |
第一周 | 5/5 | 1/1 | 15/15 | |
第二周 | 1/2 | 23/38 | ||
第三周 | 206/327 | 1/3 | 28/66 | |
第四周 | 206/327 | 1/4 | 10/77 | |
第五周 | 285/568 | 1/5 | 20/97 | 主要学习了汇编及反汇编的相关知识 |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
-
计划学习时间:15小时
-
实际学习时间:20小时
-
改进情况:本周既需要学习课本第三章内容,内容比较多,增加了学习时间
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)