您的位置:首页 > 移动开发

CSAPP 学习笔记 Chapter two & three

2016-05-02 19:45 369 查看

关于Chapter two

本章余下内容依次为:

2.2整数表示

2.3整数运算

2.4浮点数

多为关于计算机中数的基于离散数学原理的数学表示以及将其转换为计算机中的表示规则。在以后遇到问题(不同类型数转换,溢出,位模式,舍入等)时能留个印象,知道在哪找原因就行,不再进行博客记述。

Chapter three

先导

计算机执行机器代码,用字节序列编码底层的操作。

编译器基于编程语言的规则、目标机器的指令集和操作系统,经过一系列的阶段产生机器代码。

汇编代码是机器代码的文本表示,也是本章的主题内容。

逆向工程(reverse engineering) ——通过研究系统的逆向工作,来试图了系统的创建过程。第三章中,系统指的是机器产生的汇编语言程序。

3.1为处理器的发展历程…

3.2

编译时,提高优化级别会使最终程序运行得更快,但是产生的代码会严重改变形式,编译时间会更长。导致与源代码之间的关系难以理解

gcc编译过程:

C预处理器将#include文件代码插入,扩展#define定义的宏

编译器产生汇编代码

汇编器转化为二进制目标代码

链接器将目标代码与实现库函数的代码合并,产生可执行文件

机器级编程的两种抽象:指令集体系结构,定义机器级程序的格式(指令)和行为(指令对各个底层部件产生的影响);虚拟地址,提供一个看似线性的存储系统,而实际是由多个硬件存储器和操作系统软件组合起来。

3.3

3.4

操作数类型:立即数,寄存器内容,存储器内容。

IA32(intel architecture 32bit)中,栈向低地址方向增长。

3.5

3.6

3.7

一个过程调用包括将数据和控制从代码的一部分传递到另一部分,它还必须在进入时为过程的局部变量分诶空间,退出时释放空间。

调用者的栈帧存放参数和返回地址。

call指令将返回地址入栈,并跳转到被调用过程的起始处,返回地址是紧跟在call后的指令地址。ret从栈中弹出地址,并跳转到这个位置。

寄存器分类:eax、edx、ecx为调用者保存寄存器,调用者P负责保存它们的值,被调用过程Q可以覆盖。ebx、esi、edi为被调用者保存寄存器,Q覆盖之前,必须保存它们的值,返回P前恢复它们。

参数通过栈传递给函数,可以在栈中用相对于ebp的正偏移量来访问,可以用push指令在栈上分配空间。返回前,必须将栈恢复到原始条件。

被调用函数的一般写法:

Calledfunc:
pushl ebp   //保存主用函数的栈基址
movl %esp,%ebp   //将当前的栈顶指针作为函数栈基址
...
movl %ebp,%esp   //栈顶指针指向栈基址,即清空被调函数栈帧
pop  %ebp   //将主调函数栈基址还原


3.8

寄存器溢出(register spilling):没有足够多的寄存器保存需要的临时数据,可以把一些局部变量放在存储器中。通常,读存储器比写方便很多,因此尽量把只读量放到存储器中。

3.9

3.10

将指针从一种类型转换到另一种类型,只改变它的类型,而不改变它的值。即改变的是指针运算的伸缩尺度。

char c;
char *p = &c;       //p是char*类型指针,值为t
(int*)p + 7;        //得到t+28,地址计算按int 4字节标准
(int*)(p+7);        //得到t+7


3.11
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: