0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

CPU的內(nèi)部結(jié)構(gòu)剖析

jf_78858299 ? 來(lái)源:前端柒八九 ? 作者:前端柒八九 ? 2023-03-31 16:04 ? 次閱讀

CPU的內(nèi)部結(jié)構(gòu)

?CPU是中央處理器Central Processing Unit的縮寫(xiě),相當(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è)組成部分

  1. 「寄存器」
    • 用來(lái) 「緩存」 指令、數(shù)據(jù)等處理對(duì)象,可以將其看作是**「內(nèi)存的一種」**
    • 根據(jù)種類的不同,一個(gè)CPU內(nèi)部戶有20~100個(gè)寄存器
  2. 「控制器」
    • 負(fù)責(zé)把 「內(nèi)存」 上的指令、數(shù)據(jù)等讀入**「寄存器」**
    • 并根據(jù)指令的執(zhí)行結(jié)果來(lái) 「控制」 整個(gè)計(jì)算機(jī)
  3. 「運(yùn)算器」
    • 負(fù)責(zé)運(yùn)算**「從內(nèi)存讀入寄存器的數(shù)據(jù)」**
  4. 「時(shí)鐘」
    • 負(fù)責(zé)發(fā)出CPU開(kāi)始計(jì)時(shí)的**「時(shí)鐘信號(hào)」**

內(nèi)存

?通常所說(shuō)的 「內(nèi)存」 指的是計(jì)算機(jī)的主要存儲(chǔ)器Main Memory,簡(jiǎn)稱 「主存」

?

主存通過(guò) 控制芯片 等與CPU相連,主要負(fù)責(zé) 「存儲(chǔ)指令和數(shù)據(jù)」 。主存由 「可讀寫(xiě)」 的元素構(gòu)成,每個(gè)字節(jié)(1字節(jié)=8位)都帶有一個(gè) 「地址編號(hào)」CPU可以通過(guò)該地址 「讀取」 主存中的指令和數(shù)據(jù),當(dāng)然也可以 「寫(xiě)入」 數(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ǔ)言編寫(xiě)的代碼。

? 「匯編語(yǔ)言」 采用助記符Memonic來(lái)編寫(xiě)程序,每一個(gè)原本是 電氣信號(hào)」「機(jī)器語(yǔ)言指令」 都有有一個(gè)與其 「相對(duì)應(yīng)的助記符」

助記符通常為指令功能的英語(yǔ)單詞的縮寫(xiě)。

?

圖片

匯編代碼

例如,movadd分別是數(shù)據(jù)的存儲(chǔ)和相加的簡(jiǎn)寫(xiě)。

?「匯編語(yǔ)言和機(jī)器語(yǔ)言基本上是一一對(duì)應(yīng)的」

?

  • 通常我們將 「匯編語(yǔ)言」 編寫(xiě)的程序轉(zhuǎn)化成 「機(jī)器語(yǔ)言」 的過(guò)程稱為**「匯編」**
  • 反之, 「機(jī)器語(yǔ)言」 程序轉(zhuǎn)化成 「匯編語(yǔ)言」 的程序的過(guò)程稱為**「反匯編」**

從上述的 「匯編代碼」 中,我們可以看出, 「機(jī)器語(yǔ)言級(jí)別的程序是通過(guò)寄存器來(lái)處理的」 ,也就是說(shuō), 「CPU是寄存器的集合體」 。eaxebp表示的都是寄存器。并且,內(nèi)存的存儲(chǔ)場(chǎng)所 「通過(guò)地址編號(hào)來(lái)區(qū)分」 ,而寄存器的種類 「通過(guò)名字來(lái)區(qū)分」

CPU處理程序的大致過(guò)程如下:

?使用 「高級(jí)語(yǔ)言」 編寫(xiě)的程序會(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行的有用程序是很少見(jiàn)的,機(jī)器語(yǔ)言的程序也是如此。接下來(lái),我們看一下程序是如何按照流程運(yùn)行的。

下圖是程序啟動(dòng)后的內(nèi)存內(nèi)容的模型。

?用戶發(fā)出啟動(dòng)程序的指示后, 操作系統(tǒng) 會(huì)把 「硬盤(pán)」 中保存的程序 「復(fù)制」「內(nèi)存」 中。

?

實(shí)例中的程序?qū)崿F(xiàn)的是將123456兩個(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è)地址中。

