前言:
挺久之前寫過一篇文章《 》,有網友回覆要求講一講CPU是如何工作的。
老實說,雖然在很多年前學過數字電路,也學過一點彙編語言,可是早已經交還給老師了,更不要說當年就沒怎麼學好。
一直拖了很久,看過一些資料之後,才再次提起這一事,本人試圖用最通俗的語句來描述一下什麼是指令集和CPU的工作原理。說得不對,也請大家包涵指正。
要說清楚CPU如何工作,我們先得了解一下程序是如何運行的,因為CPU是由程序驅動並完成程序的指令,從而得到運算結果的。
在最早的計算機上,編程人員將計算要求轉換成1010這樣的二進制程序,再將1010在紙帶上用孔來表示,打孔的紙帶輸入到計算機之後,計算機就能計算了。
這紙帶上的二進制程序就是機器語言,這些孔就是告訴計算機,該讀數據、進行加減乘除、或者“與或”邏輯運算,而紙帶上直接的輸入是“孔”和“非孔”,也就“斷電”和“通電”,反應在晶體管上的狀態就是“閉”與“開”,如果晶體管是一個燈泡,那它表現出來就是一閃一滅。
然而,機器語言太過於專業難懂,科學家們用了一種高級的語言來代替它,這就是彙編語言。彙編語言更接近人類的語言,用編譯器可以將彙編語言轉為機器可以識別的機器語言。
這編譯器就相當於一個翻譯機,它根據設定好的規則,將彙編語言一條條轉化為二進制語言。
這個時候,問題就來了!編譯器所用的規則,是由設計計算機(現在歸結為CPU)的人規定的,那麼用匯編語言的工程師,就必須按照他所給的規則來編,要不然,編譯器轉化出來的二進制語言就是亂七八糟的,在電腦上反應出來的就是藍屏了,因為CPU根本不管你輸入的101010是對是錯,它就按給的來執行,這時出來的結果就不知道是什麼東西了。
好了,設計CPU的人給出的編寫規則就可以說是指令,這一系列的規則就是指令集(合)。
而設計CPU的廠商有多家,這樣就產生了不同的指令集,比如intel陣營的8086指令集,ARM陣營的RISC指令集。不同陣營,其對應的彙編語言也是不一樣的。
雖然彙編語言比較接近人類語言,但是畢竟還是過於難懂,這也是為什麼古代有那麼多秘籍,能練成絕世武功的人少之又少,那是因為,並不一定所有得到秘籍的人都能看得懂。
為了解決跨平臺運行程序的問題,科學家又發展出了各種各樣的高級語言,比如C、C++、VB、PHP、JAVA等等,用這些語言編寫的程序要麼在相應系統正確的運行環境中直接運行,要麼經過編譯,打包出對應的程序就可以了。比如用JAVA或PHP寫了一個APP,通過打包工具,可以直接打包成安卓APP,也可以打包成蘋果APP,這就解決了彙編語言不兼容的問題。
用下面的圖表示一下這三類語言的區別與關係:
用戶的需求就如探子得到的情報,大帥必須對敵人來犯進行處理。
這時大帥就寫了一個“射箭”的程序。
旗手將“射箭”轉化成了旗語的彙編語言。
最後箭隊的隊長就將旗語轉化成了“拉弓”、“放箭”這樣的二進制機器語言。
箭兵得到命令,按指令進行操作。
好了,這個箭隊就是最終執行任務的CPU。
更專業些的描述是下面的圖形
那麼CPU的工作原理,就是將輸入的信息轉化成10101數字信號,這些信號通過CPU模塊轉換成高電平與低電平,(《 》),這些模擬電信號按指定通過不同的模塊,CPU模塊上的微小晶體管就會產生“閉”與“開”的動作,最終得到計算結果。
可進行讀、寫、轉換等操作的模塊是下圖中的control(控制器),存放數據的是cache、DRAM,真正進行計算的是ALU單元。
相信看到這裡的朋友應該大致對CPU和指令集有些概念了,現在再去百度,應該很容易理解那些專業的內容了。
閱讀更多 熊孩子愛科技 的文章