馮諾依曼體系結構
簡介
現今所有的商用計算機都是基于馮諾依曼體系的計算機。
馮·諾依曼體系結構馮·諾依曼理論的要點是:計算機的數制采用二進制;計算機應該按照程式順序執行。存儲程式原理,把程式本身當作資料來對待,程式和該程式處理的資料用同樣的方式儲存,二者地位是相等的。
通過機器碼程式了解 馮諾依曼 計算機
下面将通過基于Pep8虛拟計算機運作的機器碼程式了解馮諾依曼計算機。(Pep8是用于教學的開源小型計算機,可以執行機器碼和彙程式設計式 下載下傳連結
http://computersystemsbook.com/5th-edition/pep9/)
首先介紹 馮諾依曼周期
一個馮諾依曼周期包含 5 個操作:
- 取指
- 譯碼
- 增加PC(程式計數器)
- 執行指令
-
重複
如圖:
加載機器語言到記憶體 初始化寄存器(PC,SP,IR等) do { 取下一條指令 解碼 指令訓示符 遞增PC 執行取出的指令 } while(沒有執行停止指令)
指令和寄存器
每種計算機都有自己的指令集,固化在cpu中。Pep8有39條指令,這些指令分為兩類,由一個位元組(8位二進制)組成的 指令訓示符,或者由一個 指令訓示符 和一個由一個字(兩個位元組)組成的 操作數訓示符 組成。
Pep8中包含不限于PC(程式指令計數器),SP(棧指針計數器),IR(24位指令寄存器(3位元組))等寄存器。
将要用到的指令:
0000 0000 停止執行
0100 1aaa 字元輸入
0101 0aaa 字元輸出
注(aaa表示一個字段,a可為0或1,表示尋址方式)
一個字元輸出程式
位址 機器語言(bin)
---- -------
0000 0101 0001 0000 0000 0000 0111
0003 0101 0001 0000 0000 0000 1000
0006 0000 0000
0007 0100 1000
0008 0110 1001
位址 機器語言(hex)
---- --------
0000 510007
0003 510008
0006 00
0007 48
0008 69
輸出
----
Hi
這兩段代碼是等價的,隻不過是前者更利于計算機識别和讀取,後者利于人類,但是計算機最終是要儲存二進制的序列,而非其他任何形式的結果。(注:位址為了便于表示使用四位十六進制數表示)
分析程式
首先将上面代碼輸入Pep8虛拟機後,首先要做的是,裝載。即将每條指令(每行右側序列)裝載到左側序列辨別的位址。如果裝載的指令是一進制指令即 指令訓示符 ,那麼他占據一個記憶體單元即一個位元組。如果指令是一個二進制指令也即 操作數訓示符 那麼他占據三個記憶體單元,是以第一條指令被裝載到 0000、0001、 0002 所辨別的記憶體。
當所有的指令裝載完成後,也就意味着一個程式在記憶體中,并處于可執行狀态。注意一點,這個程式的指令在記憶體中是逐條緊鄰的。
執行程式
根據 馮諾依曼周期,程式是順序執行的,是以初始化程式指令計數器PC,
PC: 0000
CPU根據PC的值作為記憶體位址索引,找到該記憶體并将該記憶體的值(二進制序列)複制,通過總線傳輸到CPU的指令寄存器IR中,
IR:Mem[PC] // 類比 數組索引值 a[i];
此時CPU解釋IR中的指令,指令:0101 0001 0000 0000 0000 0111
我們來解釋一下這個指令,首先這是一個二進制指令,是以前一個位元組是指令訓示符,後兩個位元組是操作數訓示符。第一個位元組 0101 0001 (原指令模式 0101 0aaa)代表以直接尋址的方式輸出字元,後兩個位元組訓示要輸出的字元的位址,可以看出,這塊位址就是之前我們裝載程式時 0007 這塊記憶體,而記憶體中的值正是 ‘H’ 的ASCII碼值 48 。到此我們可以看出,其實 程式 和 程式的資料 對于計算機來說沒有差別,都是儲存在記憶體中的二進制數,計算機隻單純的将他們作為二進制數處理,而是作為 指令 被解釋還是作為 資料 被解釋是需要我們來定義。
接下來繼續程式的執行,當擷取到 操作數訓示符 辨別記憶體中的值後,将這個值發送到輸出裝置,此時由輸出裝置負責将該二進制數解釋為字元。
下一步,根據取出指令的長度進行PC的自增。重複上述過程,直到
PC:0006
索引值為指令
0000 0000 ;結束指令
程式結束。