8

我第一次接触 ARM 指令集是在 80 年代,从那以后就没有使用过。出于好奇,我查看了平板电脑和其他 ARM 设备,并注意到 CPU 是由不同的制造商生产的。

我进行了快速搜索,但找不到关于不同 ARM 芯片是否具有不同指令集的明确声明。

我会假设它们基本上是相同的。

4

4 回答 4

6

转到http://infocenter.arm.com 在左侧的内容下查找 ARM 架构。并在该参考手册下。过去只有一个 ARM ARM(ARM 体系结构参考手册),但这个家族已经发展到他们不得不将其分解为多个家族的地步。

ARM ARM 将向您展示指令集。我认为他们所说的 ARMv5 手册是旧的 ARM ARM。您将找到 ARM 指令(32 位)和拇指指令(16 位)。对于每条指令,他们都列出了支持它的架构,因此您可能会看到 ARMv4 不支持的 ARMv5 指令(ARMv4 又名 ARM7,如流行的 ARM7TDMI 内核)。ARMv4T 和更新版本等支持 Thumb 指令。

因此,您可能已经习惯了核心 32 位 arm 指令集,其中不时添加新指令并修复了错误/限制(例如 ldr r0,[r0])等。

浮点单元进行了一两次大修,大多数内核没有 fpu,而有 fpu 的内核并不意味着芯片供应商将其包含在芯片中。fpa 较旧,vfp 较新,现在是霓虹灯。如果您注意这些都属于通用协处理器指令类别。但是您不必知道/使用协处理器版本,它们对所有内容都有别名。

有/曾经有这个 java/jazelle 的东西,同样的故事一些核心可能有它作为一个选项并不意味着供应商包括它。

thumb指令集至少有两组thumb2扩展。在 thumb2 扩展之前,thumb 指令都是 16 位的,并且与 ARM 指令具有一对一的映射关系,这意味着您只需要一个 ARM 内核,解码器将较小的指令转换为 ARM 指令并将其提供给内核。除分支外,所有指令都是 16 位的,如果您查看该模式,您可以很容易地将其解码为两个单独的 16 位指令。于是他们决定让他们的微控制器变得更小,而不是每个人都只使用 ARM7TDMI 并消耗芯片尺寸和功率,支持 thumb2 的处理器只是拇指,它们不支持 32 位 ARM 指令,没有拇指指令的 ARM 内核被翻译成等新的核心。ARMv6-M ak a Cortex-m0 和 Cortex-m1 采用 thumb 指令集并添加一些 32 位指令来缩小与 ARM 的性能差距(thumb 更小,是的,但如果你为两者编译相同的代码,它会比 ARM 慢一点,它需要比如我的实验中使用拇指的指令增加了 10-20%)。理论上,thumb-2 (ARMv7-M) 在您可以比较它们的时间和地点都优于 ARM。无论出于何种原因,Cortex-m3 首先出现,它是 ARMv7-M,并且在 thumb 指令集中添加了一堆 32 位 thumb2 指令。我最近数了一下,ARMv6-M 添加了大约 20 条,ARMv7-M 在基本拇指指令集中添加了大约 140-150 条指令。thumb2 基本上是可变字长。再次仅在 cortex-m 系列上运行。看着它几乎就像他们以 thumb 的名义重新构建了 ARM 指令集。不完全,但你得到了很多类似手臂的指令,三个寄存器而不是两个,能够到达更高的寄存器并使用立即数等。这导致了编写为 ARM 和拇指/拇指 2 编译的 asm 的愿望。所以他们想出了一个统一的语法。你可以写一个指令

add r0,r1

如果为拇指组装,这是说明,如果为手臂组装,他们会将其转换为

add r0,r0,r1

为您,而不是任何语法错误。您必须指定使用统一语法,至少使用 gnu binutils 汇编程序(gas)。

