汇编语言(终章)
机器码布局(Machine Code Layout)
计算机工程师喜欢在将CPU的流水线划分为两部分:前端和后端,前段指的是指令从内存中获取并解码的部分,后端代表指令被调度并最终执行的部分。
通常,性能受到执行阶段的限制,因此,我们大部分的努力将用于围绕后端进行优化。
但有时候,相反的情况也会发生,比如前端无法足够快地向后端提供指令来饱和它。这可能由许多原因造成,所有这些原因最终都与机器码在内存中的布局有关,这些原因会以奇怪的方式影响性能,例如移除未使用的代码、交换“if”分支,甚至改变函数声明的顺序都有可能会导致性能的提高或恶化。
CPU前端(CPU Front-End)
在机器码被转换为指令和让CPU理解程序员想要做什么之前,CPU首先需要经历的两个重要阶段:获取和解码。
在获取阶段,CPU简单地从主内存中加载固定大小的字节块,这些块中包含指令的二进制编码。在x86结构的CPU上,这个块的大小通常是32字节,在不同架构的机器上可能会有