設計一個簡易的處理器(1)--定義指令集體系結構(ISA)
處理器的主要作用就是執行指令,那麼設計處理器的第一步就是要定義或者相容指令集體系結構(Instruction Set Architecture,ISA). 定義一個指令集體系結構,包括定義各種狀態元素,指令集及編碼,一組程式設計規範和異常事件處理.
傳統的指令集的設計理念主要分為CISC和RISC兩種設計理念.現代處理器比如IA32體系結構的指令集,已經不是單純的CISC,設計時候已經結合了RISC的精華.
本文介紹的Y86 ISA是IA32的一個簡化版本(子集),操作集較少,定址方式較少. (注*)
程式設計師的可見的狀態
————
Y86的每條指令都會讀取或修改處理器狀態的某些部分
1.程式暫存器(Program registers): %eax, %ecx, %edx, %ebx, %esi,%edi, %esp和%ebp.都是32位的.
2.條件碼(Condition codes): ZF(零標誌), SF(符號標誌), OF(溢位標誌).用來儲存最近的算術或邏輯指令造成的影響.
3.程式計數器(PC):存放當前正在執行的地址.
4.儲存器(Memory):在程式設計師看來, Y86程式使用虛擬儲存器.
5.狀態碼(State):表明程式執行的總體狀態,它指示正常執行,或者發生某種異常.
指令集
————
圖2是Y86
指令的格式大抵是: icode:ifun rA:rB D,具體如下圖所示:
指令分類 |
具體指令 |
說明 |
|||||||||||||||
傳送指令(XXmovl) (4種) |
|
Y86指令的定址方式單一:基址+偏移量. |
|||||||||||||||
算術邏輯指令(opl) (4個) |
addl, subl, andl, xorl |
這4個指令的執行會設定條件碼(CC). |
|||||||||||||||
跳轉指令(jxx) (4個) |
jmp, jle, jl, je, jne, jge, jg |
jmp是無條件跳轉指令,其他是條件跳轉指令 (根據條件碼選擇分支). |
|||||||||||||||
條件傳送指令(cmovXX) (6個) |
cmovle, cmovl, cmove, cmovne, cmovge, cmovg |
根據條件碼選擇是否更新目的暫存器. |
|||||||||||||||
call/ret指令 |
call/ret |
call將返回地址入棧,跳轉目的地址. ret指令從過程呼叫中返回. |
|||||||||||||||
pushl/popl指令 |
pushl/popl |
入棧和出棧操作. |
|||||||||||||||
halt指令 |
halt |
停止執行指令指令.設定Stat位HLT. |
|||||||||||||||
nop指令 |
nop |
指令集編碼
————
Y86指令1-6個位元組不等.第一個位元組表明指令的型別,其中高4位是程式碼(code)部分,低4位是功能碼(function). Y86的程式碼值0~0xB.
圖3給出了整數操作,條件傳送和條件傳送指令的具體編碼(第一個位元組),其他指令的功能碼是0(可以功能擴充套件).
暫存器編碼
——
為了方便,每個程式暫存器使用4位編碼,其中F表示無暫存器.
狀態碼和異常
————
狀態碼(Stat)是程式設計師可見的狀態之一,用來描述程式執行的總體狀態.詳見圖5.
一個適用的處理器,當處理器遇到異常,會呼叫一個異常處理程式.在Y86,當遇到異常時,直接讓處理器停止執行指令.
Copyright© 2011, Randal E. Bryant and David R. O'Hallaron
reference: