指令集架構如何檢查操作的結果?
條件分支指令主要用於兩種情況。最常見的是用來檢查指令結果是否滿足指定條件,例如結果是否等於 0,是否為負數等等。
如果滿足指定的條件,則控制權轉移到程式中的指定位置。另一種常見的情況是比較兩個運算元,例如詢問它們是否相等,然後如果滿足指定的條件則跳轉到指定位置。
指令集架構 (ISA) 檢查操作結果有兩種基本方法,分別是結果狀態概念和直接檢查概念。
結果狀態概念
結果狀態概念假設在相關的 ISA 中聲明瞭一個結果狀態。它以條件碼或標誌的形式表示。結果狀態儲存有關操作結果的相關資訊,例如結果是否 = 0,< 0 等等。在這個概念中,操作的結果在指令執行期間會自動針對特定條件(如 = 0,< 0 等)進行檢查。
例如,如果加法運算的結果隨後在除法中用作除數,則可以如下檢查算術運算的結果:
add r1, r2, r3; // r1←(r2)+(r3)
beq zero; // 測試結果是否等於零,如果是則跳轉到位置 'zero'
div r5, r4, r1; // r5←(r4)/(r1) …….
zero: // 處理除數等於零的情況
此外,架構還必須提供一些特定的指令來檢查任何已生成的運算數值的相關條件,並相應地設定結果狀態。
直接檢查概念
直接檢查概念是檢查操作結果的另一種基本替代方案。在這種情況下,沒有宣告結果狀態。相反,如果需要,可以使用專用指令直接檢查操作結果是否滿足指定條件。如果滿足指定條件,則啟動條件分支。
當透過兩個單獨的指令實現直接檢查時,首先透過適當的比較指令檢查結果值。此指令將檢查結果寫入選定的暫存器。條件分支指令用於測試儲存的測試結果,並在滿足指定條件時跳轉到給定區域,如下例所示:
add r1, r2, r3; cmpeq r7, r1; // r7←true,if (r1)=0,else NOP bt r7, zero; // branch to ‘zero’: if (r7) = true, else NOP div r5, r4, r1; …….. zero:
在此示例中,cmpeq(比較是否相等)指令測試暫存器 r1 的內容是否為零,如果 (r1) = 0,則將布林值 'true' 設定到暫存器 r7 中。隨後的 bt(如果為真則跳轉)指令查詢暫存器 r7 中儲存的布林值,如果儲存的值為 'true',則啟動到標籤 'zero' 的跳轉。
資料結構
網路
關係資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP