2.5 計算機執行指令的過程
計算機組成
2 計算機基本結構
2.5 計算機執行指令的過程
執行指令是計算機過程的核心,理解了指令如何執行,也就把握住了計算機運行原理的關鍵。在這一節,我們就一起來看這個模型機是如何執行指令的。
現在我們已經有了這樣一個模型。
而且我們也知道了計算機執行一條指令的主要步驟,包括取指、譯碼、執行、回寫。
那我們就想在這個模型機上嘗試執行一條計算機的指令。這裏給出了一個例子,我們想執行的這條指令是ADD R0, [6],這樣的一個指令格式代表什麽含義呢?從ADD,我應該能看出來這是一條加法指令。那麽這個加法應該有兩個原操作數,其中一個就是通用寄存器R0的內容;另一個[6],中括號就代表是存儲單元的內容。那麽,中括號裏面帶一個6說明是地址為6的存儲單元的內容。我們把這兩個原操作數相加,就可以得到一個運算結果。那麽,在我們這種格式指令當中,默認第一個操作數即是原操作數又是目的操作的。這個運算結果就會更新到通用寄存器R0中。現在我們就來看這條指令是如何在模型機上執行的。
假設模型機的當前狀態已經有了一些初始值。我們需要註意的是CPU中的R0所保存的值是0000 0011,這等於10進制的3。而存儲單元地址為 6(0110) 的存儲單元的內容是 0000 0010,相當於10進制的2。那麽我們所要做的,就是把這個存儲單元地址為6中的數2和R0當中的數3相加,最後再放到R0中。我們還看到 PC 寄存器也就是指向下一條指令地址的寄存器,保存的值是 0001,那麽,他所指向的內層單元的地址是 0001,所以這個內存單元中其實是保存了當前所需要執行的那條指令,我就用 1010 1010 這麽一個值來指代,這僅僅是指代而已,那我們就來看在這個模型機上是如何運行的。
指令執行的第一步,取指。取指這一步所要做的是控制器將指令的地址送往存儲器,存儲器按給定的地址讀出指令內容,送回控制器。那我們來看具體的操作步驟。
首先請註意控制器會發出控制信號將PC寄存器中的內容通過內部總線傳送到MAR中。好,現在MAR寄存器中也保存了0001。
下一步,MAR將會把這個地址送到地址總線上,與此同時,控制電路會在控制總線上發出相應的控制信號,代表這次訪問存儲器的操作是要讀數據。
這樣存儲器的MAR寄存器就會收到地址總線上傳送來的地址並把它保存下來。存儲器中的控制邏輯,也會受到控制總線中傳送來的控制信號,得知這次仿真操作是一次讀操作。
這樣存儲器通過地址譯碼器就可以查找到對應地址0001的存儲單元的內容,並將該存儲單元的內容送到MDR寄存器中。
然後存儲器的控制邏輯,會通過控制總線向CPU反饋當前的傳輸已經準備好了,同時,MDR之中的內容也會送數據總線上。隨後,CPU中的控制電路檢測到來自控制總線的準備好的ready信號,就知道當前數據總線上已經準備好了數據。
因此,MDR寄存器就會將當前數據總線上傳送來的數值保存下來,這就獲得了我們所要取的指令。當然,僅到如此是不夠的。
MDR中的內容還必需要傳送到指令寄存器中,也就是IR寄存器。當指令的編碼已經保存到IR寄存器中時,取指這部分工作就已經完成了。真的已經完成了嗎?請再仔細想一想。
其實我們還需要再做一件事,就是把PC寄存器更新為下一條指令所需要訪問的地址。剛才是0001,現在變成0010,也就是10進制的2。更新完以後我們才可以做下一步的工作。那麽,取指階段到此正式完成。
第二步是譯碼。這一步控制器會分析指令的操作性質,並向相關的部件發出指令所需的控制信號。
當前的指令計算器IR中指令編碼會送到指令譯碼部件。
指令譯碼部件根據指令編碼,很快會發現這是一條加法指令。而且,是要把R0和存儲器中地址為6的單元的內容相加,並把結果存放到R0中。然後,控制電路就據此產生對應的控制信號,並發到相關部件中。這樣譯碼階段就到此完成了。
第三步是執行。控制器會從通用寄存器或者存儲器中取出操作數,並命令運算器對操作數進行指令規定的運算。
首先,根據這條指令我們會發現,還需要去取操作數,其中一個操作數在存儲器裏中。因此,這一步會在MAR中放置要訪問的存儲器的地址 0110,就是10進制的6。
那麽,隨後的過程類似於取指階段的操作。MAR將地址 0110 發到地址總線。同時,控制電路在控制總線發出讀操作的控制信號,存儲器的MAR控制邏輯會接收到相應的信號,然後查找到對應的地址,這次要查找的地址是0110,對應的內容 0000 0010 會送到MDR這個寄存器。然後,控制邏輯會向CPU反饋當前數據已經準備好了的信號。然後,MDR的內容也會被放置到數據總線上,CPU會接收數據並保存在MDR寄存器中。
因為這個數據要進行加法運算,所以控制器會進一步將MDR中的數據傳送到ALU的輸入,目前會暫存到Y寄存器中,這一個操作數現在就準備好了。那麽另一個操作數是放在R0中,因此,控制器還會將R0中的數據傳送到ALU的另一個輸入端,也就是x寄存器。
現在,兩個操作數都準備好了。在控制電路的控制下ALU就會進行運算,將X、Y中的內容執行加法並計算出結果。結果就是 0000 0101 也就是10進制的5。到此,執行階段就完成了。
第四步是回寫。也就是將運算結果寫入到通用寄存器或者儲存器。
現在,運算結果還在ALU的輸出端,也就是Z寄存器中。控制電路會給出相應的控制信號,將Z寄存器當中的內容傳送到R0中。R0目前的內容是之前的原操作數,也就是 0000 0011。隨後會被新的結果(Z寄存器中的內容)所覆蓋。
這樣,我們這個加法運算的結果就已經保存到了R0寄存器中。回寫階段到此完成。這條指令你就執行完畢了。
然後,CPU就會自動執行下一條指令,和剛才一樣,先將PC中的內容傳送到MAR寄存器當中,然後MAR會將這個地址傳送到地址總線上,依次的執行下一條指令。
現在,我們通過學習計算機是如何執行指令,已經掌握了馮·諾伊曼結構的核心內容。但是,人們是如何向計算機下達指令的呢?計算機的運行結果又是如何讓外界得知?這是我們下一節將關註的內容。
2.5 計算機執行指令的過程