1. 程式人生 > >程式的執行機制——CPU、記憶體、指令的那些事

程式的執行機制——CPU、記憶體、指令的那些事

  • 序言
    說起計算機大家並不陌生,在計算機上又執行著各種程式,如QQ、微信等。這些程式有可以為我們做很多事情,能聊天、能玩遊戲等等。那麼這些看似複雜的程式在計算機中到底是怎麼執行起來的呢?其實非常簡單,我們不妨一起探討一下。
    作為程式設計師我們必須理解CPU是如何執行的,特別是要弄清楚負責儲存指令和資料的暫存器的機制。瞭解了暫存器,也就自然而然的理解了程式的執行機制。
  • CPU的構成
    在程式執行流程中,CPU所負責的就是解析和運算最終轉換成機器語言的程式內容。CPU從功能上來看由暫存器、控制器、運算器、時鐘構成。
這裡寫圖片描述 這裡寫圖片描述
CPU的構成 CPU是暫存器的集合體

暫存器:用來暫存指令、資料等處理物件。
控制器:負責把記憶體上的指令、資料等讀入暫存器、並根據指令的執行結果來控制計算機。
運算器:負責運算從記憶體讀入暫存器的資料。
時鐘:負責發出CPU開始計時的時鐘訊號

  • 記憶體的作用
    記憶體指的就是計算機的主儲存器,其主要負責儲存指令和資料。CPU通過記憶體地址值來讀取或寫入指令和資料。注意:記憶體中的指令和資料會隨著計算機的關機日自動清除。
    在理解了CPU和記憶體後,大家對程式的執行機制的理解是不是也加深了一些?程式啟動後,根據時鐘訊號,控制器會從記憶體中讀取指令和資料。通過對這些指令加以解析和執行,運算器就會對資料進行運算,控制器根據運算結果控制計算機。
  • 決定程式流程的程式計數器
    下面我們通過將123和456兩個數相加,並將結果輸出到顯示器的例項,說一下程式計數器是如何工作的。
    當用戶發出啟動程式的指示後,作業系統會把硬碟中儲存的程式複製到記憶體中。如下圖是程式啟動時記憶體內容的模型。
    這裡寫圖片描述

    作業系統把程式複製到記憶體後,會將程式計數器設定為0100(假設記憶體地址0100是程式執行的開始地址),然後程式便開始執行。CPU每執行一個指令,程式計數器的值就會自動加1。所以,程式計數器決定著程式的流程。
  • 指令
    從功能方面來看,機器語言指令可分為資料傳送指令、算數指令、跳轉指令、call/return指令。

    資料傳送指令:暫存器和記憶體、記憶體和記憶體、暫存器和外圍裝置之間的資料讀寫操作
    運算指令:用累加暫存器執行算術運算、邏輯運算、比較運算和位移運算
    跳轉指令:實現條件分支、迴圈、強制跳轉等
    call/return指令:函式的呼叫/返回呼叫前的地址

  • 函式呼叫
    call指令和return指令是如何實現函式呼叫的呢?
    其實call指令在將函式的入口地址設定到程式計數器之前,call指令會把呼叫函式後要執行的指令地址儲存在名為棧的主存內。函式處理完畢後,再通過函式的出口來執行return命令。return命令的功能就是把儲存的棧中的地址設定到程式計數器中。如下面的圖示,MyFunc函式被呼叫之前,0154地址儲存在棧中。MyFunc函式的處理完畢後,棧中的0154地址就會被讀取出來,然後再被設定到程式計數器中。

這裡寫圖片描述 這裡寫圖片描述
程式呼叫函式示例 函式呼叫中程式計數器和棧的職能