MIPS和ARM的区别

12

我刚开始学习架构,对MIPS和ARM架构之间有些困惑。

我了解到MIPS主要有两种指令格式:I和R(还有J)。我读了关于这些表示格式、rs、rt、opcode以及相关内容的介绍。我还查看了Patterson(第四版)的《COA》书,该书着重介绍ARM ISA。在这个版本中,指令表示方式不同。这些差异是由于不同的架构造成的吗?而且,我使用MIPS ISA的书与ARM汇编代码略有不同。

例如,Patterson第IV版说:

LDR r5,[r3,#32]
STR r1,[r4,#48]

另一篇我阅读的MIPS文章则表示

lw r5,[r3,#32]
sw r1,[r4,#48]

这种差异是由于它们遵循的ISA不同还是它们是同一ISA的两个不同版本?您能否解释一下MIPS和ARM之间的关键区别?


没有MIPS汇编语法像那样,也没有r5或r1。你只有$0到$32或者寄存器名称像$s0、$t1、$a0、$v0、$k0... 你需要写类似于lw $5, 32($t3)或者sw $a0, 48($t4)的东西。 - phuclv
1
MIPS和ARM是不同的架构和不同的指令集。它们不是彼此的变体,因此称其为“变化的”是不恰当的。 - phuclv
所以lw、sw是MIPS的加载和存储,而ldr、str是ARM的相同操作? - Mail
1个回答

7

是的,lw和sw是用于mips的加载和存储指令。ldr和str是用于arm的加载和存储指令。而对于x86,您需要使用mov指令。

Mips通常使用$0-$31或更恶心的$v0等语法。Arm和许多其他公司使用r和数字r0-rn(有些人也在尝试使用别名名称来使其变得丑陋)。

ARM和MIPS是竞争对手,它们不是同一家公司,也不是相同的体系结构。 MIPS机器编码落入了您提到的几个类别中,由于种种原因,ARM有许多这样的类别,这两者在MIPS或ARM文档中都有很好的记录。

因此,就指令编码而言,这取决于指令集发明者,无论他们选择哪种原因(好的、坏的或其他),这是他们自己的事情,他们可以随心所欲地做任何事情。

至于汇编语言语法,ISA发明者通常会创建一个与指令集文档配套的汇编程序,他们通常会创建或聘请某人制作汇编程序。 但是,汇编器(将汇编语言转换为机器代码的软件)的作者最终决定汇编语言语法,并且他们不必遵守ISA文档中的语法。 两个分别创建的汇编器使用相同的语法没有理由。 例如,随着时间的推移,十六进制数字有一个美元符号$12或尾随h 12h,但现在您通常会看到支持或首选C语法0x12。 有时,您会看到间接加上偏移量为12(r3)或[r3,#12]来描述完全相同的内容。


值得注意的是,大多数指令集体系结构(ISA)都会包含一些非常相似和基本的指令,在汇编语言中它们看起来可能非常相似。就像 ldr/lw 和 str/sw 一样,所有算术操作也会非常相似,比如加法、与、或等等(ARM 和 MIPS 也似乎都使用了三个寄存器/值的方法,而不像 x86)。这背后的原因是这些操作对硬件的工作方式有着相当重要的作用。 - Unn
当你学习一些指令集架构时,你会发现它们既相似又不同。例如,加载、存储、加法、或运算和通常的其他基本操作都是相似的,但汇编语言的细微差别以及语法则千差万别... - old_timer
非常正确,语法完全取决于汇编器(例如x86的AT&T vs Intel语法); 但是这些结构非常相似,只需阅读即可。虽然这些细微差别也很有趣,例如MIPS中的分支延迟槽和ARM中的条件执行。 - Unn
是的,这就是其中一个经典例子,我只是希望人们明白汇编语言不像Python、C++或Java那样是一种标准。在某种程度上,它完全是程序作者发明的,尽管第N个工具的作者通常会明智地遵循现有工具的兼容模式或拥有其兼容性模式,以便人们可以移植他们的代码,但这并不总是发生。 - old_timer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接