大致流程如下:

  1. 地址0100是程序運(yùn)行的開(kāi)始位置。
  2. 操作系統(tǒng)把程序從 「硬盤(pán)」 復(fù)制到 「內(nèi)存」 后,會(huì)將 「程序計(jì)數(shù)器」CPU寄存器的一種)設(shè)定為0100,然后程序便開(kāi)始運(yùn)行。
  3. CPU每執(zhí)行一個(gè)指令,程序計(jì)數(shù)器的值就會(huì)自動(dòng)加1」
  4. 然后,CPU「控制器」 就會(huì)參照程序計(jì)數(shù)器的數(shù)值,從內(nèi)存中讀取命令并執(zhí)行。

?程序計(jì)數(shù)器決定著程序的流程

?


條件分支和循環(huán)機(jī)制

程序的流程分為 「順序執(zhí)行」 、 「條件分支」「循環(huán)」 三種。

  1. 「順序執(zhí)行」 是指按照地址內(nèi)容的順序執(zhí)行指令
  2. 「條件分支」 是指根據(jù)條件執(zhí)行任意地址的指令
  3. 「循環(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)。

大致流程如下:

  1. 程序運(yùn)行的開(kāi)始位置是0100地址
  2. 隨著 「程序計(jì)數(shù)器」 數(shù)值的增加
  3. 當(dāng)?shù)竭_(dá)0102地址時(shí),如果 「累加寄存器」 的值是 「正數(shù)」 ,則執(zhí)行 「跳轉(zhuǎn)指令」jump指令)跳轉(zhuǎn)到0104地址
  4. 此時(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é)果為 「正」 表示XXXYYY
  • 結(jié)果為 「零」 表示XXXYYY相等
  • 結(jié)果為 「負(fù)」 表示XXXYYY

?程序中的比較指令,就是在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è)地址」 )

?

圖片

上圖的示例為 變量ab分別代入123456后,將其賦值給參數(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ù)組的操作

?

圖片

  1. 「十六進(jìn)制數(shù)」 將計(jì)算機(jī)內(nèi)存上00000000~FFFFFFFF的地址劃分出來(lái)
    • 凡是該范圍的內(nèi)存區(qū)域,只要有一個(gè)32位的寄存器,即可查看全部的內(nèi)存地址
  2. 如果想要像數(shù)組那樣分割特定的內(nèi)存區(qū)域以達(dá)到連續(xù)查看的目的,使用兩個(gè)寄存器會(huì)更方便

圖片

?CPU會(huì)把 「基址寄存器」 + 「變址寄存器」 的值解釋為實(shí)際查看的內(nèi)存地址。

?

