2017-2018-1 20155218 《信息安全系统设计基础》第5周学习总结
2017-2018-1 20155218 《信息安全系统设计基础》第5周学习总结
教材学习内容总结
- 机器代码将内存看做一个很大的、按自己寻址的数组;
- 操作系统负责虚拟地址,将虚拟地址翻译成实际处理器内存中的物理地址;
- “字(word)”表示16位数据类型。32位位“双字(double words)”,64位为“四字qual words”
- gcc -S xxx.c -o xxx.s 获得汇编代码,也可以用objdump -d xxx 反汇编;
- MAC OS中没有objdump, 有等价的命令otool
- 过程是一种重要的抽象,提供了一种封装代码的方式,用一组指定的参数和一个可选的返回值实现了某种功能。
- 传递控制,传递数据,分配和释放内存。
- c语言过程调用机制的一个关键特征在于使用了栈数据结构提供的后进先出的内存管理原则。
教材学习中的问题和解决过程
- 问题1:MOV,MOVS,MOVZ的区别
- 问题1解决方案:
一、 MOV指令是数据传送指令,也是最基本的编程指令,用于将一个数据从源地址传送到目标地址(寄存器间的数据传送本质上也是一样的)。其特点是不破坏源地址单元的内容。
(1)两个存储单元之间不能直接传送数据,即: MOV指令只允许一个操作数在存储器中。
(2)MOV指令中立即数不能直接传送给段寄存器(CS、DS、SS、ES)和IP;段寄存器之间不能直接传送。
(3)MOV指令中立即数不能作目标操作数。
二、MOVS和MOVZ指令类都是将一个较小的源数据复制到一个较大的数据位置,高位用符号位拓展(MOVS)或者零拓展(MOVZ)进行填充。
- 问题2:寄存器的区分和用途:
- 问题2解决方案:
- ESP:栈指针寄存器(extended stack pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的栈顶
- EBP:基址指针寄存器(extended base pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的底部
- 函数栈帧:ESP和EBP之间的内存空间为当前栈帧,EBP标识了当前栈帧的底部,ESP标识了当前栈帧的顶部。
- EIP:指令寄存器(extended instruction pointer), 其内存放着一个指针,该指针永远指向下一条待执行的指令地址。
- 问题3:函数调用的几个步骤:
- 参数入栈:将参数从右向左依次压入系统栈中返回地址入栈:
- 将当前代码区调用指令的下一条指令地址压入栈中,供函数返回时继续执行代码区跳转:
- 处理器从当前代码区跳转到被调用函数的入口处栈帧调整:
- 具体包括保存当前栈帧状态值,已备后面恢复本栈帧时使用(EBP入栈)将当前栈帧切换到新栈帧。(将ESP值装入EBP,更新栈帧底部)给新栈帧分配空间。(把ESP减去所需空间的大小,抬高栈顶)
代码调试中的问题和解决过程
- 问题1:for循环和while循环
int fib_f(int n)
{
int i;
int val = 1;
int nval = 1;
for (i = 1; i < n; i++) {
intt = val+nval;
val= nval;
nval= t;
}
return val;
}
gcc -O1 -S -m32 fib_for.c
fib_f:
pushl %ebp
movl %esp, %ebp
pushl %esi
pushl %ebx
movl 8(%ebp), %esi //esi = n
movl $1, %eax // eax = val = 1
cmpl $1, %esi //比较n和1
jle .L4 //如果n小于等于1,那么跳转到L4
movl $1, %ecx //ecx = i = 1
movl $1, %ebx //ebx = val =1
movl $1, %eax //eax = nval = 1
.L5:
addl $1, %ecx //++i
leal (%eax,%ebx), %edx //t=val+ nval
movl %eax, %ebx //val = nval
cmpl %esi, %ecx //比较i和n
je .L4 //如果相等,跳转到L4,结束循环
movl %edx, %eax //nval = t
jmp .L5 //跳转到L5,继续循环。
.L4:
popl %ebx
popl %esi
popl %ebp
ret
生成的汇编代码,与while循环版本的fib函数完全相同。
- 问题1解决方案:for循环和while循环差不多,都是条件判断在先。gcc用类似处理while循环的方式先把for循环转换成包含do-while循环的代码,再转换成汇编代码。
代码托管
(statistics.sh脚本的运行结果截图)
上周考试错题总结
- 错题1及原因,理解情况
- 错题2及原因,理解情况
- ...
结对及互评
点评模板:
- 博客中值得学习的或问题:
- xxx
- xxx
- ...
- 代码中值得学习的或问题:
- xxx
- xxx
- ...
- 其他
本周结对学习情况
结对同学:20155205
结对照片
结对学习内容
其他(感悟、思考等,可选)
xxx
xxx
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第五周 | 900/1231 | 1/5 | 10/28 |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
-
计划学习时间:XX小时
-
实际学习时间:XX小时
-
改进情况:
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)