漫談計算機組成原理(一)之程式執行的過程

Roobtyan發表於2018-05-17

【注】本文首發微信公眾號:最高許可權位元

大家都知道,作業系統、計算機組成原理、資料結構與演算法、計算機網路、被稱作計算機四大基礎課。不但是計算機專業考研的四門專業課,而且是每一個程式設計師必須掌握的內容。其實大家能夠看到,為什麼絕大多數企業都不想招培訓班出來的“程式設計師”,其中有一個非常重要的原因就是他們的計算機基礎知識過於薄弱,也就是上面說到的四門課程。 最近發現,研究計算機組成原理其實是非常有意思的一件事情。為什麼這樣說呢?不知道你有沒有想過,當你寫完一個程式之後(以c語言程式為例子),原始碼通過編譯器編譯成組合語言,然後組合語言再通過解釋,成為機器語言,經過黑盒子(你不知道的方式),得到你想要的結果。你只是看到了程式輸出的最終結果,卻不知道為什麼能夠得到你想要的最終結果,對吧。 那麼,你有沒有想過,一個程式究竟是如何跑起來的呢,究竟在計算機的最底層經過了怎樣的執行過程呢?這就是我的這篇博文想要展示給大家的。

概述

我們知道,計算機是由軟體和硬體共同組成的。沒有硬體,軟體就沒有用武之地;沒有軟體,硬體就只能是一堆廢鐵。 而軟體又分為兩類:

  • 系統軟體
  • 應用軟體

其實這是從巨集觀上的封裝和層次劃分,對相關的內容沒有了解的開發者理解起來可能會有些難度,不過這不是我們今天的重點。 我嘗試著從程式設計師的視角來給大家分析一下,一個程式的完整執行過程。

計算機如何才能執行程式?

還是接著從序言的部分說起。 我們所用的語言,不論是C語言、Java還是其他的什麼語言,都是屬於高階語言。而高階語言編寫的程式,計算機肯定是不能直接執行的,因為計算機只能識別0和1。為了能夠讓計算機執行高階語言編寫的程式,需要經過下面的這些步驟:

這裡寫圖片描述
首先,高階語言程式通過編譯器編譯,成為組合語言;然後這個彙編程式再經過一個不知道的步驟成為機器語言。 究竟是經過了什麼樣的過程,組合語言才會變成機器語言呢?這需要一個東西介入。 就是我們剛才提到的系統軟體,泛泛的講就是作業系統。 作業系統是負責和底層的硬體進行互動的,也就是說,這個把組合語言變成機器語言的東西,只能是作業系統。如果你下過jdk,如果你夠細心,你會發現有arm、i586、x64等型別。這是為什麼呢?就是因為計算機硬體或者說晶片是不基於不同的指令集的,那麼相同的彙編程式,經過作業系統,轉換成對應的機器語言肯定也是不同的。順便說一下,我們今天的主題是機器語言在底層硬體的流轉。
這裡寫圖片描述
經過這裡,我們成功得到了機器語言。當作業系統將彙編程式解釋成對應的指令集的機器語言之後,就要看硬體部分究竟是如何處理機器語言的了。 我們前面說的指令系統,就是解釋執行機器語言的,這樣看來,機器語言實際上就是微指令。 總的來講,指令系統也好,微指令系統也好,其功能就是來控制硬體執行的。所以,在指令系統得到了機器語言(微指令)後,對硬體進行的相關操作,才是能使我們程式執行的根本原因。 到這裡,我們知道了

  • 只有機器語言計算機才能夠識別並執行
  • 相同的組合語言程式在不同指令集平臺下生成的機器語言是不同的
  • 機器語言就是微指令
  • 微指令系統的作用就是指揮計算機的各部分工作

好了,只有知道了這些內容,我們才能進行後續的東西。

現代計算機的結構

剛才說了,微指令系統是指導計算機硬體執行的。那麼,這些計算機硬體都包括什麼呢? 眾所周知,現代計算機是在馮若依曼體系計算機的基礎之上發展起來的,在開始我們的講述之前,瞭解下馮若依曼計算機的結構還是很有必要的。

這裡寫圖片描述

  • 運算器:進行算數邏輯運算
  • 儲存器:存放資料以及程式
  • 控制器:控制程式、資料、運算處理結果
  • 輸入裝置:將指令轉換成機器可識別的機器語言
  • 輸出裝置:將指令轉換成人可以識別的內容

