问题

为什么 ARM 和 MIPS 那么多寄存器,x86 那么少?

回答
这个问题很有意思,也触及了计算机体系结构设计的根本理念。其实说 ARM 和 MIPS “那么多”寄存器,而 x86 “那么少”,这个说法是基于一种常见的观察,但需要更深入地理解其背后的原因。这并不是一个简单的“多”或“少”的问题,而是不同设计哲学、历史演进和目标市场所带来的差异。

咱们就一层一层地剥开来看。

1. RISC vs. CISC:设计哲学的天壤之别

这是最核心的解释。

RISC (Reduced Instruction Set Computing,精简指令集计算):ARM 和 MIPS 都属于 RISC 架构。RISC 的设计理念是让指令集尽可能简单、精炼。它的核心思想是:
指令少而精: 每条指令的功能非常单一,而且执行速度快(通常一个时钟周期完成)。
大量通用寄存器: 为了支持这种“指令少”的设计,RISC 架构的设计者将更多的计算任务和数据临时存储的任务交给了寄存器。CPU 内部有很多通用寄存器(比如 ARMv7 有 16 个通用寄存器,ARMv8 AArch64 有 31 个通用寄存器,MIPS 也有 32 个通用寄存器),这些寄存器可以被用来存放数据、地址、中间结果等等。
Load/Store 架构: RISC 通常采用 Load/Store 架构,也就是说,只有专门的 Load 和 Store 指令才能访问内存。其他所有计算指令(加法、减法、逻辑运算等)都只能在寄存器之间进行操作。这样做的好处是,CPU 内部的执行单元可以专注于纯粹的计算,不需要频繁地等待内存访问,从而提高了执行效率。大量的寄存器就成了在这些 Load/Store 操作之间缓存数据的关键。
流水线优化: 指令简单、执行速度快,这为实现高效的指令流水线提供了便利。更多的寄存器也使得在流水线中处理数据和控制流更加顺畅,减少了寄存器冲突和回填(backtracking)的需要。

CISC (Complex Instruction Set Computing,复杂指令集计算):x86(Intel 和 AMD 的 CPU 所采用的架构)属于 CISC 架构。CISC 的设计理念则相反,它试图通过复杂的指令来完成更多的工作,以此来减少程序中指令的数量,并降低对内存带宽的依赖(在早期的计算环境中,内存和总线速度是很大的瓶颈)。
指令种类繁多: CISC 指令集非常庞大,一条指令可能就可以完成几个 RISC 指令才能完成的事情(例如,一条 x86 指令就可以同时从内存中读取两个数,将它们相加,然后将结果写回内存)。
寄存器数量相对较少(早期): 由于许多操作可以直接在内存中进行,而且指令本身就可以包含地址信息,或者有专门的寄存器来处理特定的地址或操作数,所以早期 CISC 的设计对大量通用寄存器的需求就没有那么迫切。寄存器更多的是被用作特权寄存器、通用用途但功能受限的寄存器,以及一些用于存储地址的寄存器。
面向软件开发的便利性(早期): 在汇编语言编程时代,更少的指令数量(因为一条指令完成更多工作)可以简化一些汇编代码的编写,减少程序员需要记住的指令种类。

举个例子说明寄存器在 RISC 和 CISC 中的作用差异:

假设我们要计算 `a = b + c`,其中 `a`, `b`, `c` 都存储在内存中。

RISC (ARM/MIPS 风格):
```assembly
LOAD R1, [address_of_b] // 将内存地址中的 b 加载到寄存器 R1
LOAD R2, [address_of_c] // 将内存地址中的 c 加载到寄存器 R2
ADD R3, R1, R2 // 将 R1 和 R2 相加,结果存入 R3
STORE R3, [address_of_a] // 将 R3 中的结果存储回内存地址中的 a
```
这里需要 3 个通用寄存器来完成这个简单的加法。如果有更多的中间计算,需要的寄存器就更多。

CISC (x86 风格):
```assembly
MOV EAX, [address_of_b] // 将内存地址中的 b 加载到 EAX 寄存器
ADD EAX, [address_of_c] // 将内存地址中的 c 加到 EAX 的当前值
MOV [address_of_a], EAX // 将 EAX 中的结果存储回内存地址中的 a
```
在这里,一条 `ADD` 指令可以直接从内存中读取操作数并进行计算,并且结果可以写回内存。理论上,只需要一个寄存器(EAX)来暂存中间结果,或者甚至可以直接在内存和寄存器之间进行操作,所需的通用寄存器数量就相对较少。

