信息安全系统设计基础第四周学习总结
$3.1x86的发展历史
1 DOS时代的平坦模式,不区分用户空间和内核空间,很不安全
2 8086的分段模式
3 IA32的带保护模式的平坦模式
$3.2程序编码
1、机器级代码:机器级编译的两种抽象:指令集体系结构和存储地址是虚拟地址。一条指令只执行一个非常基本的操作。
2、关于格式的注解:所有以“.”开头的行都是知道汇编器和链接器的命令
gcc -S xxx.c -o xxx.s 获得汇编代码,也可以用objdump -d xxx 反汇编; 注意函数前两条和后两条汇编代码,所有函数都有,建立函 数调用栈帧,应该理解、熟记。
注意: 64位机器上想要得到32代码:gcc -m32 -S xxx.c MAC OS中没有objdump, 有个基本等价的命令otool Ubuntu中 gcc -S code.c (不带-O1) 产生的代码更接近教材中代码(删除"."开头的语句)
$3.3数据格式
1、字表示16位数据类型。浮点数有三种形式:单精度,双精度,扩展精度。
2、传送指令的三个变种:movb(传送字节)movw(传送字)movl(传送双字)
$3.4访问信息
1、操作数指示符:执行一个操作中要引用的源数据值已经防止结果的目标位置。
操作数分为三类:立即数,寄存器和存储器。(汇编学过的三种寻址方式)
2、数据传送指令:MOV:源操作数复制到目的操作数。两个操作数不能都指向寄存器
栈是一个数据结构,可以添加或删除值,遵循后进先出的原则。
push压入栈,pop删除数据。可以插入和删除元素的一端称为栈顶。栈顶元素的地址是最低的
$3.5算术和逻辑操作
1、加载有效地址:从存储器读数据到寄存器。
2、一元操作数和二元操作数:
一元操作数,既是源又是目的。二元操作数:第二个数既是源又是目的。、
3、移位操作:先给出移位量接着给出移位的数值。移位量可以是立即数,也可以是放在单字解寄存器元素中。
4、以上指令既可以用于无符号数运算也可以用于补码运算。
5、特殊的算术操作:
$3.6控制
1、要求有条件的执行根据数据测试的结果来决定操作执行的顺序。
2、条件码:CF 进位标志。ZF 零标志。SF 符号标志。OF 溢出标志。
使用方法:
①:根据条件码的某种组合将字节设置为1或0
②:条件跳转到程序的某个其他部分
③:有条件的传送数据
3、跳转指令及其编码:jump无条件跳转
直接跳转:跳转目标作为指令的一部分编码,给出一个标号作为跳转目标
间接跳转:跳转目标是从寄存器或存储器读出的,‘*’跟一个操作数指示符。
其他有条件指令可以参考书上128页
4、翻译条件分支
将条件表达式和语句从C语言翻译成机器代码最常用的方法结合有条件和无条件跳转
5、循环
汇编中循环可以用条件测试和跳转组合起来实现
6、条件传送指令
实现条件操作的传统方法是利用控制的条件转移。实际利用数据的控制转移
基于条件数据传送的代码比基于条件控制转移的代码性能好。
7、switch语句
可以根据一整个引索值进行多重分支。提高代码可读性
Switch语句是多重分支的典型,而且使用的是跳转表这种数据类型,是的搜索的更快更高效。
所以这里的关键就是要领会使用跳转 表是一种非常有效的实现多重分支的方法。
$3.7过程
1、栈帧结构:机器用栈来传递过程参数、存储返回信息、保存寄存器用于以后恢复以及本地存储。为单个过程分配的部分栈称为栈帧
%ebp为帧指针,%esp为栈指针
2、转移控制: