《深入理解计算机系统》笔记
潘忠显 / 2020-10-25
大小端的理解
- 大小端是 CPU 寻址的区别
- 大小端都满足:起始位置是小地址,结束位置是大地址,比如
&x
是0x100
,如果占用 4 字节则,占用的位置都是0x100
、0x101
、0x102
、0x103
- 小端是存储的起始位置存数字低位
- 大端是存储的起始位置存数字高位
- 起始位置存的是高低位决定了大小端,存的高为就是大端,存的低的就是小端
- 网络序是大端序
- Intel x64 使用小端法,ARM 的字节序可以配置
整数表示
数据转换
有符号 跟 无符号比较,是将有符号转换为无符号,下边的代码会返回 true
:
cout << (INT_MAX < 0U - 1) << endl;
Integer conversion rank
指令集架构 ISA Instruction set architecture
常见的 IA32 机器代码中用到的一些变量:
程序计数器 PC %eip
整数寄存器变量 8个 每个存储32bit
条件码寄存器
浮点数寄存器
leal
addl
Intel Architecture, 32-bit,缩写为IA-32),常被称为i386、或x86,
链接器
符号解析 symbol resolution + 重定位 relocation
编译-汇编-链接
目标文件(不仅指.o文件)的基本事实:
- 是字节块集合
- 包含内容:程序代码、程序数据、指导链接器和加载器的数据结构
- 三种形式:可重定位目标文件、可执行目标文件、共享目标文件(一种特殊的可重定位目标文件)
编译器和汇编器产生的是可重定位目标文件(包括共享目标文件)。
链接器产生的是可执行目标文件
目标模块/目标文件
ELF (Unix 可执行和可连接格式)
不小心 vim 一个ELF 文件
00000000: 7f45 4c46 0201 0100 0000 0000 0000 0000 .ELF............
00000010: 0200 3e00 0100 0000 3004 4000 0000 0000 ..>.....0.@.....
00000020: 4000 0000 0000 0000 a818 0000 0000 0000 @...............
00000030: 0000 0000 4000 3800 0900 4000 1c00 1b00 ....@.8...@.....
符号表是由汇编器构造的,使用的是编译器输出到汇编语言 .s 文件中的符号。