这是我第二遍写这篇博客,前一遍再快完成的时候IE提示我cnblog.com无响应,取消之后就变成白板了。。。。
计算机执行机器代码。在本章中,我们会近距离地观察机器代码,以及人类可读的表示——汇编代码。
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:清零
