这是我第二遍写这篇博客,前一遍再快完成的时候IE提示我cnblog.com无响应,取消之后就变成白板了。。。。
第三章,程序的机器级表示
计算机执行机器代码。在本章中,我们会近距离地观察机器代码,以及人类可读的表示——汇编代码。
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 过程
3.71栈帧结构
IA32程序用程序栈来支持过程调用。为单个过程分配的那部分栈称为栈帧(stark frame)
寄存器%ebp为帧指针,寄存器%esp为栈指针。
栈帧并没有真正理解其意义,但是在上学期学习的汇编和数据结构里我大致明白寻址还有栈的意思。希望能在后面的学习中慢慢搞明白。
参考资料:《深入理解计算机系统》 闫佳歆同学的博客。