基本介紹
- 中文名:β計算機
- 體系結構:32位體系結構
- 暫存器的寬度:均為32位
- 整數操作:在暫存器之間進行
指令編碼,異常,異常處理的擴充,XP暫存器,管理模式,Beta指令集(模型),
指令編碼
每條β指令的長度均為32位。所有整數操作均在暫存器之間進行,最多可以帶兩個源運算元(其中一個可能是一個符號擴展後的16位直接量)以及一個目的暫存器,可以通過不執行任何計算的裝載和存儲指令來訪問存儲器。條件轉移指令與比較指令的不同之處在於:條件指令會測試某個暫存器的值,而該值很可能是前一條比較指令的結果。
只有兩種指令編碼類型:不帶直接量的和帶直接量的。不帶直接量的指令包括兩個暫存器之間的算術運算指令和邏輯運算指令(將其結果放置在第三個暫存器中)。帶直接量的指令包括其他所有運算指令。與β計算機上的所有有符號數一樣,指令的直接量都被表示成二進制補碼形式。
異常
異常處理的擴充
為了支持異常指令和特權指令, 需要對上述標準的β計算機體系結構進行以下修改。
β異常表現為三種形式:陷阱、故障和中斷。
故障不是故意的,通常意味著產生了錯誤的條件。
XP暫存器
暫存器30被專門用作“異常指針”(XP)暫存器。當異常產生時,將更新的PC值寫入到XP中。就陷阱和故障而言,是指緊隨在造成故障的指令之後的那條指令的PC值;就中斷而言,是指緊隨在中斷髮生時準備執行的指令之後的那條指令的PC值。而由XP-4指向的那條指令還沒有執行。由於XP被當做中斷結果進行重寫的次數很可能是不可預知的,所以在允許中斷時,它不能被用戶模式程式使用。
管理模式
PC的高位被專門用作“管理”位。指令提取和LDR指令忽略該管理位,將它當作零看待。允許JMP指令清除管理位,但不能對它進行設定,並且其他任何指令都不可能對它產生任何影響。只有因管理位造成的異常才適合對它進行設定。在對管理位進行清除時,處理器被認為處於“用戶模式”。而在用戶模式下,中斷是允許的。
在對管理位進行設定時,處理器被認為處於“管理模式”。而在管理模式下,中斷是禁用的,並且很可能會使用特權指令(參見以下所述內容)。陷阱和故障在管理模式下都具有定義好的實現效果(很可能是致命的)。
由於JMP指令能夠清除管理位,所以很可能將某個新值裝載到PC中,並且通過採取某個原子動作就可以進入到用戶模式。這樣,就為從陷阱返回到作業系統提供了某種安全機制,特別是在中斷處於掛起狀態時更是如此。
Beta指令集(模型)
Opcode|5|5|5|11|
10****|Rc|Ra|Rb|unused
操作類別: Reg[Rc] ← Reg[Ra] op Reg[Rb]
11****|Rc|Ra|literal C(signed)
操作類別: Reg[Rc] ← Reg[Ra] op SXT(C)
兩種格式共享的操作碼(OPCODE):
ADD SUB MUL* DⅣ* *optional
CMPEQ CMPLE CMPLT
AND OR XOR
SHL SHR SRA
以操作碼區分的指令類別:
OP
OPC
MEM
TC(控制轉移)
指令合併達成方法: 累進功能法
每個指令是由一個簡單的功能組件成來達成的. 我們將試著實現各個指令類別的數據路徑,然後再將它們合併(使用解多任務器等).
步驟:
⒈操作類指令
⒉存取類指令
⒊跳躍與分流類指令
⒋例外
⒌合併數據路徑
快取器檔案之時序
兩組組合邏輯式讀取連線埠,一組時脈控制式寫入埠
如果 (舉例來說) WA=RA1,將會怎樣?
RD1 會讀取 “舊的” Reg[RA1] 之值,一直到下一個時脈邊緣為止.
起始點: ALU 操作
32-位 (4-位元組) ADD 指令:
100000|00100|00010|00011|00000000000|
opcode Rc Ra Rb unused
對BETA而言,表示Reg[R4] ← Reg[R2] + Reg[R3]
首先,硬體必需能夠:
⒈讀取下一個32-bit指令
⒉指令解碼(DECODE): ADD,SUB,XOR,等等
⒊從快取器檔案進行讀取 (READ) (Ra,Rb) 之操作;
⒋執行(PERFORM)指定的操作;
⒌將結果寫回(WRITE)快取器檔案(Rc).
指令取得/解碼
使用計數器來取得(FETCH)下一個指令:
程式計數器 (PC)
⒈使用 PC來當作記憶體地址
⒉加4到PC,然後在單位時脈(MHz)結束時載入新的值
⒊從記憶體取得指令
⒋直接使用某些指令欄位 (快取器編號,16-位之常數)
⒌使用 <31:26>;位來產生控制訊號
ALU 操作之數據路徑
OP: Reg[Rc] ← Reg[Ra] op Reg[Rb]
ALU 操作 (常數存在時)
OPC: Reg[Rc] ← Reg[Ra] op SXT(C)
“儲存”指令
ST: Mem[Reg[Ra]+SXT(C)] ← Reg[Rc]
“載入”指令
LD: Reg[Rc] ← Mem[Reg[Ra]+SXT(C)]
JMP指令
JMP: Reg[Rc] ← PC+4; PC ← Reg[Ra]
BEQ/BNE(當相等/不等時,則JMP(跳躍)) 指令
BEQ: Reg[Rc] ← PC+4; if Reg[Ra]=0 then PC ← PC+4+4*SXT(C)
BNE: Reg[Rc] ← PC+4; if Reg[Ra]≠0 then PC ← PC+4+4*SXT(C)
對以上進行一下歸納:
01****|Rc|Ra|literal C(signed)
LD:Reg[Rc]←Mem[Reg[Ra]+SXT(C)]
ST:Mem[Reg[Ra]+SXT(C)]←Reg[Rc]
JMP:Reg[Rc]←PC+4;PC←Reg[Ra]
BEQ:Reg[Rc]←PC+4;If Reg[Ra]-0 then PC←PC+4+4*SXT(C)
BNE:Reg[Rc]←PC+4;If Reg[Ra]-0 then PC←PC+4+4*SXT(C)
LDR:Reg[Rc]←Mem[PC+4+4*SXT(C)]
“載入相對地址”指令
LDR: Reg[Rc] ← Mem[PC + 4+ 4*SXT(C)]
“載入相對地址”指令有什麼好處呢?
我認為程式代碼是單純的,舉例來說,它們是唯讀的,並且存在一個”程式”記憶體區;
但數據是可讀/寫的,而使用以下方法之一來儲存
存在STACK中(其實是內部); 或在某些外部變數中; 或存在一個外部的儲存堆疊(HEAP).
所以,為什麼一個指令要設計成可以載入”靠近”這個指令的數據呢?
就是當數據是 ”地址”及”其它較大的常數”時。
“載入相對地址”(LDR)指令
LDR: Reg[Rc] ← Mem[PC + 4 + 4*SXT(C)]
例外處理
計畫:
⒈中斷正在執行的程式
⒉呼叫例外處理 (就好象一個過程調用)
⒊返回並繼續執行.
我們希望有可修復的中斷以達成:
⒈由CPU或系統產生的同步化事件錯誤 (例如,不合法的指令,除數為0,不合法的記憶體地址)
捕捉及系統呼叫 (例如,從外圍讀取一個字元)
⒉由I/O所產生的異步化事件(例如,鍵盤鍵入,收到封包,磁碟傳輸完成)
關鍵: 對於被中斷程式的透明度.
這對異步化中斷是最難的
執行方法
例外運作:
⒈不要執行現在的指令
⒉取而代之的,假裝有一個”強制”的過程調用
⒊儲存現在的程式計數(PC) (事實上是現在的 PC + 4)
⒋用例外向量載入PC
⒌同步化例外是0x4,異步化例外是0x8
然後問題來了,咱是要把現在的PC + 4存到哪呢?
我的方法: 保留一個快取器 (R30,也稱XP)然後禁止使用者程式使用該快取。