QuincySx
簡書作者
2018-11-07 13:49
我們已經(jīng)看了基本邏輯電路,運算電路,內(nèi)存的概述。今天我們用著幾個東西來組裝 CPU。
CPU 簡易結(jié)構(gòu)圖
我們看到這張圖,我們的簡易 CPU 有運算邏輯部件、寄存器部件和控制部件(圖中的指令解析)
CPU 工作流程
CPU 的運行有讀取指令,解析指令,運行三個階段。
我們模擬一下使用計算機(jī)來計算一個 1+1,看看計算機(jī)是如何工作的!
假設(shè)我們已經(jīng)寫好了我們的程序,并放到了內(nèi)存中,如下圖所示:
假如我們 指令地址寄存器 的地址為 00000000
- CPU 通電首先讀取指令地址寄存器的地址(可以理解成系統(tǒng)第一條指令),然后讀取相應(yīng)的內(nèi)存數(shù)據(jù)。
- 得到 00010001 ,然后拆分命令是 0001 數(shù)據(jù)是 0001(假設(shè) 0001 是加載到 寄存器1 中)
- 執(zhí)行命令把 0001 存儲到 寄存器1 中,把下一個地址 00000001 存到 指令地址寄存器 中
- 然后開始第二輪 讀取內(nèi)存地址 00000001 的數(shù)據(jù)
- 得到 00110001 ,然后拆分命令是 0011 數(shù)據(jù)是 0001(假設(shè) 0011 是加載到 寄存器2 中)
- 執(zhí)行命令把 0001 存儲到 寄存器2 中,把下一個地址 00000011 存到 指令地址寄存器 中
- 然后開始第三輪 讀取內(nèi)存地址 00000011 的數(shù)據(jù)
- 得到 10000111 ,然后拆分命令是 1000 數(shù)據(jù)是 0111(假設(shè) 1000 是對兩個寄存器進(jìn)行加法運算)
- 執(zhí)行命令把 寄存器1 寄存器2 的值進(jìn)行相加。
OK! 我們看了上邊流程,我們還有幾個問題?
- 我們還隱約的發(fā)現(xiàn)還缺個東西沒有說也就是「指令表」,每款 CPU 都需要一定的指令表,寫好程序來讓計算機(jī)去運算。
- 晶振的頻率來推進(jìn) CPU 的運算速度,如果 CPU 早就計算完了晶振還不繼續(xù)往下運算,就拖慢了整體運行速度。晶振這個詞我們可能聽著比較生疏,我們平常買 CPU 上面寫的多少多少 HZ 就是指的這個。( 1GHZ = 十億赫茲 現(xiàn)代的 CPU 運算速度都比較快)
小結(jié)
看完了上面,我就理解了為什么 C 語言之類程序不同的平臺需要進(jìn)行移植,因為不同的 CPU 指令集不一樣。然而像 Java 這些虛擬機(jī)語言,是在虛擬機(jī)上提供了通用的指令表,虛擬機(jī)還是需要針對不同的 CPU 平臺進(jìn)行單獨編碼!
你們還看了什么,歡迎留言一起討論。