信息安全系统设计基础第五周学习总结—20135227黄晓妍

X86 寻址方式经历三代:

1 DOS时代的平坦模式,不区分用户空间和内核空间,很不安全

2 8086的分段模式

3 IA32的带保护模式的平坦模式

 

ISA

指令集体系结构,机器级程序的指令和格式。它定义了处理状态,指令的格式,以及每条指令对状态的影响。

 

获得汇编代码的两种方式:

gcc -S xxx.c -o xxx.s 获得汇编代码,也可以用objdump -d xxx 反汇编

(反汇编不需要访问程序的源代码或者汇编代码)

 

C语言数据类型在IA32中的大小:

P111页表格。

 

8个寄存器(32位)

eax,ecx,edxe;bx,esi,edi为六个通用寄存器。

esi edi可以用来操纵数组

ebp(帧指针),esp(栈指针)保存指向程序栈中重要位置的指针。

 

立即数,存储器,寄存器寻址方式:

P113表格公式。3.1的例题帮助检验掌握否。

特别是:有效地址的计算方式 Imm(Eb,Ei,s) = Imm + R[Eb] + R[Ei]*s

 

数据传送指令:

MOV:movb,movw,movl分别传送字节,字,双字

MOVZ(零扩展,高位用0填充):同上,压栈出栈见p114表格。(注意栈顶的地址值是栈中最小的)

MOVS(符号扩展,高位用原来最高位的数值填充):同上

C语言中,指针就是地址,间接引用指针就是将指针放在一个寄存器中,然后在存储器中使用这个寄存器。

 

算术运算和逻辑运算:

四种整数操作:加载有效地址,一元操作,二元操作,移位。

具体见p119表格。

 

控制:

核心是跳转语句。

无条件跳转:jmp跳转目标可以是直接跳转,即跳转目标是作为指令的一部分编码;也可以是间接跳转,目标是从寄存器或存储器中读出的。

条件跳转:判断条件:标志位p124页。跳转指令,p128.

CMP是不会改变源操作数的减法,只是做比较之后改变标志位。

SUB是会改变源操作数的减法。

循环

if-else 的汇编结构:

p130页的三个版本的代码帮助理解汇编代码。

 

do-while的汇编结构:

p133页三个代码。

 

While的汇编结构:

p135 页三个代码。

 

for的汇编结构:

p138页的三个版本的代码。

 

条件传送指令:

P140三个代码。

基于条件数据传送的指令比基于条件控制转移指令的性能好。但是,条件数据传送很受限制,好在它们能用的情况还比较常见。

 

Switch:

P145,146两页的三个代码时理解的核心。

注意没有的情况归入default。汇编就直接跳转到所有情况后面的最后。

 

过程:

栈:栈顶指针,%esp。在汇编语言中,执行子程序之前,要将该跳转指令下一条指令的地址压入栈中保护起来,在子程序执行完了之后出栈,保证可以继续执行主程序。

Call指令将控制转移到一个函数的开始,ret指令返回到call指令后的下一条指令。

 

栈帧的gdb命令:

backtrace/bt n

n是一个正整数,表示只打印栈顶上n层的栈信息。

 

-n表一个负整数,表示只打印栈底下n层的栈信息。

 

frame n

n是一个从0开始的整数,是栈中的层编号。比如:frame 0,表示栈顶,frame 1,表示栈的第二层。

 

这个指令的意思是移动到n指定的栈帧中去,并打印选中的栈的信息。如果没有n,则打印当前帧的信息。

 

up n

表示向栈的上面移动n层,可以不打n,表示向上移动一层。

 

down n

表示向栈的下面移动n层,可以不打n,表示向下移动一层。

实验练习:

我使用Vim保存的mainangela.c

查看汇编代码

参考博客:20135202闫佳歆(参考内容:gdb的栈帧命令)

posted @ 2015-10-11 12:12  20135227黄晓妍  阅读(262)  评论(1编辑  收藏  举报