設計一個簡易的處理器(1)--定義指令集體系結構(ISA)

dennis_fan發表於2012-11-26

處理器的主要作用就是執行指令,那麼設計處理器的第一步就是要定義或者相容指令集體系結構(Instruction Set Architecture,ISA). 定義一個指令集體系結構,包括定義各種狀態元素,指令集及編碼,一組程式設計規範和異常事件處理.

 

傳統的指令集的設計理念主要分為CISCRISC兩種設計理念.現代處理器比如IA32體系結構的指令集,已經不是單純的CISC,設計時候已經結合了RISC的精華.

 

本文介紹的Y86 ISAIA32的一個簡化版本(子集),操作集較少,定址方式較少. (*)

 

程式設計師的可見的狀態

————

Y86的每條指令都會讀取或修改處理器狀態的某些部分,稱為程式設計師可見狀態.如圖1所示.


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):表明程式執行的總體狀態,它指示正常執行,或者發生某種異常.

 

 

指令集

————

2Y86指令集的簡單描述.IA32AT&T指令集相似.操作的資料都是4位元組的指令編碼長度1-6個位元組不等.

指令的格式大抵是: icode:ifun rA:rB D,具體如下圖所示:

 

指令分類

具體指令

說明

傳送指令(XXmovl)

(4)

指令

目的

irmovl

立即數

暫存器

rrmovl

暫存器

暫存器

mrmovl

儲存器

暫存器

rmmovl

暫存器

儲存器

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

停止執行指令指令.設定StatHLT.

nop指令

nop

 

 

 

指令集編碼

————

Y86指令1-6個位元組不等.第一個位元組表明指令的型別,其中高4位是程式碼(code)部分,4位是功能碼(function). Y86的程式碼值0~0xB.

3給出了整數操作,條件傳送和條件傳送指令的具體編碼(第一個位元組),其他指令的功能碼是0(可以功能擴充套件).


暫存器編碼

——

為了方便,每個程式暫存器使用4位編碼,其中F表示無暫存器.



 

狀態碼和異常

————

狀態碼(Stat)是程式設計師可見的狀態之一,用來描述程式執行的總體狀態.詳見圖5.


一個適用的處理器,當處理器遇到異常,會呼叫一個異常處理程式.Y86,當遇到異常時,直接讓處理器停止執行指令.

 


*:本篇中的圖片均來自本書的官網,詳見http://csapp.cs.cmu.edu/public/figures.html

        Copyright© 2011, Randal E. Bryant and David R. O'Hallaron

 

reference:

1. 深入理解計算機系統(原書第2版)


(版權所有,轉載時請註明作者和出處-dennis_fan-http://blog.csdn.net/dennis_fan )


相關文章