硬着头皮来看一遍深入理解计算机系统,对其中章节进行做个笔记,其中有些一知半解的希望这次是真的懂来
1、程序的过程:从源文件到目标文件的过程
1.1 hello.c
1.2 hello.i 预处理阶段,将#开头的头文件进行展开,宏定义替换
1.3 hello.s 编译阶段,将hello.i文件翻译成汇编程序
1.4 hello.o 通过汇编器as将程序生成为可重定位的二进制的目标程序
1.5 hello 通过链接器生成可执行的目标程序
2. 存储设备
更小更快更贵,更大更慢更便宜
寄存器--》高速缓存l1--》高速缓存l2--》高速缓存ln--》主存--》本地磁盘--》远地磁盘
3. 类型大小
32位下
short int是2字节,long是4字节,long long才是8字节,char*是4字节
64位下
long是8字节,long long也是8字节,char* 是8字节
4.小端法,大端法
比如int类型下,内存值从小到大为
01 23 45 67
如果是小端法,则这个值是0x67452301,大端法这个值则是0x01234567。linux和windows目前都是采用小端法
5. 移位
移位分为算术右移和逻辑右移,就是符号位的问题,如果是算术右移,符号位需要继续保持不变,而逻辑右移则是在最右边补0即可
6.程序的机器级表示,是本次的重点内容来,主要是看懂了一些汇编的基础知识,寄存器的使用
%eip 表示要执行的下一条指令
%esp 栈顶指针
$ebp the temp data,always get data from esp, because esp is always change, we want to use esp data,so we set the esp to ebp for compute
还有寄存器的取值说明,比如直接寻址,间接寻址,立即数寻址,不再列出,下面以实际代码来进行说明
int decode1(int* xp, int* yp, int* zp)