2017-2018-5 0155327 《信息安全系统设计基础》第五周学习总结

2017-2018-5 0155327 《信息安全系统设计基础》第五周学习总结

教材学习内容总结

程序的机器级表示

计算机执行机器代码,用字节序列编码低级操作,包括处理数据、管理储存器、读写储存设备上的数据,以及利用网络通信。

3.1历史观点

Intel处理器俗称X86,经历了长期的、不断进化的发展过程。

3.2程序编码

编译代码:gcc =O1 -o p p1.c p2.c
实际上gcc命令调用了一系列程序,将源代码转化成可执行代码。

3.2.1机器级代码

指令集体系结构ISA:定义了处理器状态、指令的格式,每条指令对状态的影响。

3.3数据格式

3.4访问信息

一个IA32中央处理单元包含一组8个储存32位值的寄存器。这些寄存器用来存储整数数据和指针。

3.4.1操作数指示符

3.4.2数据传送指令

将数据从一个位置复制到另一个位置的指令。

3.4.3数据传送指令:

MOV:movb,movw,movl分别传送字节,字,双字
MOVZ(零扩展,高位用0填充):同上,压栈出栈见p114表格。(注意栈顶的地址值是栈中最小的)
MOVS(符号扩展,高位用原来最高位的数值填充):同上
C语言中,指针就是地址,间接引用指针就是将指针放在一个寄存器中,然后在存储器中使用这个寄存器。

3.5算数和逻辑操作

四种整数操作:
加载有效地址:实际是将有效地址写入目的操作数,目的操作数必须是寄存器。
一元操作:只有一个操作数,可以是寄存器也可是存储器位置。
二元操作:源操作数是第一个,可以是立即数、寄存器、存储器 目的操作数是第二个,可以是寄存器、存储器 两个不能同时为存储器。
移位:第一个是移位量,用单个字节编码(只允许0-31位的移位)。

3.6控制

控制中最核心的是跳转语句:
有条件跳转
无条件跳转

3.6.5循环

1.do-while循环
通用形式:
do
    body-statement
    while(test-expr);
loop:
        body-statement
        t = test-expr;
        if(t)
               goto loop;
2.while循环
通用形式:
while (test-expr)
        body-statement
if(!test-expr)
        goto done;
do
               body-statement
               while(test-expr);
3.for循环
通用形式:
for(init-expr;test-expr;update-expr)
body-satament

3.7过程

过程可以理解为c中的函数,当调用者(caller)调用被调用者(be caller)的时候,系统会为被调用者在栈内分配空间,这个空间就称为栈帧。栈顶元素的地址是所有栈中元素地址中最低的
栈用来传递参数、存储返回信息、保存寄存器,以及本地存储。
栈帧:为单个过程分配的那部分栈称为栈帧。
最顶端的栈帧以两个指针界定:
寄存器%ebp-帧指针
寄存器%esp-栈指针

教材问题

1.X86 寻址方式经历三代:

1 DOS时代的平坦模式,不区分用户空间和内核空间,很不安全
2 8086的分段模式
3 IA32的带保护模式的平坦模式

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

1.ISA:定义是与程序设计有关的计算机架构的一部分,包括本地数据类型、指令、寄存器、地址模式、内存架构、中断和意外处理和外部 I/O 。一个 ISA 包括一系列 opcodes(机器语言)的一个规格,本地命令由一个特定的 CPU 设计来实现。
2.机器级程序使用的内存地址是虚拟地址,提供的内存模型看上去是一个非常大的字节数组。

代码示例

汇编代码:
gcc -Og -S xxx

反汇编:
objdump -d xxx

操作数指示符

标识方式一共有三种,一种是$符号后跟一个标准C表示的整数,比如$100,$0x11等等。第二种则是寄存器,当它作为一个操作数的时候,则是取的寄存器当中的数值。另外,对于寄存器来说,也可以选择性的操作4个、2个、1个字节,而并不一定非要操作4个字节。最后一种,则是我们相对来说最熟悉的,就是存储器或者说内存。当它作为一个操作数的时候,会去计算存储器地址的数值,然后去这个地址取相应的数值。

代码托管

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

上周考试错题总结

  • 错题1及原因,理解情况
  • 错题2及原因,理解情况
  • ...

结对及互评

点评模板:

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

本周结对学习情况

- [结对同学学号1](博客链接)
- 结对照片
- 结对学习内容
    - XXXX
    - XXXX
    - ...

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

xxx
xxx

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 200/200 2/2 20/20
第二周 300/500 2/4 18/38
第三周 500/1000 3/7 22/60
第四周 300/1300 2/9 30/90

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

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

  • 计划学习时间:XX小时

  • 实际学习时间:XX小时

  • 改进情况:

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

参考资料

原文地址:https://www.cnblogs.com/l97----/p/7712407.html