码迷,mamicode.com
首页 > 其他好文 > 详细

信息安全系统设计基础第四周学习总结

时间:2015-10-12 17:05:01      阅读:152      评论:0      收藏:0      [点我收藏+]

标签:

第三章,程序的机器级表示

计算机执行机器代码。在本章中,我们会近距离地观察机器代码,以及人类可读的表示——汇编代码。

Intel处理器系列俗称x86。8086、80286、i386、i486、Pentium、PentiumPro、PentiumⅡ、PentiumⅢ、Pentium4、Pentium4E、Core2、Core i7。

摩尔定律:晶体管数量每26个月就会翻一番。

Linux使用平坦式寻址方式,使程序员将整个储存空间看做一个大的字节数组。

3.2程序编码

3.21机器及代码

两个抽象:①机器级程序的格式和行为,定义为指令集体系结构(ISA),它定义了处理器状态、指令格式、以及每条指令对状态的影响。

       ②机器级程序使用的存储器地址是虚拟地址,提供的存储器模型看上去是一个非常大的字节数组。

3.22代码示例

假设写一个C语言代码文件code.c,在命令行上使用“-s”选项,就能得到C语言编译器产生的汇编代码,会使gcc运行编译器,产生一个汇编文件code.s,但是不做进一步工作。

3.3数据格式

char      字节  b  1

short      字   w  2

int        双字   l   4

long int      双字  l    4

long long int  —   —  4

char *      双字  l   4

float     单精度  s  4

double    双精度  l   8

long double 扩展精度  t  10/12

3.4访问信息 

一个IA32中央处理器单元包括一组8个存储32位的寄存器。这些寄存器用来存储整数数据和指针。

3.41操作数指示符

大多数指令有一个或多个操作数,指示出一个操作中要引用的源数据值,以及放置结果的目标位置。

三种类型:①立即数,也就是常数值。

       ②寄存器,它表示某个寄存器的内容。

       ③存储器引用,它会根据有效地址访问某个存储器的位置

有多种不同的寻址模式

这种引用的四个组成部分:①立即数偏移Imm

            ②基址寄存器Eb

            ③变址寄存器Ei

            ④比例因子s(这里s必须是1、2、4、8)

3.42数据传送指令

MOV、MOVS、MOVZ

MOV

MOV reg/mem, imm      ;立即数?寄存器或存储器
MOV reg/mem/seg, reg ;寄存器的值?寄存器/内存/段寄存器
MOV reg/seg, mem       ;内存单元的值?寄存器/段寄存器
MOV reg/mem, seg      ;段寄存器的值?寄存器/内存单元
IA32的限制:两个操作数都不能指向存储器。

MOVZ中pushl将双字压栈和popl将双字出栈。

栈是一个数据结构,可以添加或者删除值,需要遵循“后进先出”的规则。通过操作把数据压进栈中,通过pop操作删除数据。

总是从一端插入或删除元素,这一端称为栈顶。

*将一个双字值压入栈中,首先要将栈指针减4,然后将值写到新的栈顶地址。

3.6控制

3.61条件码

CF:进位标志

ZF:零标志

SF:符号标志

OF:溢出标志

数据传送指令
MOV 不影响标志位
PUSH POP 不影响标志位
XCHG 交换指令 不影响标志位
XLAT 换码指令 不影响标志位
LEA 有效地址送寄存器指令 不影响标志位
PUSHF 标志进栈指令 不影响标志位
POPF 标志出栈指令 标志位由装入值决定

3.62访问条件码

setl:小于时设置

setb:低于时设置

movzbl:清零%eax的三个高位字节

3.7 过程

1.栈帧

为单个过程分配的那部分栈称为栈帧,通用结构见149页

所以本质上栈帧还是栈

2.两个指针

最顶端的栈帧以两个指针界定:

寄存器%ebp-帧指针
寄存器%esp-栈指针

栈指针可移动,所以信息访问多相对于帧指针。

3.调用的过程

课本150页过程P调用过程Q的示例。

调用者的帧应该在被调用者的下面,并且调用者返回地址是它的栈帧末尾,这样可以保证被调用者执行完毕全都出栈后,程序能够继续向下执行。

关于被调用者Q用栈的几个用处:

1.保存不能存放在寄存器中的局部变量。

当要对一个局部变量使用地址操作符&的时候,就必须要为它生成一个地址,所以要入栈。这个用法!以前没见过!

2.存放它调用的其他过程的参数。

Q会用栈帧来存放它调用的其他过程的参数。第一个参数放在相对于%ebp偏移量为8的位置处。剩下的参数存储在后续的4字节块中,所以参数i就在相对于%ebp的偏移量为4+4i的地方。
 
call指令有一个目标,即指明被调用过程起始的指令地址。(可以直接也可以间接)
call指令效果是将返回地址入栈,并跳转到被调用过程的起始处。
ret命令从栈中弹出地址,并跳转到这个位置。正确的使用这条命令,要使栈做好准备,栈指针要指向前面call指令存储返回地址的位置。
寄存器%eax可以用来返回值。
 
程序寄存器是唯一能被所有过程共享的资源。
根据惯例,寄存器%eax,%edx,和%ecx被划分为调用者保存寄存器,寄存器%edx,%esi,和%edi被划分为被调用者保存寄存器。
 
GCC坚持一个X86编程指导方针,也就是一个函数使用的所有栈空间必须是16字的整数倍。采用这个原则是为了保证访问数据的严格对齐。
栈规则提供了一种机制,每次函数调用都有它自己私有的状态信息(保存的返回位置,栈指针和被调用者保存寄存器的值)存储。有需要的话还可以提供局部变量的存储。
 
 
参考资料---闫佳歆,万子惠

 

信息安全系统设计基础第四周学习总结

标签:

原文地址:http://www.cnblogs.com/20135335hs/p/4871870.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!