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个。具体请见下图。
这次舆论的重点在于警察到底是多久赶到的。
没拜码头,收保护费,打砸门面这种原因我们都知道,也不怕;
但是公权力私用或者黑白勾结这种事,就会让人非常害怕;
如果西安公权力真的黑白勾结,还睁眼说瞎话,那就需要处理整顿了。
我朝的治安也不是一直这么好的,人民也不是软弱无比的,60年代西安打的也很凶的。难不成西安各公司以后都要雇佣保安公司保护经营?
这次出警距离1公里,走路10分钟都到了,所以就坐等这次真实的出警时间是多少了。