2017-2018-20155206 《信息安全系统设计基础》第五周学习总结
教材学习内容总结
、 程序编码
、 GCC将源代码转化为可执行代码的步骤:
、 C预处理器——扩展源代码-生成.i文件
、 编译器——产生两个源代码的汇编代码-——生成.s文件
、 汇编器——将汇编代码转化成二进制目标代码——生成.o文件
、链接器——产生可执行代码文件
、机器级代码
、 1.机器级编程的两种抽象
、 (1)指令集结构ISA
、 是机器级程序的格式和行为,定义了处理器状态、指令的格式,以及每条指令对状态的影响。
、 (2)机器级程序使用的存储器地址是虚拟地址
、 看上去是一个非常大的字节数组,实际上是将多个硬件存储器和操作系统软件组合起来。
、** 2.几个处理器:**
、 程序计数器(CS:IP)
、整数寄存器(AX,BX,CX,DX)
、条件码寄存器(OF,SF,ZF,AF,PF,CF)
、浮点寄存器
、一条机器指令只执行一个非常基本的操作。
、程序编码
、书上107页的代码,需要用到反汇编器。在Linux系统中,带‘d’命令行标志的程序OBJDUMP
可以充当这个角色。
、 数据格式
、数据传送指令的三个变种:
、movb
传送字节
、movw
传送字
、 movl
传送双字
、 访问信息
、 一个IA32中央处理单元(CPU)包含8个存储32位置的寄存器
、 操作数指示符
、 立即数
、 寄存器
、 存储器
、** 寻址方式**
、 (1)立即数寻址方式
、 格式:$
后加用标准c表示法表示的整数,如$0xAFF
、 (2)寄存器寻址方式
、 如%eax
,与汇编中学过的AX寄存器类比。
、 (3)存储器寻址方式
、 直接寻址方式
、 寄存器间接寻址方式
、 寄存器相对寻址方式
、 基址变址寻址方式
、 相对基址变址寻址方式
、 数据传送指令
、 MOV
、 movb
传送字节
、 movw
传送字
、 movl
传送双字
、MOVS
、 movsbw
将做了符号扩展的字节传送到字
、 movsbl
将做了符号扩展的字节传送到双字
、 movswl
将做了符号扩展的字传送到双字
、 MOVZ
、 movzbw
将做了零扩展的字节传送到字
、 movzbl
将做了零扩展的字节传送到双字
、 movzwl
将做了零扩展的字传送到双字
、** 算术和逻辑操作**
、 一、加载有效地址
、 加载有效地址指令——leal,是movl指令的变形。
、 指令形式:从存储器读取数据到寄存器。
、 实际:将有效地址写入到目的操作数,而目的操作数必须是寄存器;并不真实引用存储器。
、 二、一元操作和二元操作
、 1.一元操作
、 只有一个操作数,既是源又是目的,可以是一个寄存器,或者存储器位置。
、 2.二元操作
、 第一个操作数可以是立即数、寄存器或者存储器位置
、 第二个操作数可以是寄存器或者存储器位置
、 但是不能同时是存储器位置。
、** 控制**
、 数据传送指令
、 MOV 不影响标志位
、 PUSH POP 不影响标志位
、 XCHG 交换指令 不影响标志位
、 XLAT 换码指令 不影响标志位
、 LEA 有效地址送寄存器指令 不影响标志位
、 PUSHF 标志进栈指令 不影响标志位
、 POPF 标志出栈指令 标志位由装入值决定
、 访问条件码
、 这个指的是SET指令,通过set与不同的条件码的组合,达到不同的跳转条件。
、 某些底层的机器指令可能有多个名字,我们称之为“同义名”。
、 跳转指令及其编码
、 jump分为直接跳转和间接跳转:
、 直接跳转:后面跟标号作为跳转目标
、 间接跳转:*后面跟一个操作数指示符
、过程
、 一个过程调用包括将数据和控制从代码的一部分传递到另一部分。另外,它还必须在进入时为过程的局部变量分配空间,并在退出时释放这些空间。
、 一、栈帧结构
、 栈用来传递参数、存储返回信息、保存寄存器,以及本地存储。
、 1.栈帧
、 为单个过程分配的那部分栈称为栈帧,通用结构见149页
、 所以本质上栈帧还是栈。
、 2.两个指针
、 最顶端的栈帧以两个指针界定:
、 寄存器%ebp-帧指针
、 寄存器%esp-栈指针
、 栈指针可移动,所以信息访问多相对于帧指针。
、 二、转移控制
、 这里用到的主要就是CALL和RET这一对指令。
、 1.call
、 call指令和转移指令相似,同样分直接和间接,直接调用的目标是标号,间接调用的目标是*后面跟一个操作数指示符,和JMP一样。
、 CALL指令的效果是将返回地址入栈,并跳转到被调用过程的起始处。返回地址是还在程序中紧跟在call后面的那条指令的地址。
、 然后就会用到ret了。
、 2.ret
、 ret指从栈中弹出地址,返回到call指令后的那条指令。