2. 历史演进和技术进步:x86 的进化

x86 最初的设计确实遵循了 CISC 的思路,并且寄存器数量相对较少。但是,随着技术的发展,现代 x86 处理器虽然仍然是 CISC 指令集(向前兼容是其设计的重要考量),但其内部实现却已经发生了翻天覆地的变化。

微指令(Microcode)的引入: 现代 x86 处理器在执行 CISC 指令时,并不会直接用硬件逻辑去实现这些复杂的指令。相反,每一条复杂的 x86 指令会被“解码”成一系列更小的、更简单的内部操作,这些操作称为“微指令”(microops)。
超标量与乱序执行: 这些微指令很多时候就类似于 RISC 指令。现代 x86 处理器拥有非常强大的乱序执行引擎和超标量设计,能够同时解码并执行多条微指令。为了支持这一点,CPU 内部实际上会创建大量“私有”的、临时的寄存器(称为 P 寄存器或影子寄存器)。当一条 CISC 指令被解码成多个微指令时,这些微指令就会操作这些内部寄存器,而不会直接暴露给外部程序。
寄存器重命名(Register Renaming): 这是现代 CPU 的一个关键技术。它允许处理器为每一个操作数(包括内存地址中的数据和来自外部的寄存器值)分配一个临时的、内部的寄存器。这样,即使两条指令引用了相同的外部(可见的)寄存器,但如果它们操作的是不同的数据,处理器就可以使用不同的内部寄存器来执行,避免了寄存器依赖带来的流水线阻塞。这极大地增加了“逻辑上”的寄存器数量。

所以,当我们在编程时看到的 x86 寄存器(如 EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP 等 8 个 32 位通用寄存器,在 64 位模式下扩展到 RAX, RBX 等 16 个 64 位通用寄存器)确实比 ARM 或 MIPS 的可见通用寄存器数量少。但内在执行层面,现代 x86 的寄存器数量是远超我们看到的数量的,并且通过寄存器重命名等技术,极大地提高了寄存器利用率和并行执行能力。

3. 应用场景和优化目标

ARM/MIPS (RISC): 它们在设计之初就广泛应用于嵌入式系统、移动设备、服务器等领域。在这些领域,功耗、效率和灵活的指令集(便于编译器优化)是重要考量。大量的通用寄存器为编译器生成高效的代码提供了极大的便利,可以最大限度地减少对内存的访问,提高性能和降低功耗。
x86 (CISC): 最初是为了个人电脑市场设计的。在早期,用户更看重软件的可用性和兼容性。CISC 的一些复杂指令确实在一定程度上简化了编译器的工作,并且避免了对昂贵的内存访问的过度依赖。虽然现在 x86 也广泛用于服务器和高性能计算,但其历史包袱决定了其指令集和兼容性问题。

4. 编译器优化和寄存器分配

从编译器角度看,拥有更多的通用寄存器(如 RISC)会使得编译器在进行寄存器分配时有更大的自由度。编译器可以把更多的局部变量和中间结果直接存放在寄存器中,减少对栈(内存)的读写,从而提高代码的执行效率。

而对于 x86 来说,虽然可见的寄存器不多,但编译器仍然可以利用各种技巧来优化。例如,利用函数调用约定(如寄存器传递参数)或者在执行过程中巧妙地利用 CPU 内部的影子寄存器和寄存器重命名技术来提高效率。

总结一下,为什么会有这样的感觉?

1. RISC 设计哲学: ARM 和 MIPS 作为典型的 RISC 架构,天生就设计了大量的通用寄存器,以支持精简的指令集和 Load/Store 架构。
2. CISC 的内部演进: x86 虽然指令集复杂,但其现代处理器内部已经将 CISC 指令分解为微指令,并利用了大量的内部寄存器和寄存器重命名技术,实现了高性能。所以,我们看到的寄存器数量少,不代表其内部的寄存器资源也少。
3. 历史与兼容性: x86 架构背负着长期的历史包袱,必须向前兼容。这意味着它的指令集不能被彻底改变,而 RISC 架构在发展过程中有更大的自由度。
4. 应用领域差异: 不同的架构在设计时,其主要目标市场和侧重点也不同,这也影响了寄存器数量和整体设计。

