空操作 no-op;
寄存器/寄存器傳輸:用得很廣,包括條件傳輸在內;
常數加載:作為數值和地址的整型立即數;
算術/邏輯指令;
整數乘法、除法和求余數;
整數乘加;
加載和存儲;
跳轉、子程序調用和分支;
斷點和自陷;
CP0功能:CPU控制指令
浮點;
用戶態的受限訪問:rdhwr和synci
注:64位版本開頭以“d”表示,無符號數以“u”結尾,立即數通常以“i”結尾,字節操作以“b”結尾,雙字操作以“d”結尾,字操作以“w”結尾
1、空操作:nop:相當於 sll zero,zero,o,
ssnop: equals sll zero,zero,1.
這個指令不得與其它指令同時發送,這樣就保證了其運行要花費至少一個時鍾周期。這在簡單的流水線的CPU上無關緊要,但在復雜些的實現上對於實現強制的延時很有用。
2、寄存器/寄存器傳送:
move: 通常用跟$zero寄存器的or來實現,或者用addu。
movf, movt, movn, movz: 條件傳送。
3、常數加載:
dla、la: 用來加載程序中某些帶標號的位置或者變量的地址的宏指令;
dli、li: 裝入立即數常數,這是一個宏指令;
lui: 把立即數加載到寄存器高位。
4、算術/邏輯運算:
add、addi、dadd、daddi、addu、addiu、daddu、daddiu、dsub、sub、subu:加法指令和減法指令;
abs,dabs:絕對值;
dneg、neg、negu:取相反數;
and、andi、or、ori、xor、nor:逐位邏輯操作指令;
drol、rol、ror:循環移位指令;
sll、srl、sra:移位。
5、條件設置指令:
slt、slti、sltiu、sltu、seq、sge、sle、sne:條件設置。
6、整數乘法、除法和求余數:
div、mul、rem等等。
7、整數乘加(累加):
mad等。
8、加載和存儲:
lb、ld、ldl、ldr、sdl、sdr、lh、lhu、ll、sc、pref、sb等操作。
9、浮點加載和存儲:
l.d、l.s、s.d、s.s等
常用MIPS指令集及格式:
MIPS 指令集
MIPS 指令集(共31條) |
|||||||||
助記符 |
指令格式 |
示例 |
示例含義 |
操作及其解釋 |
|||||
Bit # |
31..26 |
25..21 |
20..16 |
15..11 |
10..6 |
5..0 |
|
|
|
R-type |
op |
rs |
rt |
rd |
shamt |
func |
|
|
|
add |
000000 |
rs |
rt |
rd |
00000 |
100000 |
add $1,$2,$3 |
$1=$2+$3 |
rd <- rs + rt ;其中rs=$2,rt=$3, rd=$1 |
addu |
000000 |
rs |
rt |
rd |
00000 |
100001 |
addu $1,$2,$3 |
$1=$2+$3 |
rd <- rs + rt ;其中rs=$2,rt=$3, rd=$1,無符號數 |
sub |
000000 |
rs |
rt |
rd |
00000 |
100010 |
sub $1,$2,$3 |
$1=$2-$3 |
rd <- rs - rt ;其中rs=$2,rt=$3, rd=$1 |
subu |
000000 |
rs |
rt |
rd |
00000 |
100011 |
subu $1,$2,$3 |
$1=$2-$3 |
rd <- rs - rt ;其中rs=$2,rt=$3, rd=$1,無符號數 |
and |
000000 |
rs |
rt |
rd |
00000 |
100100 |
and $1,$2,$3 |
$1=$2 & $3 |
rd <- rs & rt ;其中rs=$2,rt=$3, rd=$1 |
or |
000000 |
rs |
rt |
rd |
00000 |
100101 |
or $1,$2,$3 |
$1=$2 | $3 |
rd <- rs | rt ;其中rs=$2,rt=$3, rd=$1 |
xor |
000000 |
rs |
rt |
rd |
00000 |
100110 |
xor $1,$2,$3 |
$1=$2 ^ $3 |
rd <- rs xor rt ;其中rs=$2,rt=$3, rd=$1(異或) |
nor |
000000 |
rs |
rt |
rd |
00000 |
100111 |
nor $1,$2,$3 |
$1=~($2 | $3) |
rd <- not(rs | rt) ;其中rs=$2,rt=$3, rd=$1(或非) |
slt |
000000 |
rs |
rt |
rd |
00000 |
101010 |
slt $1,$2,$3 |
if($2<$3) |
if (rs < rt) rd=1 else rd=0 ;其中rs=$2,rt=$3, rd=$1 |
sltu |
000000 |
rs |
rt |
rd |
00000 |
101011 |
sltu $1,$2,$3 |
if($2<$3) |
if (rs < rt) rd=1 else rd=0 ;其中rs=$2,rt=$3, rd=$1 |
sll |
000000 |
00000 |
rt |
rd |
shamt |
000000 |
sll $1,$2,10 |
$1=$2<<10 |
rd <- rt << shamt ;shamt存放移位的位數, |
srl |
000000 |
00000 |
rt |
rd |
shamt |
000010 |
srl $1,$2,10 |
$1=$2>>10 |
rd <- rt >> shamt ;(logical) ,其中rt=$2, rd=$1 |
sra |
000000 |
00000 |
rt |
rd |
shamt |
000011 |
sra $1,$2,10 |
$1=$2>>10 |
rd <- rt >> shamt ;(arithmetic) 注意符號位保留 |
sllv |
000000 |
rs |
rt |
rd |
00000 |
000100 |
sllv $1,$2,$3 |
$1=$2<<$3 |
rd <- rt << rs ;其中rs=$3,rt=$2, rd=$1 |
srlv |
000000 |
rs |
rt |
rd |
00000 |
000110 |
srlv $1,$2,$3 |
$1=$2>>$3 |
rd <- rt >> rs ;(logical)其中rs=$3,rt=$2, rd=$1 |
srav |
000000 |
rs |
rt |
rd |
00000 |
000111 |
srav $1,$2,$3 |
$1=$2>>$3 |
rd <- rt >> rs ;(arithmetic) 注意符號位保留 |
jr |
000000 |
rs |
00000 |
00000 |
00000 |
001000 |
jr $31 |
goto $31 |
PC <- rs |
I-type |
op |
rs |
rt |
immediate |
|
|
|
||
addi |
001000 |
rs |
rt |
immediate |
addi $1,$2,100 |
$1=$2+100 |
rt <- rs + (sign-extend)immediate ;其中rt=$1,rs=$2 |
||
addiu |
001001 |
rs |
rt |
immediate |
addiu $1,$2,100 |
$1=$2+100 |
rt <- rs + (zero-extend)immediate ;其中rt=$1,rs=$2 |
||
andi |
001100 |
rs |
rt |
immediate |
andi $1,$2,10 |
$1=$2 & 10 |
rt <- rs & (zero-extend)immediate ;其中rt=$1,rs=$2 |
||
ori |
001101 |
rs |
rt |
immediate |
andi $1,$2,10 |
$1=$2 | 10 |
rt <- rs | (zero-extend)immediate ;其中rt=$1,rs=$2 |
||
xori |
001110 |
rs |
rt |
immediate |
andi $1,$2,10 |
$1=$2 ^ 10 |
rt <- rs xor (zero-extend)immediate ;其中rt=$1,rs=$2 |
||
lui |
001111 |
00000 |
rt |
immediate |
lui $1,100 |
$1=100*65536 |
rt <- immediate*65536 ;將16位立即數放到目標寄存器高16 |
||
lw |
100011 |
rs |
rt |
immediate |
lw $1,10($2) |
$1=memory[$2 |
rt <- memory[rs + (sign-extend)immediate] ;rt=$1,rs=$2 |
||
sw |
101011 |
rs |
rt |
immediate |
sw $1,10($2) |
memory[$2+10] |
memory[rs + (sign-extend)immediate] <- rt ;rt=$1,rs=$2 |
||
beq |
000100 |
rs |
rt |
immediate |
beq $1,$2,10 |
if($1==$2) |
if (rs == rt) PC <- PC+4 + (sign-extend)immediate<<2 |
||
bne |
000101 |
rs |
rt |
immediate |
bne $1,$2,10 |
if($1!=$2) |
if (rs != rt) PC <- PC+4 + (sign-extend)immediate<<2 |
||
slti |
001010 |
rs |
rt |
immediate |
slti $1,$2,10 |
if($2<10) |
if (rs <(sign-extend)immediate) rt=1 else rt=0 ; |
||
sltiu |
001011 |
rs |
rt |
immediate |
sltiu $1,$2,10 |
if($2<10) |
if (rs <(zero-extend)immediate) rt=1 else rt=0 ; |
||
J-type |
op |
address |
|
|
|
||||
j |
000010 |
address |
j 10000 |
goto 10000 |
PC <- (PC+4)[31..28],address,0,0 ;address=10000/4 |
||||
jal |
000011 |
address |
jal 10000 |
$31<-PC+4; |
$31<-PC+4;PC <- (PC+4)[31..28],address,0,0 |
注 意:因為MIPS16只有16個16位的寄存器,所以JAL指令中$31改成$15, 所有立即數均無需擴展,LUI指令直接就是將立即數付給RT寄存器。