接下來再來繼續看 I 型指令集的部分,前面在指令分類上有點小誤解
其實 MIPS 指令可以用以下九宮格來做分類
前一篇所說的是 R 型運算指令,今天要提的是 I 型運算以及訪存指令
而關於三型的分支指令部分將在下一篇作完整介紹:)
指令格式的部分一樣參考下面這張圖表
如果指令中需要只用到立即數,也就是我們平常所使用的數字,那就需要用到 I 型指令
因為在 R型指令中只有 5 bits 的 shamt 是可以額外用來代表數字的
但是可以表示的大小最多也只有 2^5 = 32,是不夠用,所以才要另外設計一個新的指令類型
而 R 型指令中 opcode 為甚麼沒有跟 funct 合在一起也就是因為要跟其他類型的對齊的關係
I 型指令基本上與 R 型相同, opcode 仍然用於指定指令的操作類型
但這裡沒有 funct,所以不同的 I 型指令其 opcode 是不同的
Rs (Source Register):指定第一個來源操作數的暫存器編號
Rt (Target Register):指定目的操作數的暫存器編號
(對於某些指令還是表示第二個來源操作數的暫存器編號)
剩下的 16bits 被整合為 immediate:16位的立即數,可以表示 2^16 的不同數值
雖然無法滿足全部的立即數需求,但是大部分時候還是可以的
這邊也體現出 x86 的優勢所在,因為 x86 指令長度不固定,所以可以很容易地擴展表達的位元
所以也可以說 RISC 和 CISC 各有其優缺點存在
一樣來舉個例子: addi $21, $22, -50
經查表後 addi 的 opcode:8
$21 = $22 + (-50)
所以轉換成指令碼就是: 001000 10110 10101 1111 1111 1100 1110
下一篇將再繼續介紹分支指令的部分: