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脚本的运行结果截图)

上周考试错题总结

  1. 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小时

  • 改进情况:

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

参考资料

posted @ 2017-10-22 21:08  xuanyan  阅读(204)  评论(0编辑  收藏  举报