ISA定義了軟件編程所需要的必要而完整的描述。
ISA給出了內存組織方式,寄存器組,指令集(包括操作碼,數據類型,尋址模式)等信息。
LC-3的數據處理是16位的,所以對於LC-3來說,16位爲一個字,LC-3也可稱爲一個“字尋址”機器。
寄存器
從內存中獲取數據的速度很慢(通常遠不止一個週期),所以,LC-3也提供了臨時存儲空間,訪問速度爲一個週期。
實現方式爲寄存器,LC-3提供了一組通用寄存器(GPR)。
寄存器和內存特性一樣,具有記憶功能。存儲信息並且可以再次讀出,寄存器的存儲大小爲一個字,LC-3中即爲1個字。
同時寄存器可以獨立尋址,每個寄存器都是唯一的標識,所以才能在一個週期內獲取數據。
LC-3提供了R0-R7 8個寄存器(這意味着標識編號只需要3位bit就可以標識了)
指令集
一條指令分爲兩個部分:操作碼(做什麼)、操作數(對誰操作)
一個ISA的指令集包括操作碼的集合、數據類型、尋址模式。尋址模式決定了操作數的存放位置。
操作碼:
有的ISA擁有龐大的指令操作碼集合,有的確很小,並且現在的大多數計算機通常都使用一串指令來完成信息的操作而不是一條,個人覺得原因是大部分指令其實可以通過小部分基礎指令通過組合來完成操作,這樣的話可以節省操作碼所佔用位數。LC-3定義了15條指令,每個指令對應一個操作碼,因此只需要4個bit位就足夠定義了。(其中1101沒有定義)
指令可以分爲三類:運算、數據搬移、控制。
運算類負責處理信息,數據搬移類負責在內存和寄存器直接以及內存/寄存器和輸入/輸出設備之間的信息轉移。
控制類負責改變指令的執行順序,即可以讓程序隨時跳轉到指定位置繼續執行(而不是常規的順序往下)
指令列表
0000 | BR((無)條件轉移) | |
0001 | ADD 加操作 | 改變條件碼 |
0010 | LD PC相對尋址load | 改變條件碼 |
0011 | ST PC相對尋址store | |
0100 | JSR(R)子程序調用 | |
0101 | AND | 改變條件碼 |
0110 | LDR基址偏移尋址 | 改變條件碼 |
0111 | STR基址偏移尋址 | |
1000 | RTI | |
1001 | NOT | 改變條件碼 |
1010 | LDI間接尋址 | 改變條件碼 |
1011 | STI間接尋址 | |
1100 | JMP | |
1110 | LEA立即數尋址 | 改變條件碼 |
1111 | TRAP |
數據類型:ISA操作碼能夠識別的某種數據類型表示的信息,LC-3的ISA只支持一種:補碼整數
尋址模式:
尋址模式是指定義操作數位置的一種機制。操作數可能存在的地方:內存、寄存器、指令本身。
LC-3支持5種尋址模式:立即數、寄存器、相對尋址、間接尋址、基址偏移尋址,後三種爲內存尋址模式。
條件碼:
幾乎所有的ISA都具備“基於之前指令的結果來改變指令執行序列”,其中的機制就是條件碼。
LC-3有3個位寄存器(每個位寄存器爲1bit長度,置1或清0),三個位寄存器分別爲N,Z,P對應的是負數,0,整數。
當任意通用寄存器中被寫入時,都會對這三個位寄存器的值進行修改。根據寫入結果爲正負數或0,把對應的位寄存器置1,其餘位置0.
操作指令:
運算操作(ADD/SUB/MUL/DIV 加減乘除)和邏輯操作(AND/OR/NOT/XOR 與/或/非/異或)都屬於典型的操作指令。
LC-3只支持三種:ADD、AND、NOT。
R3位目的寄存器,R5位源寄存器,該指令就是把R5寄存器內容按位取反。bit[5:0]全爲1,這個是固定的。
R1位目的寄存器,R4是源寄存器,通過bit[5]來判定bit[4:0]的含義。
如果爲0,則bit[2:0]位另一個源寄存器,如上圖意思就是R4+R5 ---->R1。
如果爲1,bit[4:0]位指令攜帶的立即操作數。對起做16位擴展後與源寄存器相加。如上面的圖如果5位1,則
表示R1<-----R4+3
AND操作碼的機制和ADD機制類似,也是通過bit[5]來表明bit[4:0]是另一個源寄存器還是立即數。
數據搬移指令:
我們稱從內存移入寄存器爲“裝載”(load),從寄存器轉入內存爲存儲(store)。
兩種情況下,數據源(或源操作數)的信息內容都不會因爲此移動而發生改變,但目的操作數的內容被刷新了。
LC-3的7個數據搬移指令 LD,ST,LDR,STR,LDI,STI,LEA.
數據搬移指令需要兩個操作數:源和目的。
如果爲load,寄存器爲DR(目的寄存器),數據由內存讀取到寄存器,如果爲store,寄存器爲SR(源寄存器),數據由寄存器寫入到內存。
PC相對尋址:LD(0010)和ST(0011)
將地址生成位做16位擴展然後與增量PC(已經+1)相加,計算出來的地址放入DR或SR,根據該內存地址指向的內容做對應的讀寫。以爲地址位有限,所以這種尋址方式能訪問的空間範圍是有限制的。PC+offset---->address ,mem[address]--->result
間接尋址:LDI(1010)和STI(1011)
首先採用LD的方式計算出地址,但是不是直接取這個地址的內容做爲結果,而是把這個地址的內容做爲一個新的地址,新地址指向的內容即爲需要尋找的內容 增量pc+offset--->address, mem[address]--->address1 mem[address1]--->result.
通過間接尋址的方式,我們就可以避免相對尋址出現的訪問空間範圍有限的侷限性而訪問到整個內存空間的任意位置。
基址偏移尋址:LDR(0110)和STR(0111)
該尋址方式和之前的尋址指令在指令格式上有所不同,如下
會增加一個新的寄存器R2,然後獲取的內存地址是基於R2對於bit[5:0]的偏移量,即 R1<---R2+offset,mem[R1]--->result這種尋址模式下,由於可以設置R2的值,所以也是全內存空間尋址的。
立即數尋址:LEA(1110)
注意,這個指令只有裝載,沒有保存。
所謂立即數尋址,就是尋址過程是立即的,直接把PC增量和偏移量相加得到結果,而不需要查詢內存,即
增量PC+offset--->result.
控制指令:
控制指令是指那些能夠改變指令執行順序的指令。
LC-3有5個操作碼:(無)條件跳轉BR(0000)、子程序調用(0100)、TRAP()、中斷返回。
條件跳轉指令(0000)
N、Z、P就是之前說過的三個bit位寄存器,條件跳轉指令通過將對應的位置爲1來表明需要對該位寄存器進行判斷來確定是否需要進行跳轉來改變指令流。(對應的位寄存器爲1則表明滿足條件,需要改變PC)
假如條件滿足,則 增量PC+PC偏移---->新的PC。
回顧一下N,Z,P這三位其中之一肯定爲1,其餘爲0. 則如果在條件跳轉指令N,Z,P三個位都爲1的情況下,無論如何PC都會發生變化(其中之一肯定能滿足條件),我們叫這種情況爲無條件跳轉。
當然如果指令中的NZP都爲0,則不進行任何條件判斷(相當於指令沒有意義,PC繼續按照正常的增量執行下一條指令)
條件跳轉有一個嚴重的問題就是無法跳轉到任意的指令位置(因爲PC偏移位數有限),所以只能執行當前指令附近一定範圍內的指令,JMP因此產生。
JMP指令(1100)
JMP指令的任務就是把寄存器bit[8:6]標識的寄存器內容裝入PC寄存器(這裏有一點疑問,就是bit[5:0]有沒有意義,是不是能設置偏移量?目前沒有找到相關的說明,但是如果按照書上所說就是把通用寄存器內容裝入PC的話,可能這個偏移量設置就是無意義的,但是我這一點無法確定)
TRAP指令(1111)
TRAP指令的任務是改變PC內容,使其指向操作系統所在的空間內部,即以當前用戶程序的身份跳轉到操作系統的某個代碼入口開始執行。也可以說TRAP指令激活了操作系統的服務調用(Service Call),圖中的陷入矢量就是程序希望操作系統執行的服務程序的編號。
數據通路的基本部件:
全局總線:用於一個結構與另一個結構之間傳遞信息(能傳遞的信息位數上限由機器的字數決定,LC-3爲16個bit),總線上每次只能傳遞一個數值(即任意時刻只有一個發送者)。但是各種計算機不全是單個總線的,可能存在多個總線。(單總線優缺點?如何選擇?)
內存:計算機核心部件(可以說是最重要的),內存包含着指令和數據。訪問內存第一步是將要訪問的內存地址載入MAR,然後根據訪問操作類型的不同做不同的處理,如果是load,則向內存傳遞讀信號,將內存內容載入MDR,如果是寫,則先把內容事先放置於MDR中,然後向內存傳遞寫信號,使得MDR輸出的數據被裝入MAR指定的內存單元中。
ALU和寄存器文件
ALU是信息處理單元,有兩個輸入,一個來自寄存器,一個可能來自寄存器也可能是指令自身攜帶的立即數。
PC和PCMUX
PC通過總線向MAR提供地址信息,指向下一個週期開始要獲取的指令所在位置,而PC本身的輸入則是一個3選1的PCMUX提供的。在取指令節拍,PC內容會自動增量PC,然後做爲PCMUX的輸入。
但是如果指令是一條控制指令,則被選擇的PCMUX輸入將取決於控制指令的類型(而不是PC增量)。
MARMUX
內存的訪問是通過向寄存器MAR提供地址完成的,MARMUX控制信號的作用就是在load、store、TRAP的執行期間,爲其在兩個地址的輸入中選擇合適的輸入。