20145224 《信息安全系统设计基础》第五周学习总结
教材学习内容总结
3.1 历史观点
·X86寻址的三个时代:
1、DOS时代的平坦模式,不区分用户空间和内核空间,很不安全;
2、8086的分段模式;
3、IA32的带保护模式的平坦模式。3.2 程序编码
·gcc编译器的编译选项:
-01 第一级优化 (多作为学习工具);
-02 第二级优化 (所得到的程序性能更优);
提高优化级别会使最终程序运行得更快,但编译时间也要更长,用调试工具对代码进行调试会更加困难。·源代码转化为可执行代码:
C预处理器扩展源代码;(gcc -E hello.c -o hello.i)
编译器产生汇编代码;(gcc -S hello.i -o hello.s)
汇编器将汇编代码转换成二进制目标代码;(gcc -c hello.s -o hello.o)
链接器将目标代码文件与现实库函数的代码合并,产生最终的课执行文件。(gcc hello.o -o hello)3.4访问信息
·操作数的三种类型:立即数、寄存器、存储器;
 ·MOV指令:将原操作数的值复制到目的操作数中;(不能够从存储器传送到存储器)
3.5 算数和逻辑操作
·加载有效地址:leal的指令形式是从存储器读数据到寄存器。但该指令并不是从指定位置读入数据,而是将有效地址写入到目的操作数。
 ·一元操作:
INC(自增1)
DEC(自减1)
NEG(取负)
NOT(取补)·二元操作:
ADD(加)
SUB(减)
IMUL(乘)
XOR(异或)
OR(或)
AND(与)·移位操作:
SAL(左移)
SHL(左移)
SAR(算数右移)
SHR(逻辑右移)3.6 控制
·两种实现条件行为的低级机制:测试数据,然后根据测试的结果来改变控制流或者数据流;
 ·jump指令可以改变一组机器代码指令的执行顺序;
 ·leal指令不会改变任何条件码;
 ·CMP和TEST只设置条件码而不改变任何其他寄存器;
代码调试中的问题和解决过程
我安装的是64位的Ubuntu程序,但他并不能使用-m32生成32位文件:
 所生成的32位文件里面是空的:
 系统也不支持-01的编译选项,使用gcc -S code.c指令生成文件如下:
 二进制的机器码使用od打开:

 反汇编的结果:



本周代码托管链接
https://git.oschina.net/Kevin_s/Linux_C.git
学习进度条
| 代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
|---|---|---|---|---|
| 目 标 | 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 | 
参考资料
- 《深入理解计算机系统V2》学习指导
- 程序的机器级表示 - 实验楼
- ...