2018-2019-1 20165228 《信息安全系统设计基础》第三周学习总结
教材学习内容总结
程序的机器级表示:
计算机系统的两种重要抽象
- ISA(Instruction set architecture):指令集体系结构,机器级程序的格式和行为。定义了处理器状态指令的格式,以及每条指令对状态的影响。
- 机器级程序使用的存储器地址是虚拟地址,提供的存储器模型看上去是一个非常大的字节数组。存储器系统实际表现是将多个硬件存储器和操作系统软件组合起来。
汇编代码及其特点
- 直接面向处理器的程序设计语言。编译器将C语言代码转化为处理器执行的基本指令,汇编语言非常接近于机器代码。
- 特点:可读性相较于机器代码更好的文本格式表示
X86-64指令
- 指令长度:1到15字节不等
- 指令格式:OPER [DEST [, SRC]] ;注释
如何得到C语言代码的汇编代码
gcc -Og -S code.c
//-Og表示优化程度,比如-01表示使用第一级优化,优化的级别与编译时间和最终产生代码的形式都有关系。
- 使用-c命令选项,GCC编译并汇编该代码得到code.o
gcc -c code.c
- 目标代码:二进制形式,无法直接查看,机器实际执行的程序只是对一系列指令进行编码的字节序列。
如何根据目标代码得到可读的内容
- 使用反汇编器(disassembler),可根据目标代码产生一种类似于汇编代码的格式。
objdump -d code.o
处理器:
- 程序处理器:只是下条将要执行的指令在存储器中的地址
- 整数寄存器:包含16个命名的位置,分别存储64位值。可用来记录某些文件状态,也可用来保存临时值。
- 条纹寄存器:保存最近执行的算数或逻辑指令的状态信息。
- 浮点寄存器:一组向量寄存器可以存放一个或多个证书或浮点数值。
处理器的通用目的寄存器
- X86-64的中央处理单元(cpu)包含一组16个存储64位值的通用目的寄存器
汇编指令
- mov类指令:源操作数的值复制到目的操作数中。
- movb 传送字节
- movw 传送字
- movvl 传送双字
- movz 零扩展
- 一元操作
- INC 加一
- DEC 减一
- NEG 取负
- NOT 取补
- 二元操作
- ADD 加
- SUB 减
- IMUL 乘
- XOR 异或
- OR 或
- AND 与
-
控制
条件码
```
CF:进位标志
ZF:零标志
SF:符号标志
OF:溢出标志
```
循环(while, for)
C语言do-while循环:
do
body-statement
while(test-expr);
汇编实现形式:
loop:
body-statement
t = test-expr;
if(t)
goto loop;
寻址方式
- 立即数寻址:操作数在指令中直接给出,只能用于源操作数,数据长度应与目的操作数长度匹配。
- 寄存器寻址:数放在CPU的内部寄存器中,源操作数与目的操作数长度应一致。
- 存储器寻址:操作数存放在存储器中,指令中给出操作数的偏移地址信息。
过程
- 一组指定的参数和一个可选的返回值实现某种功能。
- 形式:函数、方法、子例程、处理函数等。
- 实现过程需要的机器级支持机制
- 传递控制
- 传递数据
- 分配和释放内存
分配和释放内存
- 栈上的局部存储
- 寄存器中的局部存储空间
栈帧:过程活动记录,是编译器用来实现过程/函数调用的一种数据结构。逻辑上讲,栈帧就是一个函数执行的黄精:函数参数、函数的局部变量、函数执行完后返回到哪里等等。
延伸方式:栈是从高地址向低地址延伸。每个函数的每次调用都有自己独立的一个栈帧,即里面维持着所需要的各种信息。寄存器ebp指向当前的栈帧的地步(高地址),寄存器esp指向当前的栈帧顶部(低地址)。
异质的数据结构
- C语言的struct声明创建一个数据类型,将可能不同类型的对象聚合到一个对象中。
- 结构的所有组成部分都存放在一段连续区域内,结构的指针就是结构第一个字节的地址。
数据对齐
- 对于大多数x86-64指令来说,保持数据对齐能够提高效率,但是它不会影响程序的行为。
代码调试中的问题和解决过程
- 问题1:GDB调试问题“No source file named file.c. Make breakpoint pending on future shared library load?”和“没有符号表被读取。请使用”file” 命令”
- 问题1解决方案:在编译的时候,没有加-g的选项,导致没有产生调试符号。
学习进度条
|
代码行数(新增/累积) |
博客量(新增/累积) |
学习时间(新增/累积) |
重要成长 |
目标 |
5000行 |
30篇 |
400小时 |
|
第一周 |
124/124 |
1/1 |
9/9 |
|