所以,与其说 ARM 和 MIPS 的寄存器“多”,不如说它们的设计哲学直接地、公开地暴露了大量的通用寄存器给程序员和编译器,以此作为高性能计算的基础。而 x86 则通过更复杂的内部机制,在隐藏其 CISC 本质的同时,也实现了强大的性能。两者殊途同归,都在追求更高的执行效率。

网友意见

user avatar

RISC目前有一款势头很猛的开源ISA,叫做RISCV,是体系结构界开山鼻祖,Berkley的David Patterson带领完成的。(之前所有RISC也是他...)题主提到的MIPS和ARM和它差不太多,一些基本的设计思路都一样。

到底有多少个寄存器,和编译时的寄存器分配关系很大——寄存器太少的话,就要经常把寄存器上的内容倒腾到内存里去,这一来一回用时实在是太大了;寄存器太多的话,根本用不完,白白花了材料钱和制作费。Patterson在他的《计算机体系结构:量化研究方法》这本教材里给出了一个寄存器数目的效用曲线,根据他的统计结果,大致结论是寄存器数目在16-32个之间,对于目前的编译技术而言是最优的选择。(书不在手边,有时间了会补上这个图。)

所以回过头,我们来看RISCV,五位寄存器编码,刚好32个寄存器。说一句题外话,RISCV的编码设计极其精巧,有兴趣的同学一定要写一下RISCV模拟器,体会一下Patterson大佬的设计有多精巧。

RISC ISA有一个大概的通性,就是指令的编码非常巧妙,即可以压缩编码,又能快速解码。这应该是CISC远远比不上的,所以现在的CISC芯片里实际上是包了一个RISC芯片的...

最后说一下CISC的寄存器。按照本篇回答的观点,寄存器在16-32个效用最高,再加上x86的历史遗留的寻址问题,(386寻址是上计算机组成的时候过不去的坎...)导致x86不可能支持过多的通用寄存器——一是成本和收益不对等,二是通用寄存器会挤占别的特殊寄存器(比如寻址需要用到的基地址寄存器等)。除此之外,寄存器过多,会使得指令编码难以设计,尤其是解码器难以快速解码。

比如你原来有32个通用寄存器,然后你有一套用在32个寄存器上的CISC指令。现在突然变成64个寄存器,怎么在兼容原有指令的基础之上给新加的32个寄存器编码呢?一种思路是直接在所有指令后面加上几位,用来指示各个寄存器的“新旧”,这样设计的话,本来就复杂的CISC解码器就更复杂了...另外一种思路是在原来的那套指令上就留好冗余,用于扩展,但这样浪费太大,一条指令可能也就32到64位,里面有三到四位留作冗余...

以上,欢迎讨论。对RISCV有兴趣的同学,欢迎大家关注我的GitHub LC-John,里面有我上体系实习课时写的RISCV模拟器。

// 2018.12.13更新

评论区有几个老哥说x86的寄存器XER这些前后缀是扩展。是没错,但这些是汇编扩展啊,又不是机器码扩展...汇编扩展加个字母就行了,机器码扩展可是得多用bit的呀...

旧版本里8个寄存器,每个寄存器3bit编码就行;现在加8个,一共16个,每个寄存器至少4bit编码。问题就是多出来这个bit怎么办,解码的时候解码器怎么知道这是旧的3bit编码寄存器还是新的4bit编码寄存器呢。另一种方案就是放弃原先的3bit编码,直接全部换4bit编码,行是行,但是无法向前兼容。最后一种方案,在3bit就能编码的时代,超前思考,用4bit编码,预留出来1个目前无用的bit等着未来扩展,这里的问题就是太浪费了,每个寄存器就浪费25%的存储。

上述编码问题,一直都是也应该一直都会是很难解决的问题,不管是risc还是cisc,都会遇到。risc的方案基本都是统计一下多少个够用,然后直接设计这么多,不再扩展。

以及修正一下关于RISC-V通用寄存器的说法。RISCV的ISA里规定的是32个通用寄存器,其中x0永远为0,也就是说实际可用的是31个。

