2017-2018-1 20155215 《信息安全系统设计基础》第5周学习总结
2017-2018-1 20155215 《信息安全系统设计基础》第5周学习总结
教材学习内容总结
- 机器级代码
1.机器级编程的两种抽象
(1)指令集结构ISA
(2)机器级程序使用的存储器地址是虚拟地址
2.汇编代码的特点:
用可读性更好的文本格式来表示。
3.几个处理器:
程序计数器(CS:IP)
整数寄存器(AX,BX,CX,DX)
条件码寄存器(OF,SF,ZF,AF,PF,CF)
浮点寄存器
一条机器指令只执行一个非常基本的操作。
- 课本上P114页的代码如图所示:
long mult2(long,long);
void multstore(long x,long y,long *dest){
long t= mult2(x,y);
*dest = t;
}
在命令行上使用 “-S”选项,可以看到C语言编译器产生的汇编代码。
gcc -Og -S mstore.c
“-c”命令行选项,则会编译并汇编该代码。
gcc -Og -c mstore.c
这里还注意一下反汇编器的使用:
objdump -d xxx.xx
二进制文件可以用od 命令查看,也可以用gdb的x命令查看。 有些输出内容过多,我们可以使用 more或less命令结合管道查看,也可以使用输出重定向来查看。
od code.o | more
od code.o > code.txt
-
Linux——平坦寻址方式:ds,ss,cs等各段的段基地址都指向同一个地方,不管是数据段还是代码段,只要他们的偏移相等,那么他们就是寻址一样的物理内存,所以我们就只需指明偏移就能得到统一的寻址目标,不管这个目标是在代码段还是数据段或者堆栈段之中。
-
操作数指示符:
操作数:指示出执行一个操作中要引用的源数据值,以及放置结果的目标位置。 -
操作数的三种类型:
立即数,寄存器,存储器 -
结果存放的两种可能
-
寻址方式
-
数据传送指令:
1.mov指令2.push&pop
-(1)堆栈
1.后进先出
2.栈指针指向栈顶元素
3.栈朝低地址方向增长
-
(2)压栈push
-
指令格式——PUSH r16/m16/seg
-
指令功能
第一步:SP←SP-2 ;堆栈指针SP上移
第二步:(SS):(SP)←r16/m16/seg ;字操作数存入堆栈顶部
注意 堆栈操作必须至少以字为单位,这时栈顶指针-2
如果压入的是双字,栈顶指针-4 -
(3)出栈pop
指令格式——POP r16/m16/seg -
指令功能:
第一步:r16/m16/seg← (SS):(SP) ;栈顶的一个字传送到指定的目的操作数
第二步:SP←SP+2 ;堆栈指针SP下移,指向新的栈顶
栈顶指针变化同压栈。 -
翻译条件分支:将条件表达式和语句从c语言翻译成机器语言,最常用的方式就是结合有条件和无条件跳转。
-
无条件跳转:例如 goto。书上的例子就是把if-else语句翻译成了goto形式,然后再由这个形式翻译成汇编语言。
-
循环
教材学习中的问题和解决过程
- 问题1:控制流与数据流的区别是什么?
- 问题1解决方案:
- 数据流是一个按照时间递增顺序排列的无穷序列,可以表示为: I = α1, α2 ,…,αt的形式,αt 是时刻t 出现的序列元素。 数据流与一般的数据的区别在于它的到达是快速的,无界的,时变的和不可预测的,从而不可能将原始数据流中的数据完全存储。
- 控制流的英文是control flow,它是程序执行中所有可能的事件顺序的一个抽象表示。控制流语句控制着程序的执行路径。数据在两个串口之间传输时,常常会出现丢失数据的现象,或者两台计算机的处理速度不同。控制流语言使用与程序设计相似的构造使语句得以互相连接、关联和相互依存。
代码调试中的问题和解决过程
-
问题1:虚拟机出错。这是我上次遇见过的问题,上次我解决了,但是这次我却又出现了,而且用上次的方法还搞不好。
-
问题1解决方案:因为我之前也出了一次这种错误,所以我本来又试了之前的方法,解决方法1
但是,却没有用。然后,我又在网上找了一下,找到了解决方法2,结果输入了下面的代码,就成功了。
mv .zsh_history .zsh_history_bad
strings .zsh_history_bad > .zsh_history
fc -R .zsh_history
代码托管
(statistics.sh脚本的运行结果截图)
上周考试错题总结
- main.c 调用了静态库libmath.a中的函数,编译main.c的命令是()
A .
gcc -static main.c ./libmath.a -o main
B .
gcc -static main.c -L. -lmath -o main
C .
gcc -static main.c -L. -llibmath.a -o main
D .
gcc -static main.o ./libmath.a -o main
正确答案: A B 你的答案: C
2.针对以上代码:gcc -c *.c 可以得到m.o,swap.o两个模块,相对于m.o, buf是()
A .
外部符号
B .
全局符号
C .
局部符号
D .
以上都不对
正确答案: B 你的答案: A
3.编译驱动程序gcc -c 会调用()
A .
预处理器
B .
编译器
C .
汇编器
D .
链接器
正确答案: C 你的答案: B
结对及互评
点评模板:
- 博客中值得学习的或问题:
- 20155232 的博客比较详实,感觉比较多过程图。
本周结对学习情况
- [20155232](http://www.cnblogs.com/lsqsjsj/p/7711776.html)
其他(感悟、思考等,可选)
这周的实验我觉得收获很大,自己完成的成就感很强,感觉自己对下一次的实验也有了自信。
然后第三章的内容涉及到很多汇编的知识,而我却发现自己的汇编已经遗忘了大部分了,就觉得很可惜,本来如果上学期学的比较扎实,那这学期学到这个第三章是肯定就能更好一些,这也就在提醒我,每一个知识的学习都是有它的意义所在的,我们应当以正确的态度去对待它。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 100/100 | 1/1 | 20/20 | |
第三周 | 200/200 | 2/2 | 18/20 | |
第五周 | 300/300 | 2/2 | 20/19 |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
-
计划学习时间:20小时
-
实际学习时间:19小时
-
改进情况:
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)