一组同样重要的文档是技术参考手册,也位于 infocenter.arm.com。每个核心都有一个 trm,实际上每个核心的每个 rev 都有一个 TRM。此外,L2 缓存等额外成本项目对于每个 rev 都有自己的 TRM。找出芯片供应商购买/使用的内核以及可能的修订版(rev 2.0 r2p0、rev 1.0 r1p0 等)很重要,因为它们之间存在编程差异以及勘误表差异(不要相信 Linux 作为参考! ,这是一个巨大的混乱,每次我看到另一家公司完全误解和误用了核心/勘误表的差异,目前它有点灾难)。有时,TRM 包含指令信息,或者更清晰地描绘了核心支持和不支持的内容。ARM ARM' s 是通用的,它们涵盖整个系列或许多系列的内核,其中 TRM 非常特定于一个内核。一个混淆 ARM ARM 和 TRM 的例子是,看着 ARM ARM,您可能会觉得您可以使用 BE-32 或 BE-8 大端模式,但实际上您有一个或另一个 ARMv6 和较新的是BE-8,时期,习惯它。ARMv5 和 ARMv4 是 BE-32 或在 ARMv6 之前称为大端。我强烈建议不要在手臂上使用大端,尽管你认为你可能会从中受益。使用本机模式,您将为自己节省大量的工作和失败。我从个人经验中提到它,试图弄清楚为什么 ARM ARM 中描述的位在我使用的内核中不起作用。一个混淆 ARM ARM 和 TRM 的例子是,看着 ARM ARM,您可能会觉得您可以使用 BE-32 或 BE-8 大端模式,但实际上您有一个或另一个 ARMv6 和较新的是BE-8,时期,习惯它。ARMv5 和 ARMv4 是 BE-32 或在 ARMv6 之前称为大端。我强烈建议不要在手臂上使用大端,尽管你认为你可能会从中受益。使用本机模式,您将为自己节省大量的工作和失败。我从个人经验中提到它,试图弄清楚为什么 ARM ARM 中描述的位在我使用的内核中不起作用。一个混淆 ARM ARM 和 TRM 的例子是,看着 ARM ARM,您可能会觉得您可以使用 BE-32 或 BE-8 大端模式,但实际上您有一个或另一个 ARMv6 和较新的是BE-8,时期,习惯它。ARMv5 和 ARMv4 是 BE-32 或在 ARMv6 之前称为大端。我强烈建议不要在手臂上使用大端,尽管你认为你可能会从中受益。使用本机模式,您将为自己节省大量的工作和失败。我从个人经验中提到它,试图弄清楚为什么 ARM ARM 中描述的位在我使用的内核中不起作用。习惯它。ARMv5 和 ARMv4 是 BE-32 或在 ARMv6 之前称为大端。我强烈建议不要在手臂上使用大端,尽管你认为你可能会从中受益。使用本机模式,您将为自己节省大量的工作和失败。我从个人经验中提到它,试图弄清楚为什么 ARM ARM 中描述的位在我使用的内核中不起作用。习惯它。ARMv5 和 ARMv4 是 BE-32 或在 ARMv6 之前称为大端。我强烈建议不要在手臂上使用大端,尽管你认为你可能会从中受益。使用本机模式,您将为自己节省大量的工作和失败。我从个人经验中提到它,试图弄清楚为什么 ARM ARM 中描述的位在我使用的内核中不起作用。

一个 64 位内核正处于开发阶段,如果它完成并且只是寻找某人来扣动扳机并使用它,我不会感到惊讶。实际上 ARMv8 文档是可用的,现在就下载。

在 ARM 架构下的简短回答 infocenter.arm.com,您可以找到所有描述不同指令集的文档以及随着时间的推移对这些指令集的改进/添加。

于 2012-01-12T04:33:01.927 回答
3

制造商之间没有区别(就指令集而言)。他们都尊重 ARM 规范。

一些扩展是可选的。NEON就是这种情况。

但是,据我所知,只有 Tegra 2 不包含此扩展。这就是为什么 Tegra 2 是一个非常糟糕的视频解码处理器(例如)。

于 2012-01-12T08:38:17.763 回答
2

指令集有一些常见的变体,UAL、Thumb 和 Thumb2 是最常见的。一些包含专用硬件(例如 DSP)的 ARM 内核也扩展了该语言。

于 2012-01-12T03:50:03.283 回答
1

过去并非如此。ARM 要求遵守他们的规范。ARM 提供的 IP 当然符合他们的规范,但他们也要求架构被许可人遵守它。然而,在 2019 年,当ARM 开始允许其嵌入式 CPU 使用自定义指令时,这种情况略有改变。

于 2020-12-12T14:35:59.757 回答