![890679dd948fa37d2b04e2e34f6e5cc8.png](https://i-blog.csdnimg.cn/blog_migrate/7a99fbc2b8253beb465d95038225bd6b.jpeg)
与java相关的
- Java编译器输出的指令流,基本上是一种基于栈的指令集架构,而与之相对的另外一套常用的指令集架构是基于寄存器的指令集。早期的android,即android4.4之前使用的JVM是Dalvik VM,就是基于寄存器架构的。
- 基于栈的指令集主要的优点是可移植,寄存器由硬件直接提供,程序直接依赖这些硬件寄存器则不可避免地受到硬件的约束。
- 栈架构指令集的主要缺点是执行速度相对来说会稍慢一些。所有主流物理机的指令集都是寄存器架构。
看示例找感觉
以上是一些结论,本文的重点是讨论上文中所提的寄存器,那寄存器是什么呢?其实这些计算机的原理知识之前上学的时候都学过,很遗憾当时听的也很头大,现在都还给老师了。
进入正题,先来看下维基百科的解释:
![4113655ae996fcc42d0e57012c84e921.png](https://i-blog.csdnimg.cn/blog_migrate/ef6144358ff097a1e800f9fae00e1181.jpeg)
嗯,反正我看完是没什么感觉
再来看网上的一个例子:
“现代计算机,虽然性能很高,但是和上世纪7、8十年代的计算机比,其实结构都差不多。现在讲存储,一般讲有内存和外存,内存一般有寄存器(register),缓存(cache)和内存(memory),有些小型应用例如MCU没有cache,甚至没有memory——直接从flash/ROM到register。寄存器是CPU基础单元,CPU直接处理的内存就它了,好比医院,医生对面的椅子就是寄存器,要看病的病人(data)就坐这个椅子(register);已经挂号的(data)进入诊室(cache)排队,其他的就在医院里(memory)。医生可以操作的就是面对面的病人,其他人要看病(如急病)也需先坐上这个位置,这是最快的。诊室里的座位相对于cache,一般cache都是sram存储器,速度很快,但一般cpu不会直接访问,而是要把数据挪到register后才可直接操作,而一般的内存为DRAM,速度比SRAM慢多了,而且通过总线访问,速度就更慢了。”
再看下图:计算机的存储层次(memory hierarchy)之中,寄存器(register)最快,内存其次,最慢的是硬盘。
![0dde5ab8f394c3f5fa44d377b7cea8a1.png](https://i-blog.csdnimg.cn/blog_migrate/f4ea6f96fa2a187dcac940454c14b520.jpeg)
最后再看一个计算机的存储体系:
![8130820737185c6b1a1dee7a5d730534.png](https://i-blog.csdnimg.cn/blog_migrate/a0d7fa019a5c807127dd0d1355a3aa9e.jpeg)
图中Registers就是寄存器,怎么样,有点感觉了吗?
从头来说
假设我们做一个回向电路,把输出连回到输入,我们用OR门举例:
![7f7a8b4fa8ca26e7c814f3609986fc6e.png](https://i-blog.csdnimg.cn/blog_migrate/5e2536b61eef5ac3918cc8106f59dc3d.jpeg)
首先都输入0,那么输出将会是0
![4a025bfd3f51f42dcb8fd415589ebb53.png](https://i-blog.csdnimg.cn/blog_migrate/271c787cf1e80fa093833b579e094888.jpeg)
如果将A变成1,那么输出将会是1
![01160e19ef03a60a6aed4af72c61a26b.png](https://i-blog.csdnimg.cn/blog_migrate/f689253fc4dd5224ee77cdd6eb6bcbb4.jpeg)
一转眼的功夫输出回到B,那么B为1,OR门看到的结果是输入A、B都为1,
1 OR 1 仍然为1,所以输出不变
![aad9606b1b3731e0d57891adfe227b92.png](https://i-blog.csdnimg.cn/blog_migrate/705fdc5ad7302142789fae018e4cce1a.jpeg)
如果将A变成0,0 OR 1 输出仍然是 1
![d8fca6008c8e10cdf43e769b0e1968a0.png](https://i-blog.csdnimg.cn/blog_migrate/533fdf6d43b64b4ab03e1a265b09ff89.jpeg)
现在我们有个电路能记录1,然而却有个小问题,就是无论怎么试,都无法从1变回0(如下两图)
![f62d6520767ca9a1c8dc9c4a801ccc53.png](https://i-blog.csdnimg.cn/blog_migrate/1ef6144d6244b41168d18afddec7a0a9.jpeg)
![03e1729f25ee44e5fd740fa2b1cd2aa9.png](https://i-blog.csdnimg.cn/blog_migrate/77425fbc7effd41e902230bff1f88ae3.jpeg)
现在看一个相同电路,不过这次用AND 门
![24fa686e5fd215ebed4dc230301f8ac1.png](https://i-blog.csdnimg.cn/blog_migrate/ff41f01e5d4e7e1180dc40554bf5e68a.jpeg)
A、B均为1, 1 AND 1 为 1
![1910312418a09e5264e9997e6b2adda2.png](https://i-blog.csdnimg.cn/blog_migrate/4cf86b3d4e185433b3f350a2d26667b0.jpeg)
如果之后A设置为0,由于是AND门,所以输出为0,B为0
![9b8361e8be6c82f40a7b8be0da0c4c92.png](https://i-blog.csdnimg.cn/blog_migrate/79b1426f4afe2fc744a9d54054266a44.jpeg)
![1d2238f4e192e1db52886e8413ec5092.png](https://i-blog.csdnimg.cn/blog_migrate/09023c698b54d712d91bc90f349ba8c6.jpeg)
这个电路能记录0,和之前那个相反,无论A设置什么值,电路始终输出0
![bbbdf029ea59d5c842d54407bb151652.png](https://i-blog.csdnimg.cn/blog_migrate/b4915f803d519855752b5bac8e0a5ca5.jpeg)
![a628195e727dcb4f3b5f7a2648ce0410.png](https://i-blog.csdnimg.cn/blog_migrate/0a957ddd4afc1b8527d03f266f44cec5.jpeg)
现在我们有了能记录0和1的电路
![c2138755303e46fdd9082043458c01e2.png](https://i-blog.csdnimg.cn/blog_migrate/938459bc084af71197e7cc0dcb78494d.jpeg)
为了做出有用的存储,我们将两个电路合起来,变成:AND-OR LATCH
![542bf6caa15b286c65aacc8ed944550d.png](https://i-blog.csdnimg.cn/blog_migrate/36eb26542352184474344457d07df9e6.jpeg)
它有两个输入:
- 设置(set) 输入,将输出变成1
- 复位(reset)输入,将输出变成0
![9037c09a115ef8c01ed9860c9fe0f151.png](https://i-blog.csdnimg.cn/blog_migrate/43bd5307f4e6af82c1cefa5470618045.jpeg)
![899955d019794f889565173be132e91a.png](https://i-blog.csdnimg.cn/blog_migrate/6981b4e8e0834fb1084d0045e1776654.jpeg)
如果“设置”和“复位”都是0,电路会输出最后放入的内容,也就是说它存住了1bit的信息!这就是存储。
之所以叫“LATCH(闩锁)”,是因为它“锁定”一个特定值并保持状态。将数据放入叫“写入”,将数据输出叫“读取”。好了,现在我们终于有办法存一个bit了。
麻烦的是用两条线来输入,也就是SET和RESET,有点儿麻烦,为了更易用,我们希望只有一条输入线,将它设为0或1来存储值。还需要一根线来“启用”。“启用”时允许写入,没“启用”时锁定。这条线叫“允许写入线”。加一些额外逻辑门,可以做出以下电路 :
![38c17257038faa85c1c3725924bd6c45.png](https://i-blog.csdnimg.cn/blog_migrate/b34835cf54e836f183682b542263c2d0.jpeg)
这个电路称为“门锁”,因为门可以打开或关上。这个电路稍微有些复杂了。
![e8a79f36f15a27a749433ecedf4a0642.png](https://i-blog.csdnimg.cn/blog_migrate/dad5617a475ddb6882705216cf5850bb.jpeg)
我们不想关心单独的逻辑门,我们封装一下,把“门锁”放到盒子里(一个能存单个bit的盒子)。来看下这个新组件:
![b2e5a323156a0355f088ac78bb614736.png](https://i-blog.csdnimg.cn/blog_migrate/aeafd70e12b463c67bf2a7776805aa80.jpeg)
我们来测试一下这个新组件,一切都从0开始,如果将输入从0变成1,或从1变成0,什么也不会发生,输出仍然是0 。因为WRITE ENABLE 是关闭的(0),来防止内容变化
![f027b796834acffa8de1a69d28d42c8e.png](https://i-blog.csdnimg.cn/blog_migrate/66d0222bbbf85faa8752528d9904838a.jpeg)
![6d7a2d1145f6d9c53a2d81d8e875aab8.png](https://i-blog.csdnimg.cn/blog_migrate/81778467bf43211431a7c5f42b223f02.jpeg)
所以当WRITE ENABLE输入1,打开门后可以输入1,并将1存起来,这样输出也是1了。
![86309d96319c375c6292be9bf8b59bc9.png](https://i-blog.csdnimg.cn/blog_migrate/1c6934b9c66cd8a43364a979a458c7a6.jpeg)
我们可以关掉门(WRITE ENABLE =0),输出会保持1,此时输入随便是什么,输出都不会变(保持1)。
![00e2e688daa918096b364b5cbed61a9f.png](https://i-blog.csdnimg.cn/blog_migrate/a3f267cfe237c35c602d36c77080f8e0.jpeg)
如果再次打开门(WRITE ENABLE =1),如果输入为0,输出也将是0:
![b436fa839fca42d6ad7621c2d7c03e83.png](https://i-blog.csdnimg.cn/blog_migrate/a4d96377b208e31687464316aa4b2c23.jpeg)
最后关上门,输出会保持0
![719f04814d0c03972a0f79819e59a1b3.png](https://i-blog.csdnimg.cn/blog_migrate/c91faa5aae99b89edb4eb1e95194b0d9.jpeg)
当然存1bit没什么大用,但我们没限制只能用一个组件,如果我们并排放8个,可以存8位,比如一个8bit数字。一组这样的组件叫寄存器。寄存器能存多少个Bit,叫“位宽”。早期电脑用8位寄存器,然后是16位,32位,如今很多计算机都有64位宽的寄存器了。
CPU中寄存器又分为指令寄存器(IR)、程序计数器(PC)、地址寄存器(AR)、数据寄存器(DR)、累加寄存器(AC)、程序状态字寄存器(PSW),这里就不深入讨论了。
参考 :
http://www.ruanyifeng.com/blog/2013/10/register.html
https://www.youtube.com/watch?v=fpnE6UAfbtU
https://www.youtube.com/watch?v=cNN_tTXABUA
https://www.youtube.com/watch?time_continue=132&v=TBADs7knuWM&feature=emb_logo