序
大四即將畢業(yè)的一個(gè)清晨,無意中刷微信公眾號(hào)偶得一個(gè)關(guān)于計(jì)算機(jī)組成原理質(zhì)量很高的文章,細(xì)細(xì)讀罷,感覺這些知識(shí)都是以前老師在課堂上講過的,但是當(dāng)時(shí)覺得這些知識(shí)很是無聊(我一個(gè)學(xué)軟件的需要了解硬件做什么?),所以考完試就把這些知識(shí)還給老師和課本了。一年之后看來,這些知識(shí)很是受用,遂找同學(xué)借來《計(jì)算機(jī)組成原理》的課本重新拜讀(原諒我已經(jīng)把我的課本當(dāng)3塊錢賣了),總結(jié)如下:
馮·諾依曼結(jié)構(gòu)
1945年,數(shù)學(xué)家馮·諾依曼在研究EDVAC機(jī)時(shí)提出了“存儲(chǔ)程序”的概念。以此概念為基礎(chǔ)的的各類計(jì)算機(jī)統(tǒng)稱為馮·諾依曼計(jì)算機(jī)。他的特點(diǎn)可歸結(jié)如下:
- 計(jì)算機(jī)由輸入設(shè)備,存儲(chǔ)器,輸出設(shè)備,控制器和運(yùn)算器構(gòu)成。其中控制器還包含
指令寄存器(IR),指令譯碼器(ID)和操作控制器(OC)。 - 指令和數(shù)據(jù)以同等的地位放于存儲(chǔ)器內(nèi),并可按地址尋訪。
- 指令和數(shù)據(jù)均由二進(jìn)制數(shù)表示。
- 指令由操作碼和地址碼組成,操作碼用來表示操作的性質(zhì),地址碼用來表示操作數(shù)在存儲(chǔ)器中的位置。
- 指令在存儲(chǔ)器中按順序存放,通常情況下指令是按照順序執(zhí)行的;在特定的條件下,可根據(jù)運(yùn)算結(jié)果或根據(jù)設(shè)定的條件改變執(zhí)行的順序。

整個(gè)計(jì)算機(jī)工作的流程按照如下步驟來進(jìn)行:
- 輸入設(shè)備將數(shù)據(jù)和程序輸入到存儲(chǔ)器中,比如將硬盤中的程序加載到內(nèi)存中就屬于這個(gè)過程,但是這個(gè)程序并不是我們平時(shí)編寫的Java之類的代碼,而是經(jīng)過機(jī)器編譯之后的程序,經(jīng)過編譯之后的程序分為指令和數(shù)據(jù)兩部分。
- 當(dāng)程序到達(dá)內(nèi)存中之后,
指令寄存器的指針就指向要執(zhí)行指令的地址,控制器根據(jù)指令的地址在內(nèi)存中尋址后將指令裝載到指令寄存器中,整個(gè)過程可以看做指令寄存器永遠(yuǎn)保存著下一個(gè)要執(zhí)行的指令。 -
指令寄存器位于CPU的內(nèi)部,本質(zhì)上是一個(gè)存儲(chǔ)設(shè)備,當(dāng)指令從內(nèi)存轉(zhuǎn)移到CPU內(nèi)部之后還需要經(jīng)過譯碼器解碼得到操作碼是什么,操作數(shù)在哪。 - 之后交由運(yùn)算器根據(jù)操作碼和操作數(shù)進(jìn)行算術(shù)運(yùn)算(加減乘除),邏輯運(yùn)算(比較,位移)。
- 運(yùn)算完畢之后通過輸出設(shè)備轉(zhuǎn)換為人們熟悉的信息形式,如打印輸出和顯示器輸出等。
主存儲(chǔ)器
主存儲(chǔ)器簡(jiǎn)稱內(nèi)存,主存。存儲(chǔ)體由許多存儲(chǔ)單元構(gòu)成,每個(gè)存儲(chǔ)單元又包含許多存儲(chǔ)元件,每個(gè)存儲(chǔ)元件都能寄存一位二進(jìn)制代碼“0”或“1”??梢?,一個(gè)存儲(chǔ)單元存儲(chǔ)著一串二進(jìn)制代碼,稱這串二進(jìn)制代碼為一個(gè)存儲(chǔ)字長(zhǎng)。存儲(chǔ)字長(zhǎng)可以為8位,16位或32位等。
一個(gè)存儲(chǔ)字可代表一個(gè)二進(jìn)制數(shù),也可代表一串字符,如存儲(chǔ)字0011011001111101,既可以表示由十六進(jìn)制字符組成的367DH,又可代表16位的二進(jìn)制數(shù),此值對(duì)應(yīng)十進(jìn)制數(shù)13949。
指令和數(shù)據(jù)都存放在內(nèi)存中,通過存儲(chǔ)單元地址號(hào)來反應(yīng),因此取一條指令和取一個(gè)數(shù)據(jù)的操作完全可以視為是相同的操作,可以用一套控制體系來完成兩個(gè)截然不同的操作。
為了能夠?qū)崿F(xiàn)按地址訪問的方式,主存中必須配備兩個(gè)寄存器MAR和MDR。
MAR(Memory Address Rigister)是存儲(chǔ)器地址寄存器,用來存放欲訪問存儲(chǔ)單元的地址。為了能夠表示任意個(gè)一個(gè)存放單元的地址,MAR的位數(shù)就是存放單元的個(gè)數(shù)(如MAR有10位,那么存儲(chǔ)單元就有2^10個(gè),如果一個(gè)存儲(chǔ)字長(zhǎng)為8位,那么該內(nèi)存就有1K大?。?。
MDR(Memory Data Rigister)是存儲(chǔ)器數(shù)據(jù)寄存器,用來存放從存儲(chǔ)單元取出來的數(shù)據(jù)或者正準(zhǔn)備送往存儲(chǔ)單元的數(shù)據(jù)(分別對(duì)應(yīng)讀和寫操作),其位數(shù)與存儲(chǔ)字長(zhǎng)相等。
隨著硬件技術(shù)的發(fā)展,現(xiàn)如今MAR和MDR都已經(jīng)集成到CPU中。如下圖所示:

當(dāng)要從存儲(chǔ)器中讀取某一信息字時(shí),首先由CPU將該字的地址送至MAR,再由地址總線送至主存中,然后發(fā)出讀命令。主存接受到讀命令后根據(jù)地址將該存儲(chǔ)單元的內(nèi)容讀出,并經(jīng)過數(shù)據(jù)總線將內(nèi)容送至MDR中,至于讀出的內(nèi)容經(jīng)過MDR送至什么地方將有CPU來決定。
當(dāng)要往存儲(chǔ)器中寫內(nèi)容時(shí),首先由CPU將要寫內(nèi)容的地址經(jīng)過MAR送到地址總線,并將寫的內(nèi)容送到MDR,在CPU發(fā)出寫的命令時(shí),主存根據(jù)地址總線上的信息把數(shù)據(jù)總線上的信息寫入到對(duì)應(yīng)的存儲(chǔ)單元中。
高級(jí)語言編譯過程
高級(jí)語言我們以Java程序?yàn)槔?,從程序員編寫的Java代碼到CPU可以執(zhí)行的指令需要經(jīng)歷如下步驟:
