不同的ARM制造商是否提供不同的指令集?

不同的ARM制造商是否提供不同的指令集?,arm,instruction-set,Arm,Instruction Set,我第一次接触ARM指令集是在80年代,从那时起就没有使用过它。出于好奇,我看了看平板电脑和其他ARM设备,发现CPU是由不同的制造商生产的 我做了一个快速的搜索,但我找不到关于不同ARM芯片是否有不同指令集的明确声明 我假设它们基本上是相同的。指令集有一些常见的变体,其中最常见的是UAL、Thumb和Thumb2。一些包含专用硬件(如DSP)的ARM内核也扩展了该语言。转到内容下方的左侧,查找ARM体系结构。根据参考手册。曾经有一个单臂(ARM体系结构参考手册),但是这个家族已经发展到了必须将它

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

我做了一个快速的搜索,但我找不到关于不同ARM芯片是否有不同指令集的明确声明


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

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

转到内容下方的左侧,查找ARM体系结构。根据参考手册。曾经有一个单臂(ARM体系结构参考手册),但是这个家族已经发展到了必须将它分成几个家族的地步

ARM将向您展示指令集。我认为他们称之为ARMv5手册的是旧的ARM。您将找到ARM指令(32位)和thumb指令(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的处理器仅限于thumb,不支持32位ARM指令,也没有将thumb指令转换为的ARM内核,等等。新内核。ARMv6-M a.k.a Cortex-m0和Cortex-m1采用thumb指令集,并添加一些32位指令,以缩小与ARM的性能差距(thumb比ARM小是的,但比ARM慢一点。如果对两者都编译相同的代码,则使用thumb需要比我的实验多10-20%的指令)。理论上,thumb-2(ARMv7-M)无论何时何地都优于ARM。不管出于什么原因,Cortex-m3首先出现,它是ARMv7-M,并且在thumb指令集中添加了一组32位thumb2指令。我最近计算了一下,ARMv6-M添加了20条指令,ARMv7-M在基本thumb指令集中添加了140-150条指令。thumb2基本上是可变字长的。而且只在cortex-m系列上运行。从这个角度看,这几乎就像他们重新构建了名为thumb的ARM指令集。不完全是这样,但是你得到了很多类似arm的指令,三个寄存器而不是两个,能够访问更高的寄存器并使用即时指令,等等。这导致了一种编写asm的愿望,该asm同时为arm和thumb/thumb2编译。所以他们想出了一个统一的语法。你可以像这样写一个指令

add r0,r1
如果为拇指装配,这就是说明,如果为手臂装配,他们会将其转换为

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

同样重要的一套文档是技术参考手册,也可访问infocenter.arm.com。每个核心都有一个trm,实际上每个核心的每个版本都有一个trm。此外,对于每个版本,L2缓存等额外成本项目都有自己的TRM。了解芯片供应商购买/使用的核心以及可能的版本(版本2.0 r2p0、版本1.0 r1p0等)非常重要,因为它们之间存在编程差异和勘误表差异(不要相信Linux作为参考!它是一个巨大的烂摊子,每次我看到另一家公司完全误解和误用了核心/勘误表的差异,现在就有点像一场灾难)。有时,TRM包含指令信息,或更清楚地描述该内核支持和不支持的内容。ARM ARM是通用的,它们涵盖整个系列或多个系列的内核,其中TRM非常特定于一个内核。ARM ARM和TRM之间的混淆示例是查看ARMARM您可能会觉得您可以使用BE-32或BE-8 big-endian模式,事实上,您有一个或另一个ARMv6,更新的是BE-8,句号,习惯它。ARMv5和ARMv4是BE-32或之前的ARMv6,即所谓的big-endian。我强烈建议不要在ARM上使用big-endian,不管您认为从中可以获得什么好处。继续使用本机模式,您将节省大量的工作和失败。我从个人经验中提到这一点,试图找出为什么ARM中描述的位在我使用的核心中不起作用

64位内核在开发过程中的某个地方