《程式是怎樣跑起來的》讀書筆記1——對程式設計師來說CPU是什麼

Cuzzz發表於2023-04-02

一丶什麼是程式

程式是指令和陣列的組合體,如:print("你好世界"),其中print是指令,你好世界是資料。

CPU能直接識別和執行的只有機器語言,使用C,java這種高階語言編寫的程式需要編譯轉換後才可以執行。

二丶CPU的內部結構

CPU即中央處理器,相當於計算機的大腦,內部由許多電晶體構成,負責解釋和執行最終轉換成的機器語言程式。

image-20230402101750515

  • 暫存器:暫存指令和資料等處理物件。
  • 控制器:負責把記憶體上指令,資料等讀入暫存器,並根據指令的執行結果來控制整個計算機。
  • 運算器:負責運算從記憶體讀入到暫存器的資料
  • 時鐘:負責發起cpu開始計時的時鐘訊號,時鐘訊號頻率單位為赫茲,頻率越高CPU運算速度越快。

程式啟動後,根據時鐘訊號,控制器會從記憶體中讀取指令和資料,透過對這些指令加以解釋和執行,運算器會對資料進行運算,控制器根據計算結果來控制計算機(控制:除了資料運算之外的處理,比如記憶體和磁碟等輸入輸出裝置,顯示器,印表機等的輸出)

三丶暫存器

1.為什麼需要暫存器

CPU 的運算速度遠高於記憶體的讀寫速度,為了避免被拖慢,CPU 都自帶一級快取和二級快取,但是資料在快取中地址並不固定,cpu每次讀寫快取都需要定址,為了減少定址的開銷,最頻繁讀寫的資料(比如迴圈變數),都會放在暫存器裡面,CPU 優先讀寫暫存器,再由暫存器跟記憶體交換資料

2.從一段彙編開始瞭解暫存器

mov eax, dword ptr [ebp-8]  #將數值從記憶體賦值到eax暫存器
add eax, dword ptr [ebp-0ch] #eax的數值和記憶體的數值相加
mov eax, dword ptr [ebp-4],eax #把eax的數值(上一步計算的結果)儲存到記憶體中

使用高階語言編寫的程式在編譯後轉化為機器語言,機器語言基本上和彙編一一對應。

上面程式碼中 eax,ebp都是暫存器的名稱,

種類 功能
累加暫存器 儲存執行運算的資料和運算後的資料
標誌暫存器 儲存運算處理後cpu的狀態
程式計數器 儲存下一條指令所在的記憶體地址
基址暫存器 儲存資料記憶體的起始地址
變址暫存器 儲存基址暫存器的相對位置
通用暫存器 儲存任意資料
指令暫存器 儲存指令,cpu內部使用,程式設計師無法修改
棧暫存器 儲存棧區域的起始地址

其中程式計數器,累加暫存器,標誌暫存器,指令暫存器和棧暫存器只有一個,其他的暫存器一般存在多個。

image-20230402104857941

對於程式設計師來說只需要理解暫存器的作用,cpu是一組暫存器的組合

3.程式計數器

程式啟動後,作業系統會將硬碟中儲存的程式複製到記憶體中,命令和資料通常被儲存到多個地址上,作業系統在複製程式到記憶體的時候,會將程式計數器設定為起始位置,CPU每執行一個指令,程式計數器就會自動加上1,因此CPU會依據程式計數器的數值從記憶體讀取命令並執行

4.條件分支和迴圈機制是怎麼 實現的

image-20230402110658736

條件分支和迴圈中使用跳轉指令,需要參照當前執行的運算結果來判斷是否跳轉,其中標誌暫存器會儲存當前計算的結果,條件分支在跳轉指令錢會進行比較運算,至於是否執行跳轉指令,則由cpu參考標誌計算器的內容後進行判斷。

5.函式的呼叫機制

呼叫函式的本質是將程式計數器設定為函式的儲存地址。不過這和條件迴圈分支不同,因為丹村的跳轉指令沒辦法實現函式的呼叫,函式呼叫結束後需要回到原本的呼叫點。

機器語言使用call,return指令解決這個問題,呼叫函式使用call指令,call指令會將要執行的指令地址儲存到棧記憶體中。

image-20230402111705295

函式處理完畢後,再透過函式的出口執行return指令,return指令會將棧中地址設定到程式計數中。

image-20230402111749777

相關文章