可以看到,馮諾依曼結構的計算機是以運算器為核心的,而現在的計算機則是以儲存器為核心的。這其中的原因暫不表述,有興趣的可以查閱相關資料。 雖然現代計算機是以儲存器為中心的,但是還是基於馮若依曼體系的。馮若依曼體系計算機的特點現代計算機都有。 現代計算機的結構是這樣的:(純手畫,略醜,見諒)

這裡寫圖片描述
主機中由主儲存器和CPU組成,再有就是外部的IO裝置,現代的計算機結構雖然和馮諾依曼結構有些不太一樣,但是仍是基於馮諾依曼結構的。 注意:這裡面有一個非常重要的內容,那就是指令的格式。 剛才說了,指令其實就是機器語言,那麼,一條機器語言的格式究竟是什麼樣子呢?是這樣的:機器語言或者說指令,分為兩個部分,一部分是操作碼,另外一部分是資料地址。 比如說,我現在要做的操作是將0000111011地址的資料存到儲存器之中,那麼操作就是這樣的:
這裡寫圖片描述
前面的是指令碼,後面的是地址碼。我們發現,在這種情況下,地址碼和指令碼都是二進位制的資料,處於同樣的地位,這也是馮若依曼體系計算機的一大特點。 好了,瞭解了以上內容,我們馬上就能看到一個程式究竟是如何跑起來的了。

計算機的工作過程

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

儲存器

下圖是儲存器的基本結構:

這裡寫圖片描述
看了這張圖你可能會-有很多的疑問,比如說儲存體是個什麼東西?其實,再細分的東西,這篇部落格就暫不作介紹了,因為並不影響我們的閱讀,如果你感興趣的話,歡迎持續關注我的部落格,我會把漫談計算機組成原理作為一個系列的文章,來仔細為大家講述計算機組成的奧祕。 對於儲存體,你只需要知道這就是個儲存的部件即可,可以存放資料。 MAR:儲存器地址暫存器;MDR:儲存器資料暫存器。 所謂的暫存器,就是臨時存放的意思。所以,上面兩個就是臨時存放地址和資料的地方。至於為什麼這麼叫,再最後一部分你會非常明白的,這裡我就先不做介紹,你只需要知道有這麼個東西就行了。

運算器

這裡寫圖片描述
這是運算器的結構圖。 我們知道,運算器就是做邏輯運算的,比如說加減乘除等運算,簡而言之就是做資料處理的。 圖中顯示的什麼累加暫存器、乘商暫存器等這些東西,不必讓這些名詞困擾你。我來簡單說一下,累加暫存器就是差與和存放的地方。那麼你就會問,為啥有差、和卻叫累加暫存器呢?那是因為在計算機中是沒有減法的,如果有,那就是加上一個負數而已,只能是這樣。至於乘商暫存器肯定就是放乘積和商的地方了。 至於X,這貨叫運算元暫存器。比如說X+3。X是放到ACC中的,這個後面的加數就是放在X這個暫存器中,等待著操作的進行。

控制器

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

這裡寫圖片描述
剛才我們講,再馮諾依曼體系中,指令和資料是以同等的地位存在於系統之中的,也就都是二進位制。你也看到了一條指令的格式。地址碼指向的是IO裝置的地址,而控制碼呢?計算機是如何知道這條指令要執行的是加法操作還是乘法操作呢?實際上,操作碼就是存放在CU控制單元之中的。指令暫存器會對CU控制單元發出請求,得到的就是具體的操作。 PC的作用又是什麼呢?它的作用實際上是執行完當前指令後,自動加一。也就指向了下一個地址,那裡又存放著一條指令,然後繼續這個過程。

主機完成指令的過程

好了,終於走到了最後一部分。 在前面的幾個過程中,你瞭解到了現代計算機的每一個部件的組成以及具體功能,在知道了這些內容後,下面的東西理解起來是會很簡單的。在最後的這一部分,我會舉出兩個具體的例子,讓你知道程式程式碼最終形成的機器語言究竟是如何執行的。

取數指令

描述:簡單的講,就是把一個數取出,存到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

微信公眾號:最高許可權位元流

漫談計算機組成原理(一)之程式執行的過程

相關文章