寄存器寄存器 vs 寄存器内存

问题描述

我最近阅读了有关 SPARC 的文章。维基页面说它是一个寄存器-寄存器类型的架构。 x86 上的页面说它是寄存器内存类型 a。有人可以用一个假设的例子来解释这两种类型之间的区别吗。

解决方法

Register-register 是 load-store 的同义词。

直接来自维基百科:

在计算机工程中,寄存器-内存架构是一种指令集架构,允许在(或从)内存和寄存器执行操作。

在寄存器-内存方法中,ADD 操作的一个操作数可能在内存中,而另一个在寄存器中。

这与加载/存储架构(由 RISC 设计如 MIPS 使用)不同,在加载/存储架构中,ADD 操作的两个操作数都必须在 ADD 之前的寄存器中。

一些 RISC 架构,例如 PowerPC、SPARC、RISC-V、ARM 和 MIPS,是加载-存储架构。

,

x86 是一个 CISC,它允许add eax,[rdi] 这样的寄存器内存,也允许像 add edx,ecx 这样的寄存器-寄存器。 (甚至内存寄存器,具有像 add [rdi],ebx 这样的 RMW 内存目标。)

那种 CISC 并不能很好地融入这个分类法。 (https://www.realworldtech.com/architecture-basics/2/ 对这些类型的机器有更多的了解)。这个分类法真的太简单了,因为它没有捕捉到具有多个寄存器并且不必一直使用内存的机器之间的区别,而早期的简单机器大多数代码确实使用了一个内存操作数的大多数指令(另一个是寄存器)。例如一些 8 位微处理器(如 6502)有一个 OR 指令,有一个内存源(https://www.masswerk.at/6502/6502_instruction_set.html),而其他的 like 8080 可能有一个内存源,或者一个它的其他寄存器。 (但仍然只进入累加器,因此 ora 助记符,例如 ora b 执行 a |= b,而 x86 使两个操作数成为您选择的最简单指令的寄存器。)

请注意,x86 不能进行内存-内存(例如,add [rdi],[rsi] 是不可编码的,与 VAX 不同,后者的两个操作数都可以独立为寄存器或具有复杂寻址模式的内存)。 Why isn't movl from memory to memory allowed? 解释了 CPU 架构/机器代码的原因。

另见 What kind of address instruction does the x86 cpu have? - x86 是大多数普通遗留指令的 2 操作数 CISC 机器,但 AVX SIMD 指令和一些标量整数的 3 操作数......它不是最常规的 ISA:


对机器进行分类的一种相关方法是 SPARC(如所有(?)RISC)是一种加载-存储机器:可以访问内存的唯一指令是加载和存储。你不能有像 add 这样的普通 ALU 指令的内存操作数。

“load-store”机器是 register-register 的同义词,但 not 是 load-store ISA 并不意味着任何特定的格式。