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

整個(gè)計(jì)算機(jī)工作的流程按照如下步驟來(lái)進(jìn)行:
- 輸入設(shè)備將數(shù)據(jù)和程序輸入到存儲(chǔ)器中,比如將硬盤(pán)中的程序加載到內(nèi)存中就屬于這個(gè)過(guò)程,但是這個(gè)程序并不是我們平時(shí)編寫(xiě)的Java之類(lèi)的代碼,而是經(jīng)過(guò)機(jī)器編譯之后的程序,經(jīng)過(guò)編譯之后的程序分為指令和數(shù)據(jù)兩部分。
- 當(dāng)程序到達(dá)內(nèi)存中之后,
指令寄存器的指針就指向要執(zhí)行指令的地址,控制器根據(jù)指令的地址在內(nèi)存中尋址后將指令裝載到指令寄存器中,整個(gè)過(guò)程可以看做指令寄存器永遠(yuǎn)保存著下一個(gè)要執(zhí)行的指令。 -
指令寄存器位于CPU的內(nèi)部,本質(zhì)上是一個(gè)存儲(chǔ)設(shè)備,當(dāng)指令從內(nèi)存轉(zhuǎn)移到CPU內(nèi)部之后還需要經(jīng)過(guò)譯碼器解碼得到操作碼是什么,操作數(shù)在哪。 - 之后交由運(yùn)算器根據(jù)操作碼和操作數(shù)進(jìn)行算術(shù)運(yùn)算(加減乘除),邏輯運(yùn)算(比較,位移)。
- 運(yùn)算完畢之后通過(guò)輸出設(shè)備轉(zhuǎn)換為人們熟悉的信息形式,如打印輸出和顯示器輸出等。
主存儲(chǔ)器
主存儲(chǔ)器簡(jiǎn)稱(chēng)內(nèi)存,主存。存儲(chǔ)體由許多存儲(chǔ)單元構(gòu)成,每個(gè)存儲(chǔ)單元又包含許多存儲(chǔ)元件,每個(gè)存儲(chǔ)元件都能寄存一位二進(jìn)制代碼“0”或“1”??梢?jiàn),一個(gè)存儲(chǔ)單元存儲(chǔ)著一串二進(jìn)制代碼,稱(chēng)這串二進(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)存中,通過(guò)存儲(chǔ)單元地址號(hào)來(lái)反應(yīng),因此取一條指令和取一個(gè)數(shù)據(jù)的操作完全可以視為是相同的操作,可以用一套控制體系來(lái)完成兩個(gè)截然不同的操作。
為了能夠?qū)崿F(xiàn)按地址訪問(wèn)的方式,主存中必須配備兩個(gè)寄存器MAR和MDR。
MAR(Memory Address Rigister)是存儲(chǔ)器地址寄存器,用來(lái)存放欲訪問(wèn)存儲(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ù)寄存器,用來(lái)存放從存儲(chǔ)單元取出來(lái)的數(shù)據(jù)或者正準(zhǔn)備送往存儲(chǔ)單元的數(shù)據(jù)(分別對(duì)應(yīng)讀和寫(xiě)操作),其位數(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)過(guò)數(shù)據(jù)總線將內(nèi)容送至MDR中,至于讀出的內(nèi)容經(jīng)過(guò)MDR送至什么地方將有CPU來(lái)決定。
當(dāng)要往存儲(chǔ)器中寫(xiě)內(nèi)容時(shí),首先由CPU將要寫(xiě)內(nèi)容的地址經(jīng)過(guò)MAR送到地址總線,并將寫(xiě)的內(nèi)容送到MDR,在CPU發(fā)出寫(xiě)的命令時(shí),主存根據(jù)地址總線上的信息把數(shù)據(jù)總線上的信息寫(xiě)入到對(duì)應(yīng)的存儲(chǔ)單元中。
高級(jí)語(yǔ)言編譯過(guò)程
高級(jí)語(yǔ)言我們以Java程序?yàn)槔?,從程序員編寫(xiě)的Java代碼到CPU可以執(zhí)行的指令需要經(jīng)歷如下步驟:
