一、指令周期
1. 定義與組成
- 定義:CPU取出并執行一條指令所需的全部時間,稱為指令周期。
- 子周期劃分:
- 取指周期(必選):從存儲器取指令到指令寄存器(IR)。
- 間址周期(可選):處理間接尋址,獲取操作數的真實地址。
- 執行周期(必選):執行指令規定的操作。
- 中斷周期(可選):處理中斷請求。
- 特性:
- 不同指令的周期長度不同。
- 取指和執行周期必然存在,間址和中斷周期視情況觸發。
- 每個子周期由多個時鐘周期構成(時鐘周期是CPU最小時間單位)。
2. 機器周期
- 定義:人為設計的時間單位,通常等于一次訪存時間(當指令字長=存儲字長時,機器周期=取指周期)。
- 與存儲字長關系:反映存取一個存儲單元的時間。
- 實際應用:
- 指令字長為存儲字長的倍數時,取指周期需多個機器周期(例:指令占2個存儲單元 → 取指需2個機器周期)。
- 間址、執行、中斷周期的機器周期數因指令而異。
- 判斷流程:
- 間址周期:僅在間接尋址時觸發(Y/N)。
- 中斷周期:僅在檢測到中斷請求時觸發(Y/N)。
二、指令執行過程
1. 取指令
- 核心機制:程序計數器(PC)指向下條指令地址,通過訪存將指令送入指令寄存器(IR)。
- 細節:
- 可能經過內存數據寄存器(MDR)中轉或直接進入IR。
- 例:PC=103,從主存地址103取指令。
- PC自增:取指后,PC自動增加,增量由指令字長和編址方式決定。
2. 譯碼
- 操作:對IR中的操作碼進行譯碼,生成對應控制信號。
- 示例(ADD指令,隱含尋址):
- 一個操作數地址由指令給出(如104)。
- 另一個操作數隱含在累加器(ACC)中。
3. 源操作數地址計算并取操作數
- 尋址處理:
- 根據尋址方式計算有效地址。
- 存儲器數據可能需多次訪存。
- 示例(隱含尋址):
- 從指令解析地址104,讀取104處數據到寄存器。
- 另一操作數直接從ACC獲取。
4. 執行數據操作
- 過程:
- 操作數送入ALU執行運算(如加法)。
- 結果暫存于ALU輸出端寄存器。
- 注意:復雜指令的執行周期較長。
5. 目的操作數地址計算并存結果
- 存儲方式:
- 寄存器數據:直接寫入目標寄存器。
- 存儲器數據:需計算目的地址并訪存。
- 特殊情形:目的地址可能需額外計算(如基址尋址)。
三、指令周期的數據流
1. 取指周期數據流
- 流程:
- PC → MAR:將PC中的指令地址送入內存地址寄存器(MAR)。
- 發出讀命令:控制單元通過控制總線向存儲器發出讀信號,MAR地址通過地址總線傳至存儲器。
- 讀取指令:存儲器將指令讀出,經數據總線傳至MDR。
- 指令存入IR:MDR中的指令代碼送入IR。
- PC自增:PC值增加,增量由指令字長決定。
- 關鍵序列:PC → MAR → 主存 → MDR → IR,PC++。
2. 間址周期數據流
- 作用:解決間接尋址時無法直接獲取操作數地址的問題。
- 流程:
- 根據IR中地址碼確定操作數有效地址。
- 有效地址送入MAR。
- 發出讀命令,MAR指示的內存單元數據讀入MDR。
- 特點:讀取操作數本身,而非指令。
3. 執行周期數據流
- 特點:因指令類型不同,操作差異大,無統一數據流模板。
- 操作類型:包括算術邏輯運算、數據傳送、控制轉移等。
4. 中斷周期數據流(正常執行一個指令,中斷程序)
- 流程:
- 堆棧指針(SP)調整:SP減一(棧從高地址向低地址生長)。
- 棧地址傳送:SP值送入MAR。
- 斷點寫入準備:發出寫命令。
- 數據入棧:PC值(斷點地址)寫入棧。
- 中斷服務程序跳轉:將中斷向量地址送入PC。
- 調整堆棧指針:堆棧指針(SP)值減1,為保存斷點地址騰出棧空間。因為堆棧從高地址向低地址生長,SP減小指向新的棧頂。
- 傳送棧地址:將調整后的SP值送入內存地址寄存器(MAR),MAR存儲將要寫入斷點地址的棧頂地址。
- 發出寫命令:控制單元通過控制總線向主存發出寫命令,同時將MAR中的棧頂地址通過地址總線傳送到主存,準備寫入數據。
- 保存斷點地址:將程序計數器(PC)中的當前程序地址(斷點)通過數據總線寫入主存的棧頂地址(MAR指定的位置),完成PC值壓棧。
- 加載中斷向量地址:將中斷服務程序的入口地址(中斷向量地址,通常由中斷控制器提供)送入PC,更新PC值,準備跳轉到中斷服務程序。
- SP本質:邏輯寄存器,通過存儲地址值實現指向。
為什么需要將斷點地址設置為新的棧頂(SP減1)?
- 數據覆蓋風險:原SP地址可能已有數據,直接寫入會破壞棧結構。
- 違反棧操作規則:壓棧要求SP先減1再寫入,這是堆棧設計的標準邏輯。
- 影響后續操作:直接寫入原SP地址會導致棧頂指針混亂,后續壓棧或出棧操作可能出錯。
- 中斷返回錯誤:如果PC值未正確保存到新的棧頂,返回時可能跳轉到錯誤的地址,導致程序崩潰。
問題解答:中斷服務程序執行完后,SP會+1并繼續執行未執行的程序嗎?
答案:是的,執行完中斷服務程序后,CPU會通過出棧操作將堆棧指針(SP)加1,從棧中恢復中斷前的PC值,并繼續執行未完成的主程序。以下是具體流程和原因。