組成原理(四)指令系統


第四章 指令系統

4.1 指令格式

  1. 指令的最基本格式
    【操作碼 | 地址碼】
    (1)操作碼: 反應機器做什么操作
    操作碼的長度在RISC中固定,而在CISC中長度可變。CISC的長度可變是指利用指令的其他字段對操作碼字段進行擴展
    (2)一條指令至少需要至少包含以下幾個信息
              1. 操作碼
              2. 操作數地址
              3. 操作結果的存儲地址
              4. 下一條指令的地址
    指令的設計極為靈活,只要包含以上4點信息,就能構成一條指令,而不必在意其字段個數。
    指令的操作碼表示指令要完成的操作,指令的地址碼描述指令操作的對象

  2. 指令的分類(按照地址碼字段的個數)
    (1)零地址指令:(關機指令)
            格式:OPCODE - 操作碼
            指令中只有操作碼,而沒有地址碼
    (2)一地址指令:(取反)
            格式:【 OPCODE | A 】
            A:操作數的存儲器地址或寄存器編號。A即可以是操作數地址,又是操作結果的存儲地址
    (3)二地址指令:add r1 r2
            格式:【 OPCODE | \(A_1\) | \(A_2\)
            OPCODE -- 操作碼
            \(A_1\):第一個操作數的存儲器地址或寄存器地址
            \(A_2\):第二個操作數的存儲器地址或寄存器地址
    (4)三地址指令
            指令:【 OPCODE | \(A_1\) | \(A_2\) | \(A_3\)
            \(A_1\):第一個操作數的存儲器地址或寄存器地址
            \(A_2\):第二個操作數的存儲器地址或寄存器地址
            \(A_3\):操作結果的存儲器地址或寄存器地址
    (5)多地址指令:
            用於大中型機甚至高檔小型機中,用於處理成批的數據。

  3. 操作碼定長指令的格式
    (1)指令字長決定於三個部分:
            操作碼長度:f
            操作數地址的長度:n
            操作地址的個數:m
    (2)指令字長固定
            若操作碼長度為k位,則最多能有\(2^k\)條不同指令
            指令字長 = 存儲字長
    (3)指令字長可變
             按字節的倍數變化

  4. 擴展操作碼指令的格式
    (1)所謂擴展操作碼指令,就是擴展了操作碼的長度,從而增加了操作碼的個數。這些擴展的位來自於指令中的其他字段
    (2)擴展操作碼指令通常由一個固定長度的基本操作碼,和幾個地址碼字段組成。對於一部分不需要的地址碼指令,把他們的操作碼擴充到該地址碼字段。如下指令字段分配:

    15    ~   12 11    ~   8 7   ~    4 3    ~   0
    OPCODE \(A_1\) \(A_2\) \(A_3\)

如圖所示:若都是三地址指令,則操作碼占4位,有16條指令、
當以上指令格式,通過變長操作碼,把地址碼\(A_1\)的4bit也擴展成指令的操作碼時,指令集中就包含三地址指令和二地址指令。此時,雖然三地址下的操作碼有4為,但是三地址指令只有15條,需要留出1位作為二地址指令的前綴。
即:三地址指令的操作碼范圍:0000~1110
      二地址指令的操作碼范圍:0001 0000 ~ 0001 1110
      若繼續擴展1地址和0地址指令,則1地址指令有15條,0地址指令16條
(0地址指令不需要在為了擴展保留一位作為其他指令格式操作碼的前綴)

  1. 操作類型
    涉及到具體指令集中的匯編指令,如MIPS或x86指令集

4.2 指令的尋址格式

有效地址:EA 操作數的真實地址稱為有效地址
尋址方式:指令尋址,數據尋址

  1. 指令尋址
    (1)順序:(PC)+1 -> PC
    (2)跳躍:由跳轉指令給出跳轉后的地址

