MIPS32指令集

MIPS指令可以分成以下各類:
    空操作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 指令集(共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) 
  $1=1 else
   $1=0

 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) 
  $1=1 else
   $1=0

 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存放移位的位數,
  也就是指令中的立即數,其中rt=$2, rd=$1

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) 注意符號位保留
 其中rt=$2, rd=$1

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) 注意符號位保留
 其中rs=$3,rt=$2, rd=$1

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
         位,目標寄存器的低16位填0

lw

100011

rs

rt

immediate

 lw $1,10($2)

 $1=memory[$2
 +10]

 rt <- memory[rs + (sign-extend)immediate] ;rt=$1,rs=$2

sw

101011

rs

rt

immediate

 sw $1,10($2)

 memory[$2+10]
 =$1

 memory[rs + (sign-extend)immediate] <- rt ;rt=$1,rs=$2

beq

000100

rs

rt

immediate

 beq $1,$2,10

 if($1==$2)  
 goto PC+4+40

 if (rs == rt) PC <- PC+4 + (sign-extend)immediate<<2 

bne

000101

rs

rt

immediate

 bne $1,$2,10

 if($1!=$2)
 goto PC+4+40

 if (rs != rt) PC <- PC+4 + (sign-extend)immediate<<2 

slti

001010

rs

rt

immediate

 slti $1,$2,10

 if($2<10) 
  $1=1 else
   $1=0

 if (rs <(sign-extend)immediate) rt=1 else rt=0 ;
   其中rs=$2,rt=$1

sltiu

001011

rs

rt

immediate

 sltiu $1,$2,10

 if($2<10) 
  $1=1 else
   $1=0

 if (rs <(zero-extend)immediate) rt=1 else rt=0 ;
  其中rs=$2,rt=$1

J-type

op

address

 

 

 

j

000010

address

 10000

 goto 10000

 PC <- (PC+4)[31..28],address,0,0   ;address=10000/4

jal

000011

address

 jal 10000

 $31<-PC+4;
 goto 10000

 $31<-PC+4;PC <- (PC+4)[31..28],address,0,0
   ;address=10000/4



資料來源:
1、《see mips run(2nd)》 D.Sweetman 
2、http://www.360doc.com/content/10/0817/09/2415113_46631439.shtml     MIPS常用指令集31條
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章