天天看點

通過機器碼程式了解馮諾依曼體系

馮諾依曼體系結構

簡介

現今所有的商用計算機都是基于馮諾依曼體系的計算機。

馮·諾依曼體系結構馮·諾依曼理論的要點是:計算機的數制采用二進制;計算機應該按照程式順序執行。存儲程式原理,把程式本身當作資料來對待,程式和該程式處理的資料用同樣的方式儲存,二者地位是相等的。

通過機器碼程式了解 馮諾依曼 計算機

下面将通過基于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  ;結束指令           

程式結束。