2017-2018-1 20155235 《信息安全系统设计基础》第十三周学习总结

2017-2018-1 20155235 《信息安全系统设计基础》第十三周学习总结

教材学习内容总结

1.X86 寻址方式的变化:
DOS时代的平坦模式,不区分用户空间和内核空间,很不安全;
8086的分段模式;
IA32的带保护模式的平坦模式

2.机器编程的两种抽象:

指令集体系结构(Instruction set architecture,ISA)——定义指令格式以及每条指令执行之后对状态的影响。大多数ISA将程序行为描述成按顺序执行的;
虚拟地址

3.一些处理器状态

  • 1.PC,即程序计数器,用来指示将要执行的下一条指令在存储器中的地址;

  • 2.整数寄存器,存储数据;条件码寄存器,保存逻辑指令状态信息;等

4.gcc -S xxx.c 可以得到C语言编译器产生的汇编代码,但不会做其他工作;使用“-c”命令,GCC就会编译并汇编该代码,得到二进制文件XXX.o。由此可见,机器执行的实际上是对一系列指令进行编码的字节序列。

5.函数中通用的汇编语句:

pushl %ebp //将该寄存器内容全部压入程序栈
movl %esp,%ebp
addl %eax,accum
popl %ebp````

6.64位机器上想要得到32代码: gcc -m32 -S xxx.c
7.反汇编器:

根据目标代码产生一种类似于汇编代码的格式。在linux中,可以通过objdump -d xxx.o实现

8.二进制文件可以用od 命令查看,也可以用gdb的x命令查看。有些输出内容过多,我们可以使用 more或less命令结合管道查看,也可以使用输出重定向来查看:

od code.o | more
od code.o > code.txt

9.Linux和的汇编格式为ATT格式,而Windows的为Intel格式。二者在语法上有区别——后者省略了指示大小的后缀、寄存器前的%等。

10.intel用术语“字”来表示16位数据类型。
int和long int都是4字节即双字长度;
char是单字节;
指针存储为4字节的双字。另外,在汇编代码中,b表示字节;w表示字,l表示双字

11.一个IA32中央处理单元(CPU)包含一组8个存储32位值的寄存器。其中,esi edi可以用来操纵数组,esp ebp用来操纵栈帧。另外四个寄存器为通用(在32位和16位机器上都可以用)寄存器。然而,当单独使用其低四位的时候,一旦结果多于8位,仍然会发生溢出。

12.理解操作数的三种类型:

立即数(不超过32位的数值)
寄存器(用Ea表示任意寄存器a,R[Ea]表示它的值)
存储器(会根据计算出来的地址访问某个内存,用M[addr]表示)

13.寻址方式的通用公式:
有效地址可以表示为Imm+R[Eb]+R[Ei]*s。
Imm为立即数偏移;Eb为基址寄存器;Ei为变址寄存器;s为比例因子
如:

  • 1.Ea——操作数值:R[Ea]
  • 2.(Ea)——操作数值:M(R[Ea])
  • 3.Imm(Ea)——操作数值:M(Imm+R[Ea])

14.mov语句表示将值从源操作数“移给”目的操作数(前者在前,后者在后),相当于赋值。在IA32中规定不能从内存地址直接MOV到另一个内存地址,要用寄存器进行中转。其中,MOVS是符号扩展;MOVZ是零扩展。

  • 1.MOV:将源操作数的值复制到目的操作数中;
  • 2.MOVS:将一个较小的源数据复制到一个较大的数据位置,高位用位扩展;
  • 3.MOVZ:将一个较小的源数据复制到一个较大的数据位置,高位用零扩展。

15.push,pop语句:

1.push:把数据压入栈中;
2.pop:删除数据。
3.栈遵循“后进先出”的原则,且栈顶向下增长;在栈指针%esp中保存着栈顶元素的指针。

16.leal,加载有效地址;将数据从存储器读到寄存器

1.NEG,取负
2.SUB S,D,将D-S的结果送至D
3.移位操作 SAL,SHL,SAR,SHR的移位量可以是立即数或%cl中的数