LDA
ADD
DEC:減1
JMP:跳轉
LDA
SUB:減法
INC:加1
STA:
LDA:
條件轉移:while,
無條件轉移:goto

  1. 數據尋址
    (1)數據尋址的指令格式
       ~  形式地址:指令字中的地址
       ~  有效地址:操作數的真實地址
       ~  約定:指令字長 = 存儲字長 = 機器字長
    image_1at5qrmc71jhj1o7c1hli1ua71jlg9.png-6.4kB(以下幾種尋址方式都是這個結構的指令格式)
    (2)數據尋址有多種尋址方式,如何區分這些尋址方式
       ~  1. 有的指令集中,沒有專門的尋址方式位,由操作碼確定尋址方式
       ~  2. 有專門的尋址方式位
          (eg:X86指令集中,一條指令中有多個操作數,且尋址方式各不相同,需要指明尋址方式,因此每個操作數有專門的尋址方式位)
    (3)數據尋址方式:立即尋址
          形式地址A就是操作數(地址即內容)
          指令執行階段不訪存
          A的位數限制了立即數的大小
          image_1at5rdspa1t5o33818pg1ufng1mm.png-2kB
          eg:執行 a + 5 指令 (add 5)
    (4)數據尋址方式:直接尋址
          EA = A : 有效地址由形式地址給出
          c = a + b
          執行階段訪問一次存儲器
          形式地址A的位數限制了該指令操作數的尋址范圍。但是操作數大小的范圍擴大了
    (5)數據尋址方式:隱含尋址
          操作數的地址隱含在操作碼里,比如對於操作碼ADD,其中一個操作數的地址在ACC寄存器里,所以指令中不用給出這個操作數的主存地址。當然另一個操作數還是要在指令中給出地址,去主存尋找。
    (6)間接尋址
          EA = (A)
    (7)數據尋址方式:寄存器尋址
    (8)數據尋址方式:寄存器間接尋址
    (9)數據尋址方式:基址尋址
          基址默認放在基址寄存器BR中,當基址放在其他通用寄存器中時,指令中要給出這個寄存器的編號。
          EA=(B)+ A
    (10)變址寄存器
          IX是變址寄存器,這個地址是可變的
          擴大尋址范圍。IX的內容可被用戶調用。便於處理數組問題
    (11)相對尋址
          相對於pc寄存器尋址。A的數值由指令中給出
          值得注意的是:PC寄存器的自增操作要早於相對尋址的計算

(1)某機器字長16位,主存按照字節編址,轉移指令采用相對尋址,由兩個字節組成。第一個字節為操作碼,第二個字節為相對偏移量個字段。若某轉移指令所在主存的地址為2000H,相對偏移量字段的內容為06H,則該指令成功跳轉后的目標地址是(2008H)
解:題中給出,采用相對尋址方式,所以EA = (PC)+n。這個n是一條指令跨過的地址編號。機器字長=指令字長=16byte=2字節,而主存地址按照字節編址,所以一次執行指令,地址號向后加2,所以為2000H+06H+2H = 2008H
---------------------------------------------------------------------------------------------------------------------
(2)某計算機字長16位,主存地址空間大小為128K,按字編址。采用單字長指令格式,指令字段定義如下:
image_1atgoltsp1du2lk7ikf10deoa69.png-3.8kB
轉移指令采用相對尋址方式,相對變異量用補碼表示,尋址方式定義為如下表:
image_1atgp2a651ceb42b1cp31lfi14dhm.png-19.2kB
問:(1)該指令系統最多有多少條指令,該計算機最多有多少個通用寄存器,存儲器地址寄存器和存儲器數據寄存器至少各占多少位?
(2)轉移指令的目標地址范圍是多少
(3)若操作碼0010B表示加法操作(助記符為add),寄存器R4和R5的編號分別為100B和101B,R4的內容為123H,R5的內容為5678H。地址1234H中的內容為5678H,地址5678H的內容為1234H。則匯編語句“add (R4),(R5)+”(逗號前為操作數,逗號后為目的操作數)對應的機器碼是什么?
(4)該指令執行后,哪些寄存器和存儲單元的值會改變,改變后的內容是什么。

