【筆記】指令系統(一)
一、機器指令
每一條機器語言的語句稱為機器指令,而又將全部機器指令的集合稱為機器的指令系統。
1.指令的一般格式
指令是由操作碼和地址碼兩部分組成的。
操作碼
操作碼用來指明該指令索要完成的操作,如加法、減法、傳送、移位、轉移等。通常,其位數反映了機器的操作種類,也即機器允許的指令條數。
操作碼的長度可以是固定的,也可以是變化的。前者將操作碼集中放在指令字的一個欄位內,如圖所示。這種格式便於硬體設計,指令譯碼時間段,廣泛用於字長較長的、大中型計算機和超級小型計算機以及RISC中。
對於操作碼長度不固定的指令,其操作碼分散在指令字的不同欄位中。這種格式可有效地壓縮操作碼的平均長度,在字長較短的微型計算機中被廣泛採用。
通常採用擴充套件操作碼技術,使操作碼的長度隨地址數的減少而增加,不同地址數的指令可以具有不同長度的操作碼,從而在滿足需要的前提下,有效地縮短指令字長。
在設計操作碼不固定的指令系統時,應儘量考慮安排指令使用頻度(即指令在程式中出現的概率)高的指令佔用短的操作碼,對使用頻度低的指令可 佔用較長的操作碼,這樣可以縮短經常使用的指令的譯碼時間。
地址碼
地址碼用來指出該指令的源運算元的地址(一個或兩個)、結果的地址以及下一條指令的地址。這裡的“地址”可以是主存的地址,也可以是暫存器的地址,甚至可以是I/O裝置的地址。
(1)四地址指令
其中,OP為操作碼;為第一運算元地址;為第二運算元地址;為結果地址;為下一條指令的地址。
如果地址欄位均指示主存的地址,則完成一條四地址指令,共需訪問4次儲存器(取指令一次,取兩個運算元兩次,存放結果一次)。
(2)三地址指令
因為程式中大多數指令是按順序執行的,而程式計數器PC既能存放當前欲執行指令的地址,又有計數功能,因此它能自動形成下一條指令的地址。這樣,指令字中的第四地址欄位便可省去,即得三地址指令格式。
它可完成的操作後,後續指令的地址隱含在程式計數器PC之中。三地址指令運算元的直接定址範圍可達。同理,若地址欄位均為主存地址,則完成一條三地址指令也需訪問4次儲存器。
(3)二地址指令
機器在執行過程中,沒有必要將每次運算結果都存入主存,中間結果可以暫存在CPU的暫存器(如ACC)中,這樣又可省去一個地址欄位
它可完成的操作,即欄位既代表源運算元的地址,又代表存放本次運算結果的地址。有的機器也可以表示的操作,此時除了代表源運算元的地址外,還代表中間結果的存放地址。這兩種情況完成一條指令仍需訪問4次儲存器。如果使其完成,此時,它完成一條指令只需3次訪存,它的含義是中間結果暫存於累加器ACC中。二地址指令運算元的直接定址範圍為。
(4)一地址指令
如果將一個運算元的地址隱含在運算器的ACC中,則指令字中只需給出一個地址碼,構成一地址指令。
它可完成的操作,ACC既存放參與運算的運算元,又存放運算的中間結果,這樣完成一條一地址指令只需兩次訪存。一地址指令運算元的直接定址範圍達,即16M。
(5)零地址指令
零地址指令在指令字中無地址碼,例如,空操作(NOP)、停機(HLT)這類指令只有操作碼。而子程式返回(RET)、中斷返回(IRET)這類指令沒有地址碼,其運算元的地址隱含在堆疊指標SP中。
用一些硬體資源(如PC、ACC)承擔指令字中需指明的地址碼,可在不改變指令字長的前提下,擴大指令運算元的直接定址範圍。此外,用PC、ACC等硬體代替指令字中的某些地址欄位,還可縮短指令字長,並可減少訪存次數。
地址欄位表示暫存器時,也可有三地址、二地址、一地址之分。它們的共同點是,在指令的執行階段都不必訪問儲存器,直接訪問暫存器,使機器執行速度得到提高(因為暫存器型別的指令只需在取值階段訪問一次儲存器)。
2.指令字長
指令字長取決於操作碼的長度、運算元地址的長度和運算元地址的個數。
為了提高指令的執行速度和節省儲存空間,通常儘可能把常用的指令(如資料傳送指令、算邏運算指令等)設計成單字長或短字長格式的指令。通常指令字長取8的整數倍。
二、操作型別
1.運算元型別
機器中常見的運算元型別有地址、數字、字元、邏輯資料等。
2.操作型別
資料傳送
資料傳送包括暫存器與暫存器、暫存器與儲存單元、儲存單元與儲存單元之間的傳送。
算術邏輯操作
這類操作可實現算術運算和邏輯運算。有些機器還具有位操作功能,如位測試(測試指定位的值)、位清除(清除指定位)、位求反(對指定位求反)等。
移位
移位可分為算數移位、邏輯移位、迴圈移位三種。
轉移
轉移指令按其轉移特徵又可分為無條件轉移、條件轉移、跳轉、過程呼叫與返回、陷阱等幾種。
(1)無條件轉移
無條件轉移不受任何條件約束,可直接把程式轉移到下一條需執行指令的地址。
(2)條件轉移
條件轉移是根據當前指令的執行結果來決定是否需要轉移。若條件滿足,則轉移;若條件不滿足,則繼續按順序執行。
還有一種條件轉移指令,SKP,它暗示其下一條指令將被跳過,從而隱含惡劣轉移地址是SKP後的第二條指令。
(3)呼叫與返回
通常呼叫指令包括過程呼叫、系統呼叫、子程式呼叫。它可實現從一個程式轉移到另一個程式的操作。
呼叫指令(CALL)一般與返回指令(RETURN)配合使用。CALL用於從當前的程式位置轉至子程式的入口;RETURN用於子程式執行後重新返回到原程式的斷點。
需注意以下三點:
- 子程式可在多處被呼叫
- 子程式呼叫可出現在子程式中,即允許子程式巢狀。
- 每個CALL指令都對應一條RETURN指令。
返回地址可存放在以下3處:
- 暫存器內。機器內設有專用暫存器,專門用於存放返回地址。
- 子程式的入口地址內。
- 棧頂內。現代計算機都設有堆疊,執行RETURN指令後,便可自動從棧頂內取出應返回的地址。
(4)陷阱與陷阱指令
陷阱其實是一種意外事故的中斷。一旦出現意外故障,計算機就發出陷阱訊號,暫停當前程式的執行,轉入故障處理程式進行相應的故障處理。
計算機的陷阱指令一般不提供給使用者直接使用,而作為隱指令(即指令系統中不提供的指令),在出現意外故障時,由CPU自動產生並執行。也有的機器設定供使用者使用的陷阱指令或“訪管”指令,利用它完成系統呼叫和程式請求。
(5)輸入輸出
通常設有輸入輸出指令,它完成從外設中的暫存器讀入一個數據到CPU的暫存器內,或將資料從CPU的暫存器輸出至某外設的暫存器中。
(6)其他
包括等待指令、停機指令、空操作指令、開中斷指令、關中斷指令、置條件碼指令等。
在多使用者、多工的計算機系統中,還設有特權指令,這類指令只用用於作業系統或其他系統軟體,使用者是不能使用的。在有些大型或巨型機中,還設有向量指令,可對整個向量或矩陣進行求和、求積運算。