「變址寄存器」 的值相當(dāng)于高級(jí)程序語(yǔ)言程序中數(shù)組的**「索引功能」**

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    10702

    瀏覽量

    209430
  • 計(jì)算機(jī)
    +關(guān)注

    關(guān)注

    19

    文章

    7174

    瀏覽量

    87165
  • 晶體管
    +關(guān)注

    關(guān)注

    77

    文章

    9505

    瀏覽量

    136957
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    芯片封裝內(nèi)部結(jié)構(gòu)

    `芯片封裝內(nèi)部結(jié)構(gòu)經(jīng)典封裝知識(shí),內(nèi)部結(jié)構(gòu)完美呈現(xiàn),分析芯片封裝的每一個(gè)知識(shí)點(diǎn)。[hide][/hide]`
    發(fā)表于 06-11 16:10

    8051內(nèi)部結(jié)構(gòu)

    8051內(nèi)部結(jié)構(gòu)供大家參考。
    發(fā)表于 12-17 08:59

    51單片機(jī)CPU內(nèi)部結(jié)構(gòu)及工作原理是什么

    51單片機(jī)CPU內(nèi)部結(jié)構(gòu)及工作原理1.51單片機(jī)CPU內(nèi)部結(jié)構(gòu)2.工作原理1.51單片機(jī)CPU內(nèi)部
    發(fā)表于 11-18 08:22

    cpu內(nèi)部結(jié)構(gòu)

    cpu內(nèi)部結(jié)構(gòu) 1.算術(shù)邏輯單元ALU(Arithmetic Logic Unit) ALU是運(yùn)算器的核心。它是以全加器為基礎(chǔ),輔之以移位寄存器及相應(yīng)控制邏輯組合而成的電路
    發(fā)表于 01-15 10:32 ?2.2w次閱讀

    L4990內(nèi)部結(jié)構(gòu)框圖

    L4990內(nèi)部結(jié)構(gòu)框圖
    發(fā)表于 10-15 11:52 ?758次閱讀
    L4990<b class='flag-5'>內(nèi)部結(jié)構(gòu)</b>框圖

    MAX782內(nèi)部結(jié)構(gòu)框圖

    MAX782內(nèi)部結(jié)構(gòu)框圖 內(nèi)部框圖
    發(fā)表于 11-14 16:24 ?961次閱讀
    MAX782<b class='flag-5'>內(nèi)部結(jié)構(gòu)</b>框圖

    LT1072的內(nèi)部結(jié)構(gòu)框圖

    LT1072的內(nèi)部結(jié)構(gòu)框圖
    發(fā)表于 11-14 16:59 ?1024次閱讀
    LT1072的<b class='flag-5'>內(nèi)部結(jié)構(gòu)</b>框圖

    蓄電池內(nèi)部結(jié)構(gòu)

    蓄電池內(nèi)部結(jié)構(gòu)
    發(fā)表于 11-16 14:15 ?5298次閱讀

    伺服電機(jī)內(nèi)部結(jié)構(gòu)

    伺服電機(jī)內(nèi)部結(jié)構(gòu)
    發(fā)表于 02-25 17:38 ?4707次閱讀
    伺服電機(jī)<b class='flag-5'>內(nèi)部結(jié)構(gòu)</b>

    動(dòng)鐵耳機(jī)的內(nèi)部結(jié)構(gòu)

    動(dòng)鐵耳機(jī)的內(nèi)部結(jié)構(gòu)  
    發(fā)表于 05-17 18:28 ?9357次閱讀

    元件的內(nèi)部結(jié)構(gòu)

    元件的內(nèi)部結(jié)構(gòu)
    發(fā)表于 03-04 17:48 ?6次下載

    mcs-51單片機(jī)CPU內(nèi)部結(jié)構(gòu)及工作原理

    51單片機(jī)CPU內(nèi)部結(jié)構(gòu)及工作原理1.51單片機(jī)CPU內(nèi)部結(jié)構(gòu)2.工作原理1.51單片機(jī)CPU內(nèi)部
    發(fā)表于 11-11 14:21 ?28次下載
    mcs-51單片機(jī)<b class='flag-5'>CPU</b>的<b class='flag-5'>內(nèi)部結(jié)構(gòu)</b>及工作原理

    交叉導(dǎo)軌的內(nèi)部結(jié)構(gòu)

    交叉導(dǎo)軌的內(nèi)部結(jié)構(gòu)
    的頭像 發(fā)表于 08-16 17:52 ?895次閱讀
    交叉導(dǎo)軌的<b class='flag-5'>內(nèi)部結(jié)構(gòu)</b>

    MOSFET和IGBT內(nèi)部結(jié)構(gòu)與應(yīng)用

    MOSFET和IGBT內(nèi)部結(jié)構(gòu)不同,決定了其應(yīng)用領(lǐng)域的不同。
    的頭像 發(fā)表于 11-03 14:53 ?837次閱讀
    MOSFET和IGBT<b class='flag-5'>內(nèi)部結(jié)構(gòu)</b>與應(yīng)用

    深度剖析汽車內(nèi)部結(jié)構(gòu)和原理

    很多人都想了解更多的汽車知識(shí),以加深對(duì)汽車的了解,只是無(wú)奈汽車結(jié)構(gòu)之復(fù)雜,機(jī)械知識(shí)之乏味,都一一放棄了。下面給大家準(zhǔn)備了一組圖解汽車文章,結(jié)合圖片剖析汽車內(nèi)部結(jié)構(gòu),讓復(fù)雜的原理變得通俗易懂。
    的頭像 發(fā)表于 12-28 10:31 ?873次閱讀
    深度<b class='flag-5'>剖析</b>汽車<b class='flag-5'>內(nèi)部結(jié)構(gòu)</b>和原理