熱(re)線電話(hua):0755-23712116
郵(you)箱:contact@legoupos.cn
地址:深圳市寶安區沙(sha)井街道后(hou)亭茅(mao)洲山工業(ye)園(yuan)工業(ye)大(da)廈全至科技創新(xin)園(yuan)科創大(da)廈2層2A
大家都是程序員,大家都是和計算機打交道的程序員,大家都是和計算機中軟件硬件打交道的程序員,大家都是和CPU打交道的程序員,所以,不管你是玩兒硬件的還是做軟件的,你的世界都少不了計算機最(zui)核(he)心(xin)的 - CPU
CPU是什么
CPU 的全稱是 Central Processing Unit,它是你的電腦中最硬核的組件,這種說法一點不為過。CPU 是能夠讓你的計算機叫計算機的核心組件,但是它卻不能代表你的電腦,CPU 與計算機的關系就相當于大腦和人的關系。它是一種小型的計算機芯片,它嵌入在臺式機、筆記本電腦或者平板電腦的主板上。通過在單個計算機芯片上放置數十億個微型晶體(ti)管來構建(jian) CPU。 這些晶體(ti)管使它能(neng)夠執行運行存(cun)儲在系統內存(cun)中的(de)(de)程序所需的(de)(de)計(ji)(ji)算,也就是說 CPU 決定了你(ni)電腦的(de)(de)計(ji)(ji)算能(neng)力。
CPU 實際做什么
CPU 的(de)核心是(shi)從(cong)程序或應用(yong)程序獲取指(zhi)令(ling)(ling)并執行(xing)計算。此過程可以(yi)分為三(san)個關鍵階段:提取,解(jie)碼和執行(xing)。CPU從(cong)系(xi)統的(de) RAM 中提取指(zhi)令(ling)(ling),然(ran)后解(jie)碼該(gai)指(zhi)令(ling)(ling)的(de)實(shi)際(ji)內容,然(ran)后再由 CPU 的(de)相關部分執行(xing)該(gai)指(zhi)令(ling)(ling)。
RAM : 隨(sui)機存(cun)取存(cun)儲(chu)器(qi)(英語:Random Access Memory,縮(suo)寫:RAM),也(ye)叫主存(cun),是與(yu) CPU 直(zhi)接(jie)交換數據的(de)內部(bu)存(cun)儲(chu)器(qi)。它(ta)可以(yi)隨(sui)時讀(du)寫(刷新時除外),而且速度很快,通常作為操作系統或其他正(zheng)在運行中的(de)程序的(de)臨時數據存(cun)儲(chu)介質
CPU 的內部結構
說了(le)這么(me)(me)多 CPU 的(de)重要性,那么(me)(me) CPU 的(de)內部結構是什(shen)么(me)(me)呢?又是由什(shen)么(me)(me)組成的(de)呢?下圖展(zhan)示了(le)一(yi)般(ban)程序的(de)運行流程(以 C 語言為例),可以說了(le)解(jie)程序的(de)運行流程是掌握(wo)程序運行機制的(de)基礎(chu)和前提(ti)。
程序編譯執行的過程
在這個流程中,CPU 負責的就(jiu)是解釋和運行最(zui)終轉換成機器語言(yan)的內容(rong)。
CPU 主要(yao)由兩部分構(gou)成:控制單元 和 算術邏輯單元(ALU)
控制(zhi)單元:從(cong)內(nei)存中提取(qu)指令并解(jie)碼執(zhi)行
算數邏輯單元(ALU):處理(li)算數和邏輯運算
CPU 是計算機的心臟和大腦,它和內(nei)存都是(shi)由許多晶體(ti)管組成(cheng)的電子部(bu)件。它接收數(shu)據(ju)輸入,執(zhi)行(xing)指令并處理信息(xi)。它與輸入/輸出(I / O)設備進行(xing)通(tong)信,這(zhe)些設備向 CPU 發送數(shu)據(ju)和從 CPU 接收數(shu)據(ju)。
從功能來看,CPU 的內部由寄存器、控制器、運算器和時鐘四部分(fen)組成,各部分(fen)之間(jian)通(tong)過電(dian)信號(hao)連通(tong)。
CPU內部結構圖
寄(ji)存(cun)器是中央處理器內(nei)的(de)組成(cheng)部分(fen)。它(ta)們可以用(yong)來暫存(cun)指令(ling)、數據(ju)和地(di)址。可以將其看作(zuo)是內(nei)存(cun)的(de)一種。根據(ju)種類的(de)不同,一個 CPU 內(nei)部會有 20 - 100個寄(ji)存(cun)器。
控制器負責把內存上的指令、數據讀入寄存器,并根據指令的結果控制計算機運(yun)算器負(fu)責運(yun)算從內存(cun)中讀入(ru)寄存(cun)器的(de)數據時鐘負(fu)責發出 CPU 開始計時的(de)時鐘信號。
接下來簡單解釋一下內存,為什么說 CPU 需要講一下內存呢,因為內存是與 CPU 進行溝通的橋梁。計算機所有程序的運行都是在內存中運行的,內存又被稱為主存,其作用是存放 CPU 中的運算數據,以及與硬盤等外部存儲設備交換的數據。只要計算機在運行中,CPU 就會把需要運算的數據調到主存中進行運算,當運算完成后CPU再將結果傳送出來,主存的運行也決定了計算機的穩定運行。
主存通過控制芯片與 CPU 進行相連,由可讀寫的元素構成,每個字節(1 byte = 8 bits)都帶有一個地址編號,注意是一個字節,而不是一個位。CPU 通過地址從主存中讀取數據和指令,也可以根據地址寫入數據。注意一點:當計算機關(guan)機時,內(nei)存中的指令(ling)和數據(ju)也會被清除。
CPU 是寄存器的集合體
在 CPU 的四個結(jie)構中(zhong),我(wo)們(men)程(cheng)序(xu)員只需(xu)要了(le)解(jie)寄存(cun)器就(jiu)可以(yi)了(le),其余三個不用過多關注,為(wei)什么這么說?因為(wei)程(cheng)序(xu)是把寄存(cun)器作為(wei)對象來描述(shu)的。
說(shuo)(shuo)到(dao)(dao)寄存器,就(jiu)不(bu)得不(bu)說(shuo)(shuo)到(dao)(dao)匯(hui)編語(yu)(yu)言(yan),我大學(xue)是學(xue)信(xin)息(xi)管理(li)與信(xin)息(xi)系統(tong)的(de),我就(jiu)沒有學(xue)過匯(hui)編這(zhe)門(men)課(ke)(就(jiu)算有這(zhe)門(men)課(ke)也不(bu)會(hui)好好學(xue)hhhh),出(chu)來(lai)混總是要(yao)(yao)還的(de),要(yao)(yao)想作為一個硬核程序員,不(bu)能不(bu)了解這(zhe)些概念。說(shuo)(shuo)到(dao)(dao)匯(hui)編語(yu)(yu)言(yan),就(jiu)不(bu)得不(bu)說(shuo)(shuo)到(dao)(dao)高級語(yu)(yu)言(yan),說(shuo)(shuo)到(dao)(dao)高級語(yu)(yu)言(yan)就(jiu)不(bu)得不(bu)牽扯出(chu)語(yu)(yu)言(yan)這(zhe)個概念。
計算機語言
我們生而為人最明顯的一個特征是我們能通過講話來實現彼此的交流,但是計算機聽不懂你說的話,你要想和他交流必須按照計算機指令來交換,這就涉及到語言的問題,計算機是(shi)(shi)(shi)由二(er)(er)進制構成(cheng)的(de)(de)(de),它只能聽的(de)(de)(de)懂(dong)二(er)(er)進制也(ye)就(jiu)是(shi)(shi)(shi)機器(qi)語(yu)言(yan),但是(shi)(shi)(shi)普(pu)通人是(shi)(shi)(shi)無法看懂(dong)機器(qi)語(yu)言(yan)的(de)(de)(de),這(zhe)個時候(hou)就(jiu)需要一種(zhong)電腦既能識別(bie),人又能理解(jie)的(de)(de)(de)語(yu)言(yan),最先出現的(de)(de)(de)就(jiu)是(shi)(shi)(shi)匯編語(yu)言(yan)。但是(shi)(shi)(shi)匯編語(yu)言(yan)晦澀難懂(dong),所(suo)以又出現了像是(shi)(shi)(shi) C,C++,Java 的(de)(de)(de)這(zhe)種(zhong)高級語(yu)言(yan)。
所以計算機語言(yan)(yan)一(yi)般分為兩種:低級語言(yan)(yan)(機器語言(yan)(yan),匯編(bian)語言(yan)(yan))和(he)高級語言(yan)(yan)。使(shi)用高級語言(yan)(yan)編(bian)寫的程序(xu),經過編(bian)譯(yi)轉(zhuan)換成(cheng)機器語言(yan)(yan)后才(cai)能(neng)(neng)運行,而匯編(bian)語言(yan)(yan)經過匯編(bian)器才(cai)能(neng)(neng)轉(zhuan)換為機器語言(yan)(yan)。
匯編語言
首先來看一段用匯(hui)編語言(yan)表(biao)示的(de)代(dai)碼清單
mov eax, dword ptr [ebp-8] /* 把(ba)數值從內存復制到 eax */
add eax, dword ptr [ebp-0Ch] /* 把 eax 的(de)數(shu)值和內(nei)存的(de)數(shu)值相加 */
mov dword ptr [ebp-4], eax /* 把 eax 的數值(上一(yi)步的結果)存(cun)儲在內存(cun)中*/
這是(shi)采(cai)用(yong)匯編(bian)(bian)(bian)語(yu)(yu)言(yan)(assembly)編(bian)(bian)(bian)寫(xie)程(cheng)序(xu)的一(yi)部分。匯編(bian)(bian)(bian)語(yu)(yu)言(yan)采(cai)用(yong) 助(zhu)記(ji)符(memonic) 來編(bian)(bian)(bian)寫(xie)程(cheng)序(xu),每一(yi)個原本是(shi)電(dian)信號的機器(qi)語(yu)(yu)言(yan)指令會(hui)有(you)一(yi)個與其(qi)對應的助(zhu)記(ji)符,例如(ru) mov,add 分別(bie)是(shi)數(shu)據的存(cun)儲(chu)(move)和(he)相加(addition)的簡寫(xie)。匯編(bian)(bian)(bian)語(yu)(yu)言(yan)和(he)機器(qi)語(yu)(yu)言(yan)是(shi)一(yi)一(yi)對應的。這一(yi)點和(he)高級(ji)語(yu)(yu)言(yan)有(you)很大的不同,通(tong)常我們將匯編(bian)(bian)(bian)語(yu)(yu)言(yan)編(bian)(bian)(bian)寫(xie)的程(cheng)序(xu)轉換為機器(qi)語(yu)(yu)言(yan)的過程(cheng)稱為 匯編(bian)(bian)(bian);反(fan)之,機器(qi)語(yu)(yu)言(yan)轉化為匯編(bian)(bian)(bian)語(yu)(yu)言(yan)的過程(cheng)稱為反(fan)匯編(bian)(bian)(bian)。
匯編語言能夠幫助你理解計算機做了什么工作,機器語言級別的程序是通過寄存器來處理的,上面代碼中的 eax,ebp 都是表示的寄存器,是 CPU 內部寄存器的名稱,所以可以說 CPU 是一系列寄存器的集合體。在內存中的存儲通過地址編號來表示,而寄存器的種類則通過名字來區分。
不同(tong)類型的 CPU ,其內部寄存器的種類,數量以(yi)(yi)及(ji)寄存器存儲(chu)的數值范(fan)圍都是不同(tong)的。不過(guo),根據功能(neng)的不同(tong),可以(yi)(yi)將寄存器劃分為(wei)下(xia)面這(zhe)幾(ji)類
種類功能累加寄(ji)存(cun)(cun)(cun)器(qi)存(cun)(cun)(cun)儲運行的(de)(de)數(shu)據和運算(suan)后(hou)的(de)(de)數(shu)據。標志寄(ji)存(cun)(cun)(cun)器(qi)用于反應處理器(qi)的(de)(de)狀態和運算(suan)結果的(de)(de)某(mou)些特征以(yi)及(ji)控(kong)制指(zhi)(zhi)(zhi)令(ling)(ling)的(de)(de)執行。程序(xu)計數(shu)器(qi)程序(xu)計數(shu)器(qi)是用于存(cun)(cun)(cun)放下一條指(zhi)(zhi)(zhi)令(ling)(ling)所在單元(yuan)的(de)(de)地(di)址的(de)(de)地(di)方。基(ji)址寄(ji)存(cun)(cun)(cun)器(qi)存(cun)(cun)(cun)儲數(shu)據內存(cun)(cun)(cun)的(de)(de)起(qi)始(shi)位置變址寄(ji)存(cun)(cun)(cun)器(qi)存(cun)(cun)(cun)儲基(ji)址寄(ji)存(cun)(cun)(cun)器(qi)的(de)(de)相對地(di)址通用寄(ji)存(cun)(cun)(cun)器(qi)存(cun)(cun)(cun)儲任意數(shu)據指(zhi)(zhi)(zhi)令(ling)(ling)寄(ji)存(cun)(cun)(cun)器(qi)儲存(cun)(cun)(cun)正在被運行的(de)(de)指(zhi)(zhi)(zhi)令(ling)(ling),CPU內部使用,程序(xu)員(yuan)無法對該寄(ji)存(cun)(cun)(cun)器(qi)進(jin)行讀寫棧(zhan)寄(ji)存(cun)(cun)(cun)器(qi)存(cun)(cun)(cun)儲棧(zhan)區域的(de)(de)起(qi)始(shi)位置
其中程序計數器、累加寄存器、標志寄存器、指令寄存器和棧寄存器都(dou)只有一(yi)個,其他寄存器(qi)一(yi)般有多個。
程序員眼中的CPU
程序計數器
程序計數器(Program Counter)是用來存儲下一條指令所在單元的地址。程(cheng)序執(zhi)行(xing)(xing)時(shi),PC的(de)(de)(de)初值為程(cheng)序第一條(tiao)指(zhi)令(ling)(ling)的(de)(de)(de)地(di)址,在順序執(zhi)行(xing)(xing)程(cheng)序時(shi),控制器(qi)(qi)首(shou)先按程(cheng)序計數(shu)器(qi)(qi)所指(zhi)出(chu)(chu)的(de)(de)(de)指(zhi)令(ling)(ling)地(di)址從(cong)內(nei)存中取出(chu)(chu)一條(tiao)指(zhi)令(ling)(ling),然(ran)后分析和執(zhi)行(xing)(xing)該指(zhi)令(ling)(ling),同(tong)時(shi)將(jiang)PC的(de)(de)(de)值加1指(zhi)向下(xia)一條(tiao)要執(zhi)行(xing)(xing)的(de)(de)(de)指(zhi)令(ling)(ling)。
我們還是以一個事例為準來詳細的(de)看(kan)一下(xia)程序計(ji)數器的(de)執行過程
內存中配置程序示例
這(zhe)(zhe)是一(yi)段進行相(xiang)加的(de)(de)操作,程序啟動,在(zai)經過編(bian)譯(yi)解析后會由操作系統把(ba)硬盤中(zhong)(zhong)的(de)(de)程序復制到內存(cun)中(zhong)(zhong),示例中(zhong)(zhong)的(de)(de)程序是將(jiang) 123 和(he) 456 執行相(xiang)加操作,并將(jiang)結果輸出到顯示器上(shang)(shang)(shang)。由于(yu)使用機器語言難以(yi)描述,所(suo)以(yi)這(zhe)(zhe)是經過翻譯(yi)后的(de)(de)結果,實際上(shang)(shang)(shang)每個指令(ling)和(he)數(shu)據都可(ke)能(neng)分布在(zai)不(bu)同的(de)(de)地址上(shang)(shang)(shang),但為(wei)了方便說明,把(ba)組(zu)成一(yi)條指令(ling)的(de)(de)內存(cun)和(he)數(shu)據放在(zai)了一(yi)個內存(cun)地址上(shang)(shang)(shang)。
地址 0100 是程(cheng)(cheng)序(xu)(xu)運行(xing)的(de)起始位置。Windows 等操作系統把程(cheng)(cheng)序(xu)(xu)從(cong)硬盤復制(zhi)到(dao)內存(cun)后,會(hui)將程(cheng)(cheng)序(xu)(xu)計(ji)數(shu)器(qi)作為設(she)定為起始位置 0100,然后執(zhi)行(xing)程(cheng)(cheng)序(xu)(xu),每執(zhi)行(xing)一條(tiao)(tiao)指(zhi)令(ling)(ling)后,程(cheng)(cheng)序(xu)(xu)計(ji)數(shu)器(qi)的(de)數(shu)值會(hui)增加1(或(huo)者(zhe)直接(jie)指(zhi)向(xiang)下一條(tiao)(tiao)指(zhi)令(ling)(ling)的(de)地址),然后,CPU 就會(hui)根(gen)據程(cheng)(cheng)序(xu)(xu)計(ji)數(shu)器(qi)的(de)數(shu)值,從(cong)內存(cun)中讀取命令(ling)(ling)并執(zhi)行(xing),也就是說,程(cheng)(cheng)序(xu)(xu)計(ji)數(shu)器(qi)控制(zhi)著程(cheng)(cheng)序(xu)(xu)的(de)流程(cheng)(cheng)。
條件分支和循環機制
我們(men)都學(xue)過高級(ji)語言,高級(ji)語言中的(de)條(tiao)件控制流程主要分為三種:順序執行、條(tiao)件分支、循環(huan)判(pan)斷三種,順序執行是(shi)按照地址(zhi)(zhi)的(de)內容順序的(de)執行指(zhi)令(ling)。條(tiao)件分支是(shi)根據條(tiao)件執行任意地址(zhi)(zhi)的(de)指(zhi)令(ling)。循環(huan)是(shi)重復執行同一地址(zhi)(zhi)的(de)指(zhi)令(ling)。
順序執行的(de)情況(kuang)比較(jiao)簡單,每執行一條指(zhi)令程序計數器的(de)值就是 + 1。
條件(jian)和(he)循環分支會使程序(xu)計數(shu)器的值指(zhi)(zhi)向任意的地(di)址,這樣(yang)一來(lai),程序(xu)便可(ke)以返回到上一個(ge)地(di)址來(lai)重復執行同一個(ge)指(zhi)(zhi)令,或者(zhe)跳轉(zhuan)到任意指(zhi)(zhi)令。
下面以條件分(fen)支為例來說明程(cheng)序的執行過(guo)程(cheng)(循環也很相(xiang)似)
條件循環的執行流程
程(cheng)(cheng)(cheng)序(xu)(xu)(xu)的(de)(de)(de)開始過程(cheng)(cheng)(cheng)和順(shun)序(xu)(xu)(xu)流程(cheng)(cheng)(cheng)是一樣(yang)(yang)的(de)(de)(de),CPU 從0100處(chu)開始執(zhi)行命令(ling),在(zai)0100和0101都是順(shun)序(xu)(xu)(xu)執(zhi)行,PC 的(de)(de)(de)值(zhi)順(shun)序(xu)(xu)(xu)+1,執(zhi)行到0102地(di)址的(de)(de)(de)指(zhi)令(ling)時,判斷(duan)0106寄存器(qi)的(de)(de)(de)數值(zhi)大于0,跳(tiao)轉(jump)到0104地(di)址的(de)(de)(de)指(zhi)令(ling),將數值(zhi)輸出到顯示(shi)器(qi)中(zhong),然后結束程(cheng)(cheng)(cheng)序(xu)(xu)(xu),0103 的(de)(de)(de)指(zhi)令(ling)被跳(tiao)過了,這就和我(wo)們(men)程(cheng)(cheng)(cheng)序(xu)(xu)(xu)中(zhong)的(de)(de)(de) if() 判斷(duan)是一樣(yang)(yang)的(de)(de)(de),在(zai)不滿足(zu)條件的(de)(de)(de)情況下(xia),指(zhi)令(ling)會直接跳(tiao)過。所以 PC 的(de)(de)(de)執(zhi)行過程(cheng)(cheng)(cheng)也就沒有直接+1,而是下(xia)一條指(zhi)令(ling)的(de)(de)(de)地(di)址。
標志寄存器
條(tiao)件和循環分支會(hui)使用(yong)到 jump(跳轉指令),會(hui)根據當(dang)前(qian)的指令來(lai)判(pan)斷(duan)是(shi)否跳轉,上面我們提到了標(biao)志(zhi)寄存器,無論(lun)當(dang)前(qian)累(lei)加(jia)寄存器的運(yun)算結果(guo)是(shi)正數、負(fu)數還是(shi)零,標(biao)志(zhi)寄存器都會(hui)將其保存(也(ye)負(fu)責(ze)溢(yi)出和奇偶校(xiao)驗)
溢出(overflow):是(shi)指(zhi)運算的結果超過了寄存器的長度范圍(wei)
奇(qi)偶(ou)校驗(parity check):是指檢查(cha)運算結(jie)果的值是偶(ou)數還(huan)是奇(qi)數
CPU 在進行(xing)運算(suan)時,標志(zhi)寄(ji)(ji)存(cun)器(qi)的數值會根據當前運算(suan)的結(jie)(jie)果(guo)自動設定(ding),運算(suan)結(jie)(jie)果(guo)的正、負和零(ling)三種(zhong)狀(zhuang)態由標志(zhi)寄(ji)(ji)存(cun)器(qi)的三個位表(biao)示。標志(zhi)寄(ji)(ji)存(cun)器(qi)的第一個字節(jie)(jie)位、第二個字節(jie)(jie)位、第三個字節(jie)(jie)位各自的結(jie)(jie)果(guo)都為1時,分(fen)別代表(biao)著(zhu)正數、零(ling)和負數。
比(bi)較運算的標志(zhi)寄存器示意圖
CPU 的(de)(de)執行機制(zhi)比(bi)較有意思,假(jia)設(she)累加寄存(cun)器中存(cun)儲的(de)(de) XXX 和通(tong)用寄存(cun)器中存(cun)儲的(de)(de) YYY 做(zuo)比(bi)較,執行比(bi)較的(de)(de)背后,CPU 的(de)(de)運(yun)(yun)算(suan)機制(zhi)就會做(zuo)減(jian)法(fa)運(yun)(yun)算(suan)。而無論減(jian)法(fa)運(yun)(yun)算(suan)的(de)(de)結(jie)果(guo)(guo)是正數、零還是負(fu)數,都會保存(cun)到(dao)標志寄存(cun)器中。結(jie)果(guo)(guo)為(wei)正表示 XXX 比(bi) YYY 大,結(jie)果(guo)(guo)為(wei)零表示 XXX 和 YYY 相等,結(jie)果(guo)(guo)為(wei)負(fu)表示 XXX 比(bi) YYY 小(xiao)。程序比(bi)較的(de)(de)指令,實際上是在 CPU 內(nei)部做(zuo)減(jian)法(fa)運(yun)(yun)算(suan)。
函數調用機制
接下(xia)來(lai),我們(men)繼續介紹函(han)(han)(han)數(shu)(shu)調(diao)用機(ji)制,哪怕(pa)是高級語言編(bian)寫的(de)程序(xu),函(han)(han)(han)數(shu)(shu)調(diao)用處理也(ye)是通過把程序(xu)計(ji)數(shu)(shu)器的(de)值設定(ding)成函(han)(han)(han)數(shu)(shu)的(de)存儲地址(zhi)來(lai)實現(xian)的(de)。函(han)(han)(han)數(shu)(shu)執行跳(tiao)轉(zhuan)(zhuan)指(zhi)令后,必(bi)須進行返回處理,單純的(de)指(zhi)令跳(tiao)轉(zhuan)(zhuan)沒有意(yi)義,下(xia)面是一個實現(xian)函(han)(han)(han)數(shu)(shu)跳(tiao)轉(zhuan)(zhuan)的(de)例子
程序調用示意圖
圖中(zhong)將變(bian)量 a 和(he) b 分(fen)別賦值為 123 和(he) 456 ,調用(yong) MyFun(a,b) 方(fang)法(fa),進行(xing)指(zhi)令跳轉。圖中(zhong)的地址(zhi)是(shi)將 C 語言編(bian)譯成機器語言后(hou)(hou)運行(xing)時的地址(zhi),由于1行(xing) C 程序(xu)在編(bian)譯后(hou)(hou)通常會變(bian)為多(duo)行(xing)機器語言,所(suo)以圖中(zhong)的地址(zhi)是(shi)分(fen)散的。在執(zhi)行(xing)完 MyFun(a,b)指(zhi)令后(hou)(hou),程序(xu)會返回(hui)到 MyFun(a,b) 的下(xia)一條指(zhi)令,CPU 繼續(xu)執(zhi)行(xing)下(xia)面的指(zhi)令。
函(han)(han)數(shu)(shu)的(de)(de)調用(yong)和返回很(hen)重要的(de)(de)兩個指令(ling)(ling)是 call 和 return 指令(ling)(ling),再將函(han)(han)數(shu)(shu)的(de)(de)入口地(di)(di)址設(she)定到(dao)程(cheng)(cheng)序計(ji)數(shu)(shu)器之前(qian),call 指令(ling)(ling)會把調用(yong)函(han)(han)數(shu)(shu)后(hou)要執行的(de)(de)指令(ling)(ling)地(di)(di)址存(cun)儲在(zai)名為棧的(de)(de)主存(cun)內。函(han)(han)數(shu)(shu)處理(li)完畢后(hou),再通過(guo)函(han)(han)數(shu)(shu)的(de)(de)出(chu)口來執行 return 指令(ling)(ling)。return 指令(ling)(ling)的(de)(de)功能是把保(bao)存(cun)在(zai)棧中(zhong)的(de)(de)地(di)(di)址設(she)定到(dao)程(cheng)(cheng)序計(ji)數(shu)(shu)器。MyFun 函(han)(han)數(shu)(shu)在(zai)被調用(yong)之前(qian),0154 地(di)(di)址保(bao)存(cun)在(zai)棧中(zhong),MyFun 函(han)(han)數(shu)(shu)處理(li)完成后(hou),會把0154的(de)(de)地(di)(di)址保(bao)存(cun)在(zai)程(cheng)(cheng)序計(ji)數(shu)(shu)器中(zhong)。這個調用(yong)過(guo)程(cheng)(cheng)如(ru)下(xia)
函數調用中(zhong)程序(xu)計數器和棧的(de)職能
在一些(xie)高級語(yu)言的(de)條件(jian)或者循環語(yu)句(ju)中(zhong),函數調用(yong)的(de)處理會(hui)轉換成(cheng) call 指(zhi)令(ling),函數結束后的(de)處理則會(hui)轉換成(cheng) return 指(zhi)令(ling)。
通過地址和索引實現數組
接下(xia)來(lai)我們看一(yi)下(xia)基址(zhi)(zhi)寄(ji)(ji)(ji)存(cun)(cun)器(qi)(qi)和(he)變址(zhi)(zhi)寄(ji)(ji)(ji)存(cun)(cun)器(qi)(qi),通(tong)過(guo)這(zhe)兩個(ge)寄(ji)(ji)(ji)存(cun)(cun)器(qi)(qi),我們可以對(dui)主存(cun)(cun)上(shang)的(de)(de)特定區域(yu)進(jin)行(xing)劃分,來(lai)實現類(lei)似數(shu)組的(de)(de)操作,首先,我們用十六進(jin)制(zhi)數(shu)將計算機內存(cun)(cun)上(shang)的(de)(de) 00000000 - FFFFFFFF 的(de)(de)地(di)址(zhi)(zhi)劃分出(chu)來(lai)。那(nei)么,凡是該范圍(wei)的(de)(de)內存(cun)(cun)地(di)址(zhi)(zhi),只(zhi)要(yao)有一(yi)個(ge) 32 位的(de)(de)寄(ji)(ji)(ji)存(cun)(cun)器(qi)(qi),便可查看全(quan)部地(di)址(zhi)(zhi)。但如(ru)果想要(yao)想數(shu)組那(nei)樣分割(ge)特定的(de)(de)內存(cun)(cun)區域(yu)以達到(dao)連續查看的(de)(de)目的(de)(de)的(de)(de)話,使用兩個(ge)寄(ji)(ji)(ji)存(cun)(cun)器(qi)(qi)會更加方便。
例如,我們用兩個寄存(cun)器(qi)(基址寄存(cun)器(qi)和(he)變址寄存(cun)器(qi))來表示(shi)內存(cun)的值
基(ji)址寄(ji)存器(qi)和變址寄(ji)存器(qi)
這種表示(shi)方式很類似數(shu)(shu)(shu)組(zu)的(de)構造(zao),數(shu)(shu)(shu)組(zu)是指同樣長(chang)度(du)的(de)數(shu)(shu)(shu)據(ju)在(zai)內(nei)存(cun)中進行連續排列的(de)數(shu)(shu)(shu)據(ju)構造(zao)。用數(shu)(shu)(shu)組(zu)名表示(shi)數(shu)(shu)(shu)組(zu)全部的(de)值,通(tong)過索(suo)引來區分數(shu)(shu)(shu)組(zu)的(de)各(ge)個(ge)數(shu)(shu)(shu)據(ju)元素(su),例如(ru): a[0] - a[4],[]內(nei)的(de) 0 - 4 就是數(shu)(shu)(shu)組(zu)的(de)下標。
CPU 指令執行過程
那(nei)么 CPU 是如何(he)執(zhi)行一(yi)條條的指令的呢(ni)?
幾乎所有的(de)(de)馮·諾伊曼(man)型計算機的(de)(de)CPU,其工作都可以分為5個階段:取指(zhi)令(ling)(ling)、指(zhi)令(ling)(ling)譯碼、執(zhi)行指(zhi)令(ling)(ling)、訪(fang)存取數、結果寫(xie)回(hui)。
取(qu)指(zhi)(zhi)令階段是將內存(cun)中的(de)指(zhi)(zhi)令讀取(qu)到 CPU 中寄存(cun)器(qi)的(de)過程(cheng),程(cheng)序寄存(cun)器(qi)用于存(cun)儲下一條(tiao)指(zhi)(zhi)令所在(zai)的(de)地址
指(zhi)(zhi)令(ling)(ling)譯(yi)(yi)碼(ma)(ma)階(jie)段,在(zai)取指(zhi)(zhi)令(ling)(ling)完成后(hou),立馬(ma)進(jin)入指(zhi)(zhi)令(ling)(ling)譯(yi)(yi)碼(ma)(ma)階(jie)段,在(zai)指(zhi)(zhi)令(ling)(ling)譯(yi)(yi)碼(ma)(ma)階(jie)段,指(zhi)(zhi)令(ling)(ling)譯(yi)(yi)碼(ma)(ma)器按(an)照(zhao)預定(ding)的指(zhi)(zhi)令(ling)(ling)格式(shi),對取回(hui)的指(zhi)(zhi)令(ling)(ling)進(jin)行拆分(fen)和解釋(shi),識(shi)別(bie)區分(fen)出(chu)不同的指(zhi)(zhi)令(ling)(ling)類別(bie)以及各種(zhong)獲取操作數的方法。
執行指令階段(duan),譯碼(ma)完成后,就(jiu)需要執行這一條指令了,此階段(duan)的任務是完成指令所規定的各種操作(zuo),具體(ti)實現指令的功能。
訪問取數(shu)階(jie)段,根(gen)據指(zhi)令的需(xu)(xu)要(yao),有(you)可能(neng)需(xu)(xu)要(yao)從內(nei)存中(zhong)提取數(shu)據,此(ci)階(jie)段的任務是:根(gen)據指(zhi)令地址碼,得(de)到操(cao)作數(shu)在主(zhu)存中(zhong)的地址,并從主(zhu)存中(zhong)讀取該操(cao)作數(shu)用(yong)于運算。
結(jie)果寫(xie)(xie)(xie)回(hui)階段,作(zuo)為最后一個階段,結(jie)果寫(xie)(xie)(xie)回(hui)(Write Back,WB)階段把執行(xing)指令階段的運行(xing)結(jie)果數(shu)據(ju)“寫(xie)(xie)(xie)回(hui)”到某種存儲形(xing)式:結(jie)果數(shu)據(ju)經(jing)常被(bei)寫(xie)(xie)(xie)到CPU的內部寄存器中,以便被(bei)后續(xu)的指令快速地存取;
總結
本篇文(wen)章我們(men)主要講述了
CPU 是什么,CPU 的重(zhong)要性,CPU 執行程(cheng)序(xu)的過程(cheng)
還講述(shu)了 CPU 的內(nei)部結構(gou),它的組成部分
提到了匯編(bian)語(yu)言(yan)和高(gao)級語(yu)言(yan)
提到了CPU 與 寄存器的關系
提(ti)到了主要的(de)寄存(cun)器的(de)功(gong)能,程(cheng)序計數器,標志寄存(cun)器,基址(zhi)寄存(cun)器和變址(zhi)寄存(cun)器
還(huan)提到了函(han)數調(diao)用機制是(shi)怎樣的。
CPU 指令的執(zhi)行過(guo)程