20145334《信息安全系统设计基础》第5周学习总结

x86寻址方式

DOS时代的平坦模式,不区分用户空间和内核空间,很不安全
8086的分段模式
IA32的带保护模式的平坦模式
机器级编程的两种抽象
-ISA(Instruction set architecture)。ISA简单来说就是指令集体系结构。定义了处理机状态,指令格式以及指令对状态的影响。
-机器级使用的存储器地址是虚拟地址。

机器代码中的处理机状态

程序计数器(PC)表示将要执行的下一条指令在存储器中的地址。
整数寄存器文件。存储32位的值。存储程序状态或用来保存临时数据。
条件码寄存器
浮点寄存器
Gcc编译代码
1.产生汇编代码文件:gcc -01 -S xxx.c生成xxx.s文件
2.产生目标代码文件:gcc -01 -c xxx.c生成xxx.o文件
3.查看目标代码文件的内容:objdump -d xxx.o

不同数据汇编代码后缀

movb(传送字节)
movw(传送字)
movl(传送双字)注意:汇编代码中后缀l可以表示4自己整数和8字节双精度浮点数。
操作数指示符寻址
立即数:$0xff.
寄存器中的内容:%eax(32位),%ax(16位),%al(4位)。
存储器:根据计算出来的地址访问存储器
学会多种寻址方式寻址。错误的寻址方式:1. 存储器间接寻址错误使用寄存器:movb $0xf,(%bl).2.二元操作如sub,mov中两个操作数不能同时是存储器位置 。
数据传送指令
MOVS和MOVZ指令比较:MOVS符号位扩展,MOVZ零扩展(高位0填充)
pushl数据压栈,popl数据出栈。采用先进后出的原则。栈顶地址小,栈底地址大。IA32栈向低地址方向增长。所以push指令减小栈指针。

4个整数操作指令

addl、subl、andl、xorl
7个跳转指令(jXX)
jmp、jle、jl、je、jne、jge、jg
有6个条件传送指令(cmovXX)
只有当条件码满足所需要的约束时,才会更新目的寄存器的值。
cmovle、cmovl、cmove、cmovne、cmovge、cmovg
桢栈结构
为单个过程分配的那部分栈称为栈帧(stack frame)。寄存器%ebp为帧指针,而寄存器%esp为栈指针。栈帧结构(栈用来传递参数、存储返回信息、保存寄存器,以及本地存储)

转移控制
支持过程调用和返回的指令:

指令 描述

-call Label 过程调用

-call *Operand 过程调用

-leave 为返回准备栈

-ret 从过程调用中返回

call指令的效果是将返回地址入栈,并跳转到被调用过程的起始处。返回地址是在程序中紧跟在call后面的那条指令地址。

寄存器使用惯例

程序寄存器组是唯一能被所有过程共享的资源。虽然在给定时刻只能有一个过程是活动的,但是我们必须保证当一个过程(调用者)调用另一个过程(被调用者)时,被调用者不会覆盖某个调用者稍后会使用的寄存器的值。根据惯例,寄存器%eax、%edx和%ecx被划分为调用者保存寄存器。当过程P调用Q时,Q可以覆盖这些寄存器,而不会破任何P所需要的数据。另一方面,寄存器%ebx、%esi和%edi被划分为被调用者保存寄存器。这意味着Q必须在覆盖这些寄存器之前,先把它们保存到栈中,并在返回前恢复它们。
实验楼代码:


.

Linux下的git成功演示:

.

实验楼中的code.c源代码及汇编代码
.

.

.

查看汇编


.

查看可执行文件的二进制文件内容,用十六进制显示


.

将可执行文件转换为反汇编代码


.


.

代码托管链接:

https://git.oschina.net/20145334/zwh20145334/tree/master

posted @ 2016-10-16 23:36  20145334赵文豪  阅读(171)  评论(3编辑  收藏  举报