zoukankan      html  css  js  c++  java
  • 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 指令集

    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

     j 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

    注 意:因为MIPS16只有16个16位的寄存器,所以JAL指令中$31改成$15, 所有立即数均无需扩展,LUI指令直接就是将立即数付给RT寄存器。

     
     
     
     
  • 相关阅读:
    .NET 4.5 异步IO
    使用MANIFEST.MF文件来track War包做持续部署
    .NET 4.5 压缩
    自定义实现URL重写 04.18
    对.Net Framework的认识
    那点所谓的分布式——memcache
    不能选择FreeTextBox下拉列表框
    实战架构设计
    LoadRunner压力测试心得总结
    JavaScript的模块化:封装(闭包),继承(原型)
  • 原文地址:https://www.cnblogs.com/tkid/p/3873272.html
Copyright © 2011-2022 走看看