程序是如何被計算機所執行的?

一、計算機程序
要明白程序是如何被計算機所執行的,首先要明白什麼是程序?先看看一下幾個問題:
這裏寫圖片描述

  • 程序的概念?
    程序(program)是爲實現特定目標或解決特定問題而用計算機語言編寫的命令序列的集合。爲實現預期目的而進行操作的一系列語句和指令。一般分爲系統程序和應用程序兩大類。

  • 程序由什麼組成?
    程序由數據和指令組成。

  • 什麼是機器語言?
    機器語言是直接用二進制代碼指令表達的計算機語言,指令是用0和1組成的一串代碼,它們有一定的位數,並分成若干段,各段的編碼表示不同的含義。

  • 運行中的程序存儲在什麼位置?
    程序加載時首先到寄存器中,寄存器會將程序複製到內存中從而進行存儲,,當程序運行時,CPU會把主從的程序的數據和指令調用到寄存器特定的位置,從而執行。

  • 什麼是內存地址?
    內存地址指系統 RAM 中的特定位置,通常以十六進制的數字表示,如同計算機內部特定位置的編號。

  • 程序的解釋和運行的計算機部件叫什麼?
    CPU的控制器是計算機的指揮中心,負責決定執行程序的順序,給出執行指令時機器各部件需要的操作控制命令.,程序的解釋和運行也是由CPU的控制器來完成。

    程序=指令+數據
    

二、程序的執行過程
當我們輸入以下程序,編譯運行,計算機從屏幕輸出hello, world!。整個過程計算機都怎麼運作的呢?

#include <stdio.h>

void main()
{
printf("hellow,world!\n");
}

計算機內部存儲的是0和1,計算機通過位信息以及上下文來解讀這些0、1信息的。
hellow,world是由0和1組成的序列,將這些程序代碼轉換成相應的文本字符,每8位表示一個字節,用來存儲一個字符。

hellow,world的ASCII碼錶示

因爲我們輸入的hellow,world是人可以閱讀和編寫的,但是機器並不能直接識別他們,我們需要把這些文字翻譯成機器可執行的二進制文件,這一部分的工作是由編譯系統完成的。編譯系統由預處理器、編譯器、彙編器、連接器四部分組成。以hello, world程序爲例,各部分共同完成將源文件編譯成二進制可執行文件。各個部分完成的具體工作如下:
這裏寫圖片描述

  • 預處理器:根據以#開頭的命令,將包含的頭文件加載進入源程序源程序。預處理器讀取系統頭文件stdio.h中的內容,代替此行內容。源程序經過預處理後,得到另一個c程序,此程序通常以.i爲後綴保存。

  • 編譯器:將預處理後的.i文件轉換成彙編程序。編譯器將不同的高級語言(如c語言,C++語言)轉換成嚴格一致的彙編語言格式進行輸出。彙編語言以標準的文本格式確切的描述每機器語言指令。編譯器得到的文件通常以.s爲後綴保存。

  • 彙編器:將彙編語言(.s文件)翻譯成機器語言指令,並將這些指令打包成一種可定位目標程序格式。彙編後得到的文件即爲二進制文件,通常以.o爲後綴。

  • 鏈接器:hello, world程序中調用過printf函數,它是一個c標準庫裏的函數。Printf函數存放在一個名爲printf.o的單獨預編譯的文件中。而這個文件必須以適當的方式併入到我們的程序中,這個工作由鏈接器完成。將外部的.o文件併入後,得到一個完整的hello, world可執行文件。可執行文件加載到存儲器後,由系統複製執行。

    程序加載進入CPU的過程
    這裏寫圖片描述

  • Shell:命令行解釋器,當用戶輸入一行命令後,shell先判斷它是不是一個shell內置命令,如果不是,shell會假定用戶輸入爲一個可執行文件的名字,從而去加載並執行該文件。因此,當我們通過編譯系統將源文件編譯成可執行二進制文件後,在shell中輸入我們得到的可執行二進制文件名,shell將其從磁盤中加載到主存當中,通過CPU進行解釋運行,最終通過終端設備(屏幕)將他顯示出來,程序運行結束。

  • 主存儲器:簡稱主存,是處理器執行程序時用於臨時存放程序及其數據。主存由一組動態隨機存儲器芯片組成。

  • 運算器:計算機中執行各種算術和邏輯運算操作的部件。

  • 控制器: 計算機中執行各種算術和邏輯運算操作的部件。

三、CPU的組成
CPU是由四大部分所構成的:寄存器、控制器、運算器、時鐘。

  • 寄存器
    • CPU內部的內存,程序加載進CPU內部的寄存器中從而被用來解釋和運行。
  • 控制器
    • 計算機的指揮中心,負責決定執行程序的順序,給出執行指令時機器各部件需要的操作控制命令。
  • 運算器
    • 計算機中執行各種算術和邏輯運算操作的部件。
  • 時鐘
    • 它是處理操作的最基本的單位,影響着指令的取出和執行時間。

CPU中的主要寄存器
這裏寫圖片描述

累加寄存器(AC) :主要進行加法運算。
標誌寄存器(PSW) :記錄狀態,做邏輯運算。
程序計數器(PC) :是用於存放下一條指令所在單元的地址的地方。
基質寄存器(BX) :儲存當前數據內存開始的位置。
變址寄存器 :儲存基質寄存器的相對位置。
通用寄存器(GPRs) :支持有所的用法。
指令寄存器(IR) :CPU專用,儲存指令。
堆棧寄存器(SP) :記錄堆棧的起始位置。

  寄存器寄存器是中央處理器內主要組成結構成分,它是CPU當中有限存貯容量的高速存貯部件,它在工作時能將計算機指令數據進行暫時的存儲。

  內存地址=基質+變址

處理器讀取並解釋存儲在存儲器中的指令
這裏寫圖片描述

處理器的操作主要是圍繞程序計數器、算術/邏輯運算單元、主存來進行運作的。處理器首先從PC所指向的主存存儲單元讀取指令,解釋指令中的位,執行該指令指示的簡單操作,然後更新PC寄存器,使其指向下一條要執行的指令。CPU會執行的操作有:

  • 加載:把一個字節或一個字從主存複製到寄存器,覆蓋掉寄存器中原來的值。

  • 存儲:把一個字節或一個從寄存器複製到主存,並覆蓋主存中原來的值。

  • 操作:把兩個寄存器的內容複製到ALU,ALU對兩個字做算術運算後存回其中的一個寄存器,該寄存器中原來的值會被覆蓋。

  • 跳轉:從cpu執行的指令抽取一個字的內容存入PC,覆蓋掉原來的值,從而改變下一條要執行的指令,達到跳轉的目的。

這裏寫圖片描述

hellow,world程序首先被加載,從磁盤中複製到寄存器中,寄存器將hwllow,world程序複製到主存中進行存儲。程序運行過程中,CPU執行hellow,world機器指令,指令的結果是將”hellow,world”字符由內存複製到寄存器,寄存器再將結果複製到顯示設備上顯示出來。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章