标签:
计算机执行机器代码。在本章中,我们会近距离地观察机器代码,以及人类可读的表示——汇编代码。
Intel处理器系列俗称x86。8086、80286、i386、i486、Pentium、PentiumPro、PentiumⅡ、PentiumⅢ、Pentium4、Pentium4E、Core2、Core i7。
摩尔定律:晶体管数量每26个月就会翻一番。
Linux使用平坦式寻址方式,使程序员将整个储存空间看做一个大的字节数组。
3.21机器及代码
两个抽象:①机器级程序的格式和行为,定义为指令集体系结构(ISA),它定义了处理器状态、指令格式、以及每条指令对状态的影响。
②机器级程序使用的存储器地址是虚拟地址,提供的存储器模型看上去是一个非常大的字节数组。
3.22代码示例
假设写一个C语言代码文件code.c,在命令行上使用“-s”选项,就能得到C语言编译器产生的汇编代码,会使gcc运行编译器,产生一个汇编文件code.s,但是不做进一步工作。
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
一个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.61条件码
CF:进位标志
ZF:零标志
SF:符号标志
OF:溢出标志
数据传送指令
MOV 不影响标志位
PUSH POP 不影响标志位
XCHG 交换指令 不影响标志位
XLAT 换码指令 不影响标志位
LEA 有效地址送寄存器指令 不影响标志位
PUSHF 标志进栈指令 不影响标志位
POPF 标志出栈指令 标志位由装入值决定
3.62访问条件码
setl:小于时设置
setb:低于时设置
movzbl:清零%eax的三个高位字节
为单个过程分配的那部分栈称为栈帧,通用结构见149页
所以本质上栈帧还是栈。
最顶端的栈帧以两个指针界定:
栈指针可移动,所以信息访问多相对于帧指针。
课本150页过程P调用过程Q的示例。
调用者的帧应该在被调用者的下面,并且调用者返回地址是它的栈帧末尾,这样可以保证被调用者执行完毕全都出栈后,程序能够继续向下执行。
关于被调用者Q用栈的几个用处:
1.保存不能存放在寄存器中的局部变量。
当要对一个局部变量使用地址操作符&的时候,就必须要为它生成一个地址,所以要入栈。这个用法!以前没见过!
2.存放它调用的其他过程的参数。
标签:
原文地址:http://www.cnblogs.com/20135335hs/p/4871870.html