CPU的內(nèi)部結(jié)構(gòu)
?CPU是中央處理器Central Processing Unit的縮寫,相當(dāng)于計(jì)算機(jī)的大腦,它的內(nèi)部由數(shù)百萬(wàn)至數(shù)億個(gè) 「晶體管」 構(gòu)成。
?
在 「程序運(yùn)行流程」 中,CPU
所負(fù)責(zé)的就是 「解釋和運(yùn)行」 最終轉(zhuǎn)換成 「機(jī)器語(yǔ)言」 的程序內(nèi)容。
程序運(yùn)行流程
CPU
和內(nèi)存是由許多晶體管組成的 「電子部件」 ,通常成為集成電路Integrated Circuit。
?從功能方面來(lái)看,
CPU
的內(nèi)部是由 「寄存器」 、 「控制器」 、 「運(yùn)算器」 、 「時(shí)鐘」 等四個(gè)部分組成,各個(gè)部分之間由 「電流信號(hào)」 相互連通。?
CPU的四個(gè)組成部分
- 「寄存器」
- 用來(lái) 「緩存」 指令、數(shù)據(jù)等處理對(duì)象,可以將其看作是**「內(nèi)存的一種」**
- 根據(jù)種類的不同,一個(gè)
CPU
內(nèi)部戶有20~100
個(gè)寄存器
- 「控制器」
- 負(fù)責(zé)把 「內(nèi)存」 上的指令、數(shù)據(jù)等讀入**「寄存器」**
- 并根據(jù)指令的執(zhí)行結(jié)果來(lái) 「控制」 整個(gè)計(jì)算機(jī)
- 「運(yùn)算器」
- 負(fù)責(zé)運(yùn)算**「從內(nèi)存讀入寄存器的數(shù)據(jù)」**
- 「時(shí)鐘」
- 負(fù)責(zé)發(fā)出
CPU
開始計(jì)時(shí)的**「時(shí)鐘信號(hào)」**
- 負(fù)責(zé)發(fā)出
內(nèi)存
?通常所說(shuō)的 「內(nèi)存」 指的是計(jì)算機(jī)的主要存儲(chǔ)器Main Memory,簡(jiǎn)稱 「主存」 。
?
主存
通過(guò) 「控制芯片」 等與CPU
相連,主要負(fù)責(zé) 「存儲(chǔ)指令和數(shù)據(jù)」 。主存由 「可讀寫」 的元素構(gòu)成,每個(gè)字節(jié)(1字節(jié)=8位
)都帶有一個(gè) 「地址編號(hào)」 。CPU
可以通過(guò)該地址 「讀取」 主存中的指令和數(shù)據(jù),當(dāng)然也可以 「寫入」 數(shù)據(jù)。
程序運(yùn)行機(jī)制
程序啟動(dòng)后,根據(jù) 「時(shí)鐘信號(hào)」 , 「控制器」 會(huì)從 「內(nèi)存」 中讀取指令和數(shù)據(jù)。通過(guò)對(duì)這些指令加以解釋和運(yùn)行, 「運(yùn)算器」 就會(huì)對(duì)數(shù)據(jù)進(jìn)行運(yùn)算, 「控制器」 根據(jù)該運(yùn)算結(jié)果來(lái)控制計(jì)算機(jī)。
CPU是寄存器的集合體
CPU
的四個(gè)構(gòu)成部分中,我們只需要了解寄存器即可。這是因?yàn)椋?「程序是把寄存器作為對(duì)象來(lái)描述的」 。
假設(shè),我們存在如下用匯編語(yǔ)言編寫的代碼。
? 「匯編語(yǔ)言」 采用助記符Memonic來(lái)編寫程序,每一個(gè)原本是 「電氣信號(hào)」 的 「機(jī)器語(yǔ)言指令」 都有有一個(gè)與其 「相對(duì)應(yīng)的助記符」 。
助記符通常為指令功能的英語(yǔ)單詞的縮寫。
?
匯編代碼
例如,mov
和add
分別是數(shù)據(jù)的存儲(chǔ)和相加的簡(jiǎn)寫。
?「匯編語(yǔ)言和機(jī)器語(yǔ)言基本上是一一對(duì)應(yīng)的」
?
- 通常我們將 「匯編語(yǔ)言」 編寫的程序轉(zhuǎn)化成 「機(jī)器語(yǔ)言」 的過(guò)程稱為**「匯編」**
- 反之, 「機(jī)器語(yǔ)言」 程序轉(zhuǎn)化成 「匯編語(yǔ)言」 的程序的過(guò)程稱為**「反匯編」**
從上述的 「匯編代碼」 中,我們可以看出, 「機(jī)器語(yǔ)言級(jí)別的程序是通過(guò)寄存器來(lái)處理的」 ,也就是說(shuō), 「CPU是寄存器的集合體」 。eax
和ebp
表示的都是寄存器。并且,內(nèi)存的存儲(chǔ)場(chǎng)所 「通過(guò)地址編號(hào)來(lái)區(qū)分」 ,而寄存器的種類 「通過(guò)名字來(lái)區(qū)分」 。
CPU
處理程序的大致過(guò)程如下:
?使用 「高級(jí)語(yǔ)言」 編寫的程序會(huì)在 「編譯」 后轉(zhuǎn)化成 「機(jī)器語(yǔ)言」 ,然后再通過(guò)
CPU
內(nèi)部的寄存器來(lái)處理。?
寄存器的種類
?不同類型的
CPU
,其內(nèi)部寄存器的數(shù)量、種類以及寄存器存儲(chǔ)的數(shù)值范圍都是不同的。?
不過(guò),根據(jù)功能的不同,我們可以將寄存器大致分為 「8類」 。
寄存器的主要種類和功能
可以看出,寄存器中存儲(chǔ)的內(nèi)容既 「可以是指令也可以是數(shù)據(jù)」 。其中,數(shù)據(jù)分為 「用于運(yùn)算的數(shù)據(jù)」 和**「表示內(nèi)存地址的數(shù)據(jù)」**
CPU是寄存器的集合體
決定程序流程的程序計(jì)數(shù)器
只有1行的有用程序是很少見的,機(jī)器語(yǔ)言的程序也是如此。接下來(lái),我們看一下程序是如何按照流程運(yùn)行的。
下圖是程序啟動(dòng)后的內(nèi)存內(nèi)容的模型。
?用戶發(fā)出啟動(dòng)程序的指示后, 「操作系統(tǒng)」 會(huì)把 「硬盤」 中保存的程序 「復(fù)制」 到 「內(nèi)存」 中。
?
實(shí)例中的程序?qū)崿F(xiàn)的是將123
和456
兩個(gè)數(shù)值相加,并將結(jié)果輸出到顯示器上。
前面我們已經(jīng)介紹過(guò),存儲(chǔ)指令和數(shù)據(jù)的內(nèi)存,是通過(guò)地址來(lái)劃分的。由于使用機(jī)器語(yǔ)言難以清晰地表明各地址存儲(chǔ)的內(nèi)容,因此我們對(duì)各地址的存儲(chǔ)內(nèi)容添加注釋。實(shí)際上, 「一個(gè)命令和數(shù)據(jù)通常被存儲(chǔ)在多個(gè)地址上」 ,但是為了便于說(shuō)明,上面的圖例中,把指令、數(shù)據(jù)分配到一個(gè)地址中。
大致流程如下:
- 地址
0100
是程序運(yùn)行的開始位置。 - 操作系統(tǒng)把程序從 「硬盤」 復(fù)制到 「內(nèi)存」 后,會(huì)將 「程序計(jì)數(shù)器」 (
CPU
寄存器的一種)設(shè)定為0100
,然后程序便開始運(yùn)行。 - 「
CPU
每執(zhí)行一個(gè)指令,程序計(jì)數(shù)器的值就會(huì)自動(dòng)加1」 - 然后,
CPU
的 「控制器」 就會(huì)參照程序計(jì)數(shù)器的數(shù)值,從內(nèi)存中讀取命令并執(zhí)行。
?程序計(jì)數(shù)器決定著程序的流程
?
條件分支和循環(huán)機(jī)制
程序的流程分為 「順序執(zhí)行」 、 「條件分支」 和 「循環(huán)」 三種。
- 「順序執(zhí)行」 是指按照地址內(nèi)容的順序執(zhí)行指令
- 「條件分支」 是指根據(jù)條件執(zhí)行任意地址的指令
- 「循環(huán)」 是指重復(fù)執(zhí)行同一地址的指令
「順序執(zhí)行」 的情況比較簡(jiǎn)單,每執(zhí)行一個(gè)指令 「程序計(jì)數(shù)器」 的值就 「自動(dòng)加1」 .但若程序中存在 「條件分支」 和 「循環(huán)」 ,機(jī)器語(yǔ)言的指令就可以將 「程序計(jì)數(shù)器」 的值設(shè)定為 「任意地址」 (不是加1)。這樣一來(lái),程序便可以返回到上一個(gè)地址來(lái)重復(fù)執(zhí)行同一個(gè)指令,或者跳轉(zhuǎn)到任意地址。
條件分支運(yùn)行流程
上圖表示把內(nèi)存中存儲(chǔ)的數(shù)值(示例中是123)的絕對(duì)值輸出到顯示器的程序的內(nèi)存狀態(tài)。
大致流程如下:
- 程序運(yùn)行的開始位置是
0100
地址 - 隨著 「程序計(jì)數(shù)器」 數(shù)值的增加
- 當(dāng)?shù)竭_(dá)
0102
地址時(shí),如果 「累加寄存器」 的值是 「正數(shù)」 ,則執(zhí)行 「跳轉(zhuǎn)指令」 (jump
指令)跳轉(zhuǎn)到0104
地址 - 此時(shí),由于 「累加寄存器」 的值是
123
,為 「正數(shù)」 ,因此0103
地址的指令被跳過(guò),程序的流程 「直接」 跳轉(zhuǎn)到了0104
地址
? 「條件分支」 和 「循環(huán)」 中使用的 「跳轉(zhuǎn)指令」 ,會(huì)參照當(dāng)前執(zhí)行的 「運(yùn)算結(jié)果」 來(lái)判斷是否跳轉(zhuǎn)。
?
前面我們提到過(guò) 「標(biāo)志寄存器」 。無(wú)論當(dāng)前 「累加寄存器」 的運(yùn)算結(jié)果是負(fù)數(shù)、零還是正數(shù), 「標(biāo)志寄存器」 都會(huì)將其保存。
CPU
在進(jìn)行運(yùn)算時(shí), 「標(biāo)志寄存器」 的數(shù)值會(huì)根據(jù)運(yùn)算結(jié)果 「自動(dòng)設(shè)定」 。至于是否執(zhí)行 「跳轉(zhuǎn)指令」 ,則由CPU
在參考 「標(biāo)志寄存器」 的數(shù)值后進(jìn)行判斷。運(yùn)算結(jié)果的正、零、負(fù) 「三個(gè)狀態(tài)」 由 「標(biāo)志寄存器」 的三個(gè)位表示。
32位CPU(寄存器的長(zhǎng)度是32位)的標(biāo)志寄存器的示例
「標(biāo)志寄存器」 的第一個(gè)字節(jié)位、第二個(gè)字節(jié)位和第三個(gè)字節(jié)位的值為1時(shí),表示的運(yùn)算結(jié)果分別為正數(shù)、零和負(fù)數(shù)。
CPU比較機(jī)制
假設(shè)要比較 「累加寄存器」 中存儲(chǔ)的XXX
值和 「通用寄存器」 中存儲(chǔ)的YYY
值,執(zhí)行比較的指令后,CPU
的運(yùn)算裝置就會(huì)在內(nèi)部進(jìn)行XXX-YYY
的 「減法運(yùn)行」 。
無(wú)論減法運(yùn)算的結(jié)果是正數(shù)、零還是負(fù)數(shù),都會(huì)被保存到 「標(biāo)志寄存器」 中。
- 結(jié)果為 「正」 表示
XXX
比YYY
大 - 結(jié)果為 「零」 表示
XXX
和YYY
相等 - 結(jié)果為 「負(fù)」 表示
XXX
和YYY
小
?程序中的比較指令,就是在
CPU
內(nèi)部做減法運(yùn)算?
函數(shù)的調(diào)用機(jī)制
?函數(shù)調(diào)用處理也是通過(guò)把 「程序計(jì)數(shù)器」 的值設(shè)定成函數(shù)的存儲(chǔ)地址來(lái)實(shí)現(xiàn)的
?
和 「條件分支」 、 「循環(huán)」 的機(jī)制不同,因?yàn)閱渭兊奶D(zhuǎn)指令無(wú)法實(shí)現(xiàn)函數(shù)的調(diào)用。
?函數(shù)的調(diào)用需要在完成函數(shù)內(nèi)部的處理后,處理流程再返回到函數(shù)調(diào)用點(diǎn)( 「函數(shù)調(diào)用指令的下一個(gè)地址」 )
?
上圖的示例為 變量a
和b
分別代入123
和456
后,將其賦值給參數(shù)來(lái)調(diào)用MyFunc
函數(shù)的C
語(yǔ)言程序。圖中的地址是將C
語(yǔ)言編譯成機(jī)器語(yǔ)言后運(yùn)行時(shí)的地址。由于1行C
語(yǔ)言程序在編譯后通常會(huì)變成多行的機(jī)器語(yǔ)言,所以圖中的地址是 「離散」 的。
此外,通過(guò) 「跳轉(zhuǎn)指令」 把 「程序計(jì)數(shù)器」 的值設(shè)定為0260
也可以實(shí)現(xiàn)調(diào)用MyFunc
函數(shù)。函數(shù)的 「調(diào)用原點(diǎn)」 (0132
地址)和 「被調(diào)用函數(shù)」 (0260
地址)之間的數(shù)據(jù)傳遞,可以通過(guò)內(nèi)存或寄存器來(lái)實(shí)現(xiàn)。
當(dāng)函數(shù)處理進(jìn)行到最后的0354
地址時(shí),我們應(yīng)該將 「程序計(jì)數(shù)器」 的值設(shè)定成函數(shù)調(diào)用后要執(zhí)行的0154
地址。我們通過(guò)機(jī)器語(yǔ)言的call
指令和return
指令能實(shí)現(xiàn)該功能。
call 指令和return 指令
?函數(shù)調(diào)用使用的是
call
指令,而不是跳轉(zhuǎn)指令。?
在將函數(shù)的入口地址設(shè)定到 「程序計(jì)數(shù)器」 之前, 「call指令」 會(huì)把調(diào)用函數(shù)后要執(zhí)行的指令地址存儲(chǔ)在名為 「?!?/strong> 的內(nèi)存內(nèi)。 「return 指令」 的功能是把保存在棧中的地址設(shè)定到 「程序計(jì)數(shù)器」 中。
通過(guò)地址和索引實(shí)現(xiàn)數(shù)組
?通過(guò) 「基址寄存器」 和 「變址寄存器」 可以對(duì) 「主內(nèi)存」 上特定的內(nèi)存區(qū)域進(jìn)行劃分,從而實(shí)現(xiàn)類似于數(shù)組的操作
?
- 用 「十六進(jìn)制數(shù)」 將計(jì)算機(jī)內(nèi)存上
00000000~FFFFFFFF
的地址劃分出來(lái)- 凡是該范圍的內(nèi)存區(qū)域,只要有一個(gè)32位的寄存器,即可查看全部的內(nèi)存地址
- 如果想要像數(shù)組那樣分割特定的內(nèi)存區(qū)域以達(dá)到連續(xù)查看的目的,使用兩個(gè)寄存器會(huì)更方便
?
CPU
會(huì)把 「基址寄存器」 + 「變址寄存器」 的值解釋為實(shí)際查看的內(nèi)存地址。?
「變址寄存器」 的值相當(dāng)于高級(jí)程序語(yǔ)言程序中數(shù)組的**「索引功能」**
-
cpu
+關(guān)注
關(guān)注
68文章
10873瀏覽量
212081 -
計(jì)算機(jī)
+關(guān)注
關(guān)注
19文章
7511瀏覽量
88148 -
晶體管
+關(guān)注
關(guān)注
77文章
9702瀏覽量
138404
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論