如何使用汇编来判断存在哪种类型的 cpu

问题描述 投票:0回答:1

所以因为我正在学习汇编和不同的 CPU 类型使用不同的功能或不同的寄存器。有没有一种方法能够编码并分辨出 ARM、英特尔或 AMD 处理器之间的区别?

我一直在研究,但没有发现任何东西。

编辑: 这个问题的目的是确定我们将为所有平台创建汇编代码,以及它们是否仅基于 CPU 和架构运行,而不是必须为每个平台创建单独的构建以使其更容易。虽然从评论看来你是为每个平台单独开发

assembly arm x86-64 intel amd-processor
1个回答
3
投票

要查找的关键字是“CPU 检测”或“CPU 识别”。

为了区分 architectures,比如 ARM vs Intel (x86),这个问题没有实际意义。在汇编级别,您必须首先选择一种架构来决定编码哪些指令。例如,如果你想将两个数字相加,你是写了

add eax, ebx
(组装成字节
01 d8
),还是写了
add x0, x1, x2
(组装成
20 00 02 8b
)?在前一种情况下,您正在为 x86 编写。为了首先获得您假定的体系结构检测代码,您必须执行许多以前只能在 x86 上运行的指令,所以当您到达那里时,您已经知道答案了。在后一种情况下,您正在为 ARM (ARM64) 编写代码。

(从技术上讲,相同的字节序列会在两种架构上做something;但在另一种架构上,它肯定不会是你想要的。通常汇编器/链接器会用正确的架构标记你的可执行文件,如果它与正在运行的机器不匹配,操作系统将拒绝执行它。)

为了区分 same 架构的 CPU,您首先必须确定是哪种架构,因为方法可能会非常不同。通常,通常会有一些特殊指令返回有关 CPU 的信息。在 x86 上你主要使用

cpuid
,在 ARM64 上有各种系统寄存器用
mrs
访问,等等。对于它们如何工作以及如何解释结果,您必须查阅该架构的指令集参考。

特别是对于 x86,多年来(在 Intel、AMD 和其他现已解散的竞争对手之间)发布了如此多不同的 x86 CPU,检测可能非常复杂,具体取决于您想追溯到多远。 (例如,

cpuid
指令并不总是存在,所以区分旧 CPU 的问题,比如 2000 年以前的,可能会写一篇很长的文章。)现在,还有一个额外的问题,你的程序甚至可能无法运行x86 硬件,但可能位于具有其他模拟 x86 的 CPU 的 VM 中。

对于大多数用途,“我如何分辨哪种 CPU”这样的一般性问题并不是真正要问的正确问题。相反,确定您有兴趣使用的特定 CPU 功能(例如 AVX 指令、增强的

rep movsb
等),然后问“我如何判断这个 CPU 是否支持它”?然后通常会有一个简单的答案,例如“将 0x1234 加载到
eax
中,执行 CPUID,并检查
ecx
的第 7 位”(虚构的示例)。除此之外,编写大量代码来区分 2035 MHz 的 Brandy Lake i8-1234U 或 3107 MHz 的 Vodka Lake i9-9876Z 之间的区别是没有意义的;原则上你可以找出你正在运行的是哪一个,但作为一名程序员,你没有真正的理由去关心。

© www.soinside.com 2019 - 2024. All rights reserved.