为了支持主流操作系统,例如Linux,一般规定特殊使用前几个寄存器,比如x1,也就是ra,用来放返回地址,x2,也就是sp,用来指示栈顶等。最后实际可用的通用寄存器不到32个。具体请见下图。

类似的话题

  • 回答
    这个问题很有意思,也触及了计算机体系结构设计的根本理念。其实说 ARM 和 MIPS “那么多”寄存器,而 x86 “那么少”,这个说法是基于一种常见的观察,但需要更深入地理解其背后的原因。这并不是一个简单的“多”或“少”的问题,而是不同设计哲学、历史演进和目标市场所带来的差异。咱们就一层一层地剥开.............
  • 回答
    你的问题触及到了操作系统设计中一个非常核心的层面:硬件抽象层。说起来,一个操作系统之所以能够“同时兼容”x86和ARM这样的不同硬件架构,并非意味着它直接编写了一份代码就能在两者上运行。更准确地说,是Linux通过模块化设计和分层架构,使得其核心功能能够与具体的硬件指令集解耦,从而实现跨平台的适应性.............
  • 回答
    一个省份,特别是内陆省份,有没有可能兴办一所专注于半导体设计的大学,并且让学生们能够以 ARM 和 RISCV 指令集为基础,为各行各业设计芯片,从而达到促进就业和产业升级的目的?这绝对是一个值得深入探讨的议题。首先,我们得承认,这并非易事,但绝非不可能,关键在于如何系统性地布局和执行。1. 为什么.............
  • 回答
    好的,咱们来好好聊聊ARM的架构授权和IP Core授权这两种截然不同的模式,以及它们拿到后能做些什么“魔改”。争取让这篇内容更像是经验丰富的老工程师在分享,而不是冷冰冰的机器输出。 ARM架构授权 vs. IP Core授权:两个世界的区别首先,得把这两者拎清楚,它们一个是“蓝图”,一个是“标准零.............
  • 回答
    苹果的M系列芯片,也就是我们常说的ARM版Mac,之所以运行效率高,这背后是一套精心设计、深度整合的系统工程。它并非单一的技术突破,而是软硬件协同优化的结果。要理解这一点,咱们得从几个关键维度来掰开了揉碎了聊。1. 定制化SoC设计:软硬件一体化的基石首先,最核心的优势在于苹果自己设计CPU(安腾架.............
  • 回答
    这个问题挺有意思的,也触及到了一些科技界的核心讨论点。我们先别提股价什么的,就纯粹聊聊为什么苹果的 ARM 电脑(Mac)能让人觉得是“王炸”,而 Windows 生态的 ARM 设备(比如一些 Windows on ARM 笔记本)则会让人有点担忧。这里面涉及到技术、生态、策略和用户习惯等很多方面.............
  • 回答
    这个问题其实涉及到操作系统内核和硬件之间那层微妙而又至关重要的沟通桥梁。你之所以感觉到 ARM 电脑需要“专门编译”的内核,而 x86 看起来“通用”,这背后其实是两者在设计哲学、生态系统成熟度以及硬件多样性上的根本差异。咱们先说说 x86。Intel 和 AMD 是 x86 架构的巨头,它们在很长.............
  • 回答
    这个问题涉及到“开创新时代”这个概念的定义,以及市场 perception(市场认知度)和实际影响力的对比。虽然 Windows 最早推出了 ARM 阵营的笔记本电脑,但苹果的 Apple Silicon(M 系列芯片)确实在很大程度上改变了人们对 ARM 在高性能计算领域的看法,并因此被广泛认为开.............
  • 回答
    RISCV 是否会“超越”ARM 是一个复杂的问题,取决于我们如何定义“超越”,以及在哪个时间维度和应用领域进行比较。ARM 在嵌入式和移动领域拥有深厚根基和庞大生态系统,而 RISCV 作为一种开放指令集架构(ISA),凭借其灵活性、可定制性和免版税的特性,正以前所未有的速度崛起。以下将详细阐述 .............
  • 回答
    苹果在推出搭载 Apple Silicon(ARM 架构)的 MacBook Pro 时,初期并没有发布 16 英寸的版本,这确实引起了不少用户的关注和疑问。事实上,苹果在 2023 年 1 月发布了搭载 M2 Pro 和 M2 Max 芯片的 16 英寸 MacBook Pro,这打破了“没有发布.............
  • 回答
    想必你一定是个对计算机底层颇有好奇心的人。这个问题触及到了操作系统的核心功能,也是操作系统之所以存在的根本原因之一。简单来说,操作系统之所以不能完全屏蔽底层架构,是因为“屏蔽”这件事本身,在效率、灵活性以及对底层特性的利用上,都存在着固有的限制。让我们一层层剥开这个问题,看看背后到底是怎么回事。1..............
  • 回答
    说起美国阻止英伟达收购ARM这件事,那可真是科技界的一场大戏,牵动了无数人的神经。事情的起因得追溯到2020年,英伟达雄心勃勃地宣布要花400亿美元收购ARM。这笔交易一旦成功,英伟达就等于拿到了打开几乎所有智能手机、平板电脑乃至众多嵌入式设备大门的钥匙,市场影响力那叫一个空前。为什么英伟达这么想拿.............
  • 回答
    英特尔为何选择不踏足安谋(ARM)芯片的领域,这背后其实牵涉到公司发展战略、技术路线以及市场定位等一系列复杂因素,并非一个简单的“不做”就能概括。首先,我们得明白英特尔的核心竞争力在哪里。自打进入计算机时代以来,英特尔就死死抓住了X86架构这个“牛鼻子”。他们倾注了无数的资源和心血去优化和发展X86.............
  • 回答
    你问的这个问题,其实挺有意思的,也是很多人关注的。为啥 ARM 架构的芯片相比于 x86(特别是你说的 x86_64,也就是我们常说的 64 位 x86 架构,比如 Intel 的酷睿系列或者 AMD 的锐龙系列)能更省电?这事儿说起来,得从好几个层面聊聊,不是一个简单的“一点”就能概括的。我尽量把.............
  • 回答
    未来是属于ARM还是x86?这就像在问,是偏向实用主义的极简主义,还是根植传统的精雕细琢?其实,这个问题没有一个非黑即白的答案,更像是两种哲学在不同战场上的较量,而且这场较量,远未尘埃落定。故事的起点:精简指令集 (RISC) vs. 复杂指令集 (CISC)我们先得回到它们各自的“出生证明”。 .............
  • 回答
    微软拒绝为苹果 M 系列芯片 Mac 提供 Windows 11 的多角度解读微软官方明确表示,目前不建议(not supported) 将 Windows 11 安装在基于 Arm 架构的苹果 M1、M1 Pro、M1 Max(以及后续的 M2 系列等)处理器 Mac 设备上,并且不提供官方支持。.............
  • 回答
    ARM 对华为的断供,尤其是针对其麒麟芯片的后续服务,无疑是给这家中国科技巨头当头一棒,其影响之深远,值得我们细细剖析。这不仅仅是简单的软件授权问题,而是牵扯到芯片设计、生产、生态链以及未来发展方向的方方面面。核心影响:技术“卡脖子”的直接体现最直接也最致命的影响,就是华为在芯片设计和研发上的“断链.............
  • 回答
    苹果的M1 Max芯片,着实让ARM架构在高性能计算领域狠狠地刷了一波存在感。它不仅在能效比上表现惊人,性能上更是达到了许多人意想不到的高度,尤其是在图形处理和视频编码方面。那么,其他公司什么时候才能企及,尤其是像特斯拉这样的公司,有没有可能涉足这一领域?咱们就掰开了揉碎了聊聊。M1 Max的“魔力.............
  • 回答
    苹果自研ARM芯片对Windows和PC行业的冲击及竞争对手的应对之道苹果公司近年来大刀阔斧地推进其在 Mac 电脑上使用自研 ARM 架构芯片(Apple Silicon)的策略,这不仅仅是苹果自身的一次重大转型,更对整个Windows PC行业乃至全球芯片格局产生了深远的影响。从最初的 Inte.............
  • 回答
    好的,让我们深入探讨一下“指令集”这个概念,并聊聊CPU是如何消化和执行这些指令的,最后还会比较一下几个耳熟能详的指令集架构。我会尽量用一种更自然、更贴近实际的语言来阐述,避免那些生硬的AI腔调。 指令集:CPU的语言想象一下,CPU就像一个超级勤奋但又有点“笨”的工人。它什么都知道,但它只能听懂非.............

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有