17.除了leal外,其他逻辑操作都会设置条件码。另外,有些操作只设置条件码而不将结果送至操作数——CMP:比较指令,与SUB类似;TEST指令,与AND类似(当两数相等的时候,会将条件码都设置成0)

18.SET类指令根据t=a-b的结果所设置的条件码来将一个字节(目的操作数)设置为0或者1

19.跳转指令:

  • 1.无条件跳转——jmp.<标号> 跳转到标号所指示的语句处;jmp *<操作数指示符>

【注意:如果形如%eax,即以%eax中的值作为跳转目标;而形如(%eax)则是以其中的值作为地址,读出跳转目标】

  • 2.有条件跳转——类似于SET类指令,是根据条件码或者其组合来跳转

20.do-while语句等价的goto语句

loop:   
body-statement     
t = test-sxpr;     
    if(t)     
        goto loop;     

21.while语句等价的goto语句

t = test-sxpr;    
if(!t)    
    goto done;      
loop:    
    body-statement   
    t = test-sxpr;    
        if(t)    
    goto loop;   
done:   

22.for循环的流程:程序首先对初试表达式init-expr求值,然后进入循环;在循环中它先对测试条件test-expr求值,如果为假则退出循环否则执行循环体;最后对更新表达式求值。

23.switch语句根据一个整数索引值进行多重分支;通过使用跳转表使其更加高效。跳转表是一个数组,表项i是一个代码段地址(C语言用&表示一个指向数据值的指针;而&&表示一个指向代码位置的指针)

24.IA32利用程序栈来支持过程调用(包括将数据和控制)。为单个过程分配的那部分栈做栈帧。最底端(地址最大)%ebp为帧指针;最顶端(地址最小)%esp为栈指针。当程序执行时,栈指针可以移动。

25.转移控制

  • 1.call指令:后接被调用过程的起始的指令地址。效果是将返回地址入栈,并跳转到被调用过程的起始处。
  • 2.ret指令:从栈中弹出地址,并跳转到这个位置。

26.编译器根据一组很简单的惯例产生管理栈结构的代码。参数在栈上传递给函数,可以从栈中相对于%ebp的正偏移量来访问它们。可以用push指令或者是从栈指针中减去偏移量来分配在栈上的空间。

注意:

1.当带选项-S和-O1运行gcc时,会产生xxx.s文件,其中带有'.'开头的行是指导汇编器和链接器的命令。
2.gcc -S产生的汇编代码中可以把以'.'开头的语句删除再使用也没关系。
3.了解Linux和windows的汇编格式的区别,Intel代码省略了指示大小的后缀,即'l';Intel代码省略了寄存器名字前面的'%'符号,用的是esp,而不是%esp。

教材学习中的问题和解决过程

  • 问题1:以前对源代码转化为可执行代码之间的过程记得不够牢靠
  • 问题1解决方案:把其他周的代码都转化了一遍......从此记住了

代码调试中的问题和解决过程

  • 问题1:主要问题在实验五里。
  • 问题1解决方案:答案也在实验五博客里

代码托管

(statistics.sh脚本的运行结果截图)

上周考试错题总结

结对及互评

点评模板:

  • 博客中值得学习的或问题:
    • xxx
    • xxx
    • ...
  • 代码中值得学习的或问题:
    • xxx
    • xxx
    • ...
  • 其他

本周结对学习情况

20155211
- 结对照片
- 结对学习内容
-

其他(感悟、思考等,可选)

虚拟机真有意思,Linux真有意思(微笑)

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 200/200 1/1 10/10
第二周 200/200 1/1 20/20
第三周 ?/200 1/1 15/20
第四周 200/200 1/1 20/20
第五周 100/200 1/1 20/20
第六周 200/200 1/1 20/30
第七周 500/500 1/1 20/20
第八周 300/300 1/1 15/30
第九周 300/300 1/1 15/20
第十一周 300/300 1/1 20/20
第十二周 300/300 0/0 20/30
第十三周 500/500 1/1 25/25

尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。

参考:软件工程软件的估计为什么这么难软件工程 估计方法

  • 计划学习时间:25小时

  • 实际学习时间:25小时

  • 改进情况:

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

参考资料

posted @ 2017-12-17 20:51  wyjingheng  阅读(232)  评论(1编辑  收藏  举报