《深入理解计算机系统》读书笔记-04
x86 的历史渊源
Intel 处理器系列之所以被称为“x86”,是因为从 1978 年第一代单芯片开始,直到 1989 年的 i486,Intel 的芯片命名都以后缀“86”结尾。因此沿袭了惯例,将 Intel 的芯片均称为 x86 系列。
汇编初步
生成汇编代码的办法
使用gcc
(GNU Compile Collection,GNU 编译器套件)工具可以容易地得到 C 代码对应的汇编代码。具体命令为:
gcc -Og -S [C 文件名称]
运行上述命令,即可生成与源文件同名的汇编文件,并且不进行其他更进一步的操作;使用cat [汇编文件名称]
命令可以查看文件内容。
注意在上述命令中,-Og
是大写的字母O
,注意不要写成了数字0
,表示的是“optimize”,即“优化”。这个参数限制了编译器的优化行为,避免了编译器对源代码过分优化,导致得到的汇编代码结构与 C 代码差异过大,增大学习难度。
参数-S
指定编译器将源文件编译为汇编代码。注意字母S
大写。
此外,目标代码拥有可执行代码的全部指令,二者区别在于:目标代码没有填入全局值的地址。
反汇编
反汇编,即根据机器代码复原相应的汇编代码的操作。
使用命令:
objdump -d [要反汇编的机器代码源文件]
即可根据机器代码得到相应的汇编代码。其中objdump
为“object dump”的简写。
在 C 语言中插入汇编代码的两种方法
- 用汇编代码编写整个函数,在连链接段再把它们和 C 函数组合起来。比如
malloc()
就是这样的汇编函数。 - 使用 GCC 的内联汇编(inline assembly)特性,用 asm 伪指令在 C 程序中包含简短的汇编代码。
实际的内存使用限制
在目前的实现中,内存地址高 16 位必须设置为 0,所以真正能够使用的地址在 2^48 字节或者说 64 TB范围内。