【注】本文首發微信公眾號:最高許可權位元
大家都知道,作業系統、計算機組成原理、資料結構與演算法、計算機網路、被稱作計算機四大基礎課。不但是計算機專業考研的四門專業課,而且是每一個程式設計師必須掌握的內容。其實大家能夠看到,為什麼絕大多數企業都不想招培訓班出來的“程式設計師”,其中有一個非常重要的原因就是他們的計算機基礎知識過於薄弱,也就是上面說到的四門課程。 最近發現,研究計算機組成原理其實是非常有意思的一件事情。為什麼這樣說呢?不知道你有沒有想過,當你寫完一個程式之後(以c語言程式為例子),原始碼通過編譯器編譯成組合語言,然後組合語言再通過解釋,成為機器語言,經過黑盒子(你不知道的方式),得到你想要的結果。你只是看到了程式輸出的最終結果,卻不知道為什麼能夠得到你想要的最終結果,對吧。 那麼,你有沒有想過,一個程式究竟是如何跑起來的呢,究竟在計算機的最底層經過了怎樣的執行過程呢?這就是我的這篇博文想要展示給大家的。
概述
我們知道,計算機是由軟體和硬體共同組成的。沒有硬體,軟體就沒有用武之地;沒有軟體,硬體就只能是一堆廢鐵。 而軟體又分為兩類:
- 系統軟體
- 應用軟體
其實這是從巨集觀上的封裝和層次劃分,對相關的內容沒有了解的開發者理解起來可能會有些難度,不過這不是我們今天的重點。 我嘗試著從程式設計師的視角來給大家分析一下,一個程式的完整執行過程。
計算機如何才能執行程式?
還是接著從序言的部分說起。 我們所用的語言,不論是C語言、Java還是其他的什麼語言,都是屬於高階語言。而高階語言編寫的程式,計算機肯定是不能直接執行的,因為計算機只能識別0和1。為了能夠讓計算機執行高階語言編寫的程式,需要經過下面的這些步驟:


- 只有機器語言計算機才能夠識別並執行
- 相同的組合語言程式在不同指令集平臺下生成的機器語言是不同的
- 機器語言就是微指令
- 微指令系統的作用就是指揮計算機的各部分工作
好了,只有知道了這些內容,我們才能進行後續的東西。
現代計算機的結構
剛才說了,微指令系統是指導計算機硬體執行的。那麼,這些計算機硬體都包括什麼呢? 眾所周知,現代計算機是在馮若依曼體系計算機的基礎之上發展起來的,在開始我們的講述之前,瞭解下馮若依曼計算機的結構還是很有必要的。

- 運算器:進行算數邏輯運算
- 儲存器:存放資料以及程式
- 控制器:控制程式、資料、運算處理結果
- 輸入裝置:將指令轉換成機器可識別的機器語言
- 輸出裝置:將指令轉換成人可以識別的內容
可以看到,馮諾依曼結構的計算機是以運算器為核心的,而現在的計算機則是以儲存器為核心的。這其中的原因暫不表述,有興趣的可以查閱相關資料。 雖然現代計算機是以儲存器為中心的,但是還是基於馮若依曼體系的。馮若依曼體系計算機的特點現代計算機都有。 現代計算機的結構是這樣的:(純手畫,略醜,見諒)


計算機的工作過程
我們上面看到了現代計算機的體系結構:儲存器、算數邏輯(運算器)、控制單元(控制器),當然還有IO裝置。 現在,我們知道了微指令(機器語言)就是在這些部件之中游走,完成程式的操作,但是具體是如何遊走的,或者說微指令系統是如何執行機器語言的,我們仍然不知道。 就我們目前掌握的內容來看,只能瞭解到這個層次了,若要是想再進一步,我們對更底層的東西還是要再進行分解。
儲存器
下圖是儲存器的基本結構:

運算器

控制器
控制器的作用:解釋指令,保證指令有序執行。 控制器的結構如下:

主機完成指令的過程
好了,終於走到了最後一部分。 在前面的幾個過程中,你瞭解到了現代計算機的每一個部件的組成以及具體功能,在知道了這些內容後,下面的東西理解起來是會很簡單的。在最後的這一部分,我會舉出兩個具體的例子,讓你知道程式程式碼最終形成的機器語言究竟是如何執行的。
取數指令
描述:簡單的講,就是把一個數取出,存到ACC(一般加法操作時,ACC就是作為被加數)中的具體過程。先來看下面的這張圖,最好結合著我下面的介紹看。

- 1.程式計數器+1,開始指向下一個地址。
- 2.儲存器地址暫存器中存放著下一個地址,根據這個地址(地址暫存器的名字來歷),指向儲存體中的指令資料。
- 3.從儲存體得到資料,存入資料暫存器(資料暫存器的名字就是這麼來的)
- 4.得到指令,格式為指令碼+操作碼(當前操作就是:取數操作-地址),指令寫入IR指令暫存器中。
- 5.指令暫存器詢問CU控制單元當前是何種操作,得到取指令操作的回覆
- 6.指令中的資料地址存入地址暫存器
- 7.通過地址暫存器得到儲存體中當前地址儲存的資料
- 8.得到的資料存入資料暫存器中
- 9.資料暫存器中的資料寫入ACC,完成整個操作
- 10.PC程式計數器+1,開始新一輪的判斷。
有了這個,相信你已經對整個操作過程有了很深刻的理解,下面我們再來一個例子,加深理解。
ax^2+bx+c程式執行過程(程式程式碼已經成為了機器語言)
- 1.程式由IO裝置送至計算機
- 2.PC+1,得到程式首地址
- 3.程式開始啟動
- 4.取數指令:PC-->MAR-->儲存體-->MDR-->IR(指令暫存器)
- 5.分析指令:取出指令暫存器中的操作碼,送入CU控制單元進行分析,得到指令意義
- 6.執行指令:取出IR中的地址碼-->MAR--->儲存體-->MDR-->ACC
- 7.PC+1=PC,得到新的地址
- 8.取數指令:PC-->MAR-->儲存體-->MDR-->IR(指令暫存器)
- 9.分析指令:取出指令暫存器中的操作碼,送入CU控制單元進行分析,得到指令意義
- 10.執行指令:取出IR中的地址碼-->MAR--->儲存體-->MDR-->X
- ……
- 最終出現結果
- 程式執行完畢
好了,進行到這裡,我們的漫談計算機組成原理的第一篇文章就算是結束了。如果大家發現我的部落格存在問題,或者大家有什麼疑問的地方,歡迎私信我,歡迎志同道合的夥伴聯絡我!
郵箱:roobtyan@outlook.com
微信公眾號:最高許可權位元流
