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小时
-
改进情况:
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)