一:對程序員來講CPU是什麼?

 0、開篇

   (1)程序是什麼?
         指示計算機每一步動做的一組指令
    (2)程序是由什麼組成的?
         指令和數據
    (3)什麼是機器語言?
         CPU能夠直接識別並使用的語言
    (4)正在運行的程序存儲在什麼位置?
         內存
    (5)什麼是內存地址?
         內存中,用來表示命令和數據存儲位置的數值
    (6)計算機的構成元件中,負責程序的解釋和運行是哪一個?
        CPU
 

一、CPU的內部結構解析

    ① CPU所負責的就是解釋和運行最終轉換成機器語言的程序內容。以下圖所示:
    
 
    ② CPU的內部由寄存器、控制器、運算器和時鐘四個部分構成,各部分之間由電流信號相互連通。
    寄存器:暫存指令、數據等處理對象;
    控制器:把內存上的指令、數據等讀入寄存器;
    運算器:運算從內存讀入寄存器的數據;
    時鐘:發出CPU開始計時的時鐘信號;(時鐘信號的頻率越高,CPU的運行速度就越快)
    
 
    ③ 內存,經過控制芯片與CPU相連,主要負責存儲指令和數據。內存由可讀寫的元素構成,每一個字節(1字節=8位)都帶有一個地址編號。CPU能夠經過該地址讀取主存中的指令和數據,固然也能夠寫入數據。
Warn:內存中存儲的指令和數據會隨着計算機的關機而自動清除。由於其一般使用DRAM(Dynamic Random Access Memory,動態隨機存取存儲器)芯片。
 
    ④ 經過了解CPU的構造後,程序的運行機制大概以下:
程序啓動後,根據時鐘信號,控制器會從內存中讀取指令和數據。經過對這些指令加以解釋和運行,運算器就會對數據進行運算,控制器根據該運算結果來控制計算機。

二、CPU是寄存器的集合體

    ① CPU的四個構成部分中,程序員只須要了解寄存器便可。由於程序是把寄存器做爲對象來描述的。
不一樣類型的CPU,其內部寄存器的數量、種類以及寄存器存儲的數值範圍都是不一樣的。不過,根據功能的不一樣,咱們能夠將寄存器大體分爲8類,以下圖:
    
    能夠看出,寄存器中存儲的內容既能夠是指令也能夠是數據。其中數據分爲「用於運算的數值」和「表示內存地址的數值」兩種。它們使用的寄存器也是不一樣的。用於運算的數值放在累加寄存器中存儲,表示內存地址的數值則放在基址寄存器和變址寄存器中存儲。
 
    ② 對程序員來講,CPU就是各類功能的寄存器的集合體。其中,程序計數器、累加寄存器、標誌寄存器、指令寄存器和棧寄存器都只有一個,其餘的寄存器通常有多個。
以下圖所示,程序員眼中的CPU
   
 

三、決定程序流程的程序計數器

    存儲指令和數據的內存,是經過地址來劃分的:
   
    上圖可知:程序計數器決定這程序的流程,實際上,一個命令和數據一般被存儲在多個地址上,上圖只是爲了便於說明,把指令、數據分配到了一個地址中。
 

四、條件分支和循環分支

    ① 程序的流程通常有三種:順序執行、條件執行和循環三種。
順序執行的狀況比較簡單,每執行一個指令程序計數器的值就自動加1;但若程序中存在條件分支和循環,機器語言的指令就能夠將程序計數器的值設定爲任意地址。
    下圖會以條件分支爲例:
     
    程序運行的開始位置是0100地址。隨着程序計數器數值的增長,當達到0102地址時,若是累加寄存器的值是正數,則執行跳轉指令(jump指令)跳轉到0104地址。此時,因爲累加寄存器的值時123,爲正數,由於0103地址的指令被跳過,程序的流程直接跳轉到了0104地址。也就是說,「跳轉到0104地址」這個指令間接執行了「將程序計數器設定爲0104地址」這個操做。
 
    ② 條件分支和循環分支使用的跳轉指令,會參照當前執行的運算結果。結果是存儲在標誌寄存器中的(也負責存放溢出和奇偶校驗的結果)
    

    32位CPU(寄存器的長度是32位)程序員

    標誌寄存器的數值會根據運算結果自動設定。至因而否執行跳轉指令,則由CPU在參考標誌寄存器的數值後進行判斷。運算結果的正、零、負三種狀態由標誌寄存器的三個位表示,標誌寄存器的第一個字節位、第二個字節位和第三個字節位的值位1時,表示運算結果分別爲正數、零和負數。編程

五、函數的調用機制

    函數調用處理也是經過把程序計數器的值設定成函數的存儲地址來實現的。不過,這和條件分支、循環的機制全部不一樣,由於單純的跳轉指令沒法實現函數的調用。函數的調用須要在完成函數內部的處理後,處理流程再返回到函數調用點(函數調用指令的下一個地址)。所以,若是隻是跳轉到函數的入口地址,處理流程就不知道應該返回至哪裏去。
    鑑於這個問題,機器語言的call指令和return指令可以解決這個問題。
    在將函數的入口地址設定到程序計數器以前,call指令會把調用函數後要執行的指令地址存儲在名爲棧的主存內。函數處理完畢後,再經過函數的出口來執行return命令。
    return命令的功能是把保存在棧中的地址設定到程序計數器中。
    

    

    在編譯高級編程語言的程序後,函數調用的處理會轉換成call指令,函數結束的處理則會轉換成return指令。這樣一來程序的運行也就變得很是流暢。數組

六、經過地址和索引實現數組

    這一小節就要說到基址寄存器和變址寄存器了。經過這兩個寄存器,咱們能夠對主內存上特定的內存區域進行劃分,從而實現相似於數組的操做。
    首先,咱們用十六進制數將計算機內存上00000000~FFFFFFFF的地址劃分出來。那麼,凡是該範圍的內存區域,只要有一個32位的寄存器,便可查看所有的內存地址。但若是想要像數組那樣分割特定的內存區域以達到連續查看的目的,使用兩個寄存器會更方便。以下圖所示:
    

    假設要查看10000000~1000FFFF地址時,如上圖所示,能夠將1000000存入基址期存器,並使變址寄存器的值在00000000~0000FFFF變化,CPU則會把基址寄存區+變址寄存器的值解釋爲實際查看的內存地址。dom

七、CPU的處理其實很簡單

    CPU能夠進行的處理很少,下圖列舉一些:編程語言

    

相關文章
相關標籤/搜索