对于编程的初学者而言,开源软件是一个知识的宝库。我们今天开始介绍如何通过分析开源软件的代码来学习汇编语言。我们从谷歌的cpu_features软件说起。谷歌的cpu_features是一个C语言的库,主要用于检测当前运行环境的CPU参数,程序可以根据当前CPU参数来选择适合的代码,例如如果CPU支持AVX,就可以使用AVX指令增强并行计算能力。这个库现在是Android NDK的一部分,所以知名度很高。要下载该库可以访问https://github.com/google/cpu_features,或点击“阅读原文”。目前该库可以支持多个操作系统和多种CPU架构,具体的情况见下表。
当然,我们的重点是在x86架构上。在x86架构上,该软件使用了CPUID这条指令。
CPUID指令
CPUID指令是Intel于1993年在奔腾处理器中引入的。根据调用CPUID指令前EAX寄存器的值不同,CPUID指令返回不同的数据(下图)。 在将近30年的时间内 Intel推 出了大量的 CPU型号,这条指令也变得异常复杂。现在这条指令可以返回CPU的家族、型号、Cache大小、支持的指令集等各种信息。