解:(1)因為op占4位,所以指令最多16條。
因為機器字長16位,所以MDR至少16位
因為存儲空間128K,且按字編址,所以地址范圍是128/2=64k,即\(2^{16}\),所以MAR占16位
(2)因為寄存器占16位(等於機器字長),所以PC占16位,其地址范圍為0 ~ \(2^{16}\)-1
(3)途中的的m和r分別表示m:mode。r:register寄存器。所以圖中給出指令格式為:image_1atgqfnna1lqr1hiqm2o10mgbde13.png-4.3kB
即:0010 001 100 010 101
(4)R5和地址5678H的主存塊內容變化。R5變為5678+1=5679H,5678H單元的內容變為1234H+5678H=68ACH

4.3 CISC與RISC

  1. 處理器編程模型 (C=B+A)
    (1)我們要定義一套規則,讓計算機理解人的意圖
    (2)ABC稱作操作數,+號稱作操作碼。處理其中做運算的單元稱作ALU。距離ALU很近的地方紡織了一些寄存器,這樣中間結果都放在寄存器中,而不用每次都經過存儲器。
    (3)於是,把C=B+A分解成一系列的指令執行.指令就是編程模型

  2. CISC:復雜指令集
    (1)計算機發展早期,人們用匯編語言進行編程,自然喜好強大好用的指令集。於是處理器設計人員把指令設計的強大而靈活
    (2)CISC指令集中包含高級語言的某些特性,如復雜的尋址模式,直接對應指針的運算
    (3)那時的存儲器速度慢且昂貴,因此CISC的指令是變長指令,以節約存儲空間。由一條指令完成很多功能,對內存訪問減少了

  3. RISC:精簡指令集
    (1)IBM發現,CISC中的大量復雜尋址方式和大量指令不會被經常用到。常用的指令只占20%
    (2)於是重新設計指令集,來去除cpu中,用於做復雜又很少用到的功能的晶體管
    (3)RISC的指令大部分時間能在一個cycle內完成,因此處理器頻率得到大幅度提升
    (4)RISC利於擴展,但RISC采用定長指令,使得存儲空間變大。程序空間較大會降低cache的命中率,降低程序的執行效率

  4. intel對CISC的改造
    (1)intel意識到CISC架構的cpu,很難有性能上的提升,但要適配CISC設計的程序,又不能直接采用RISC,於是intel把CISC的指令先解析為微指令(micro-operations,簡稱ups)。以后的執行采用RISC處理 。
    (2)intel把cisc轉化為risc的操作是借助於微程序控制器:將大指令翻譯為多個小指令,放在控制存儲器中。因此一個微程序包含多個微指令,每條微指令發出微命令進行微操作。

  5. 機器字長
    (1)機器字長:處理器一次處理的數據長度,由運算器,寄存器決定。eg: 32位的處理器,每個寄存器能存儲32bit的數據
    (2)32位cpu的地址總線長為32位,而數據總線一般采用64bit和128bit長度,這樣可以一次讀取更多數據。

  6. 操作數個數
    (1)早期晶體管緊張,寄存器數目較少,指令集設計時,只采用2個寄存器:ADD AX,BX(源和目的操作數采用一個寄存器)
    (2)intel后來擴充了SSE指令,采用3個操作數:源,目的,掩碼
    (3)后來的RISC采用3操作數:2個源操作數,1個目的操作數
    (4)x86指令格式的目的操作數在最前:ADD BX,AX:結果放在BX中。MIPS的3操作數,目的操作數也在第一個

  7. 二進制存儲順序-大小端
    0x12345678在大端字節序和小端字節序的存儲形式。小端:存儲位越來越低。大端:存儲位越來越高
    image_1atahiffmlhhv4416ln1ag917rs13.png-11.7kB

  8. 指令類型
    cpu要完成各種運算,需要3中類型的指令
    (1)算數邏輯指令:移位,加減法
    (2)控制指令:跳轉指令
    (3)數據傳送指令:數據導入導出。load:數據從存儲器到寄存器,store:方向相反
    題目側重考察構造指令集

(1)c語言中,a = i + 5用到的尋址方式:
        
i : 直接尋址, 5 : 立即數尋址 , a = *i + 5間接尋址


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM