百科问答小站 logo
百科问答小站 font logo



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

  

user avatar   zhang-huang-zhao 网友的相关建议: 
      

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个。具体请见下图。


user avatar   Ultraman-Tiga 网友的相关建议: 
      

这次舆论的重点在于警察到底是多久赶到的。

没拜码头,收保护费,打砸门面这种原因我们都知道,也不怕;

但是公权力私用或者黑白勾结这种事,就会让人非常害怕;

如果西安公权力真的黑白勾结,还睁眼说瞎话,那就需要处理整顿了。

我朝的治安也不是一直这么好的,人民也不是软弱无比的,60年代西安打的也很凶的。难不成西安各公司以后都要雇佣保安公司保护经营?

这次出警距离1公里,走路10分钟都到了,所以就坐等这次真实的出警时间是多少了。





  

相关话题

  该怎么劝朋友转码? 
  同样是 ARM,为什么 Mac 用就是王炸,Win 用就担心明天的股价? 
  ARM64 有能力完全取代 AMD64 吗? 
  如何评价英特尔虎湖(Tiger Lake)十一代酷睿核心显卡运行战地5平均30帧? 
  为何国产手机CPU这么强而电脑CPU那么差? 
  一行代码可以做什么? 
  如何通俗易懂地说明 i7 真不一定比 i5 好? 
  为什么不把路由器集成在计算机里? 
  Linux 是否比 Windows 省电? 
  英特尔挤了这么多年牙膏,背后真的没有过硬的技术储备吗? 

前一个讨论
英特尔敦促主板厂商,禁用 12 代酷睿 AVX 512 指令集,如何解读这一举措?
下一个讨论
intel和amd哪一代还可以支持win7?





© 2025-04-03 - tinynew.org. All Rights Reserved.
© 2025-04-03 - tinynew.org. 保留所有权利