计算机组成的一些总结(9)MIPS指令简介

MIPS指令简介

MIPS指令的基本格式分为三种:R型、I型和J型。R型(Register)指的是寄存器型,I型(Immediate)指的是立即数型,J型(Jump)指的是无条件转移型。

指令格式位R型的运算指令

  R型指令格式包含6个域,最高位的opcode域,是6个比特,最低位的funct域也是6个比特, 中间rs、rt、rd、shamt均为5个比特。

  opcode用于指定指令的类型,对于所有R型指令,该域的值均为0,但这并不是说明R型指令只有一种,它还需要用funct 域来更为精确的指定指令的类型,所以说对于R型指令,实际上一共有12个比特操作码。

  rs  Source Register 通常用于指定第一个源操作数所在的寄存器编号

  rt Target Register  通常用于指定第二个源操作数所在的寄存器编号  

  rd Destination Register 通常用于指定目的操作数(保存运算结果)的寄存器编号

  5-bit的域可表示0~31,对应32个通用寄存器

  shamt  shift amount     用于指定移位指令进行移位操作的位数,对于非移位指令,该域设为0。

opcode rs rt rd shamt funct
6-bit 5-bit 5-bit 5-bit 5-bit 6-bit

                                                                                                 R型指令

I型指令的格式   

  R型指令只有一个5-bit域(移位域)表示立即数,范围为0~31        

opcode rs rt immediate
6-bit 5-bit 5-bit 16-bit

                                                                                          I型指令

  opcode用于指定指令的操作类型(但没有funct 域)

  rs  Source Register 通常用于指定第一个源操作数所在的寄存器编号

  rt Target Register  指定用于目的操作数(保存运算结果)的寄存器编号,对于某些指令指定第二个源操作数所在的寄存器编号

  immediate 16-bit的立即数,可以表示2^16个不同数值

  对于访存指令(需要一个寄存器,加上一个立即数来指示一个内存单元,这个立即数就是访存地址的偏移量),如 lw rt, imm (rs),通常可以满足访存地址偏移量的需求(-32768~+32767)

  对于运算指令,如addi rt , rs , imm 无法满足全部需求,但大多数时候可以满足要求。这一点体现出X86这样的CISC指令系统的优势,对于X86指令来说,如果想使用更大宽度的立即数,它可以很容易的扩展,因为它的指令没有限制长度。但是MIPS指令就不行,它的指令总长度就是32位的,再加上各个寄存器位域的使用,所以I型指令最多只能使用十六位的立即数。

分支指令

  Branch :改变控制流,相当于X86中的转移指令

  Conditional Branch

    条件分支:根据比较的结果改变控制流

    两条指令: branch if equal (beq); branch if not equal (bne)

  Unconditional Branch

    非条件分支:无条件地改变控制流

    一条指令:jump ( j )

条件分支指令(I型)

  条件分支

    beq  rs ,  rt , imm  # opcode=4

    bne  rs ,  rt , imm    #  opcode=5  

  格式:beq  reg1,reg2,L1  (beq指令,它共有三个操作数,前两个是寄存器操作数,第三个操作数是存储器地址,也就是一个立即数,CPU会判断第一个寄存器当中的数和第二个寄存器当中的数是否相等。如果相等就跳转到L1所指向的寄存器单元取出下一条指令,否则顺序执行beq之后的那条指令)

      if(value in reg1)==(value in reg2)

        goto L1

  这里和X86的条件转移指令有很大的不同,MIPS没有标志寄存器,它就在一条指令当中即进行了比较,又完成了转移,MIPS全称就是为了减少指令流水线的互锁,也就是尽量避免不同指令之间相互的影响。而标志位这件事,就是前一条指令运行的结果,可能会对后面的某条指令产生影响,这是MIPS指令设计时要尽量避免的,所以beq指令也很好的体现了MIPS的这一设计理念。

  条件分支指令的目标地址范围,在MIPS中,指向下一条指令地址的寄存器为PC,类似于X86中的IP寄存器,这个寄存器,是指向32位地址的,如果以当前PC寄存器为基准,16位位移量可以表示出当前指令前后2^15字节这么一个范围,MIPS指令长度固定为32个bit,因此每条指令的位置,一定会在4个字节对齐的地方,这样的地址最低两位肯定位0,所以我们实际上可以用十六位的位移量去指示每四个字节为一个单位的地址,这样就可以把目标地址的范围扩大四倍,可以达到前后128KB。

  目标地址计算:

    分支条件不成立,PC=PC+4= next instruction

    分支条件成立,PC=(PC+4)+(immediate*4)

 非条件分支指令(J型)

opcode address
6-bit 26-bit

                                                                                        J型指令

  目标地址计算方法:New PC={(PC+4)[ 31..28 ] , address , 00 }  (下一条指令的地址的计算方法是当前的PC加四之后,取最高的四位,再加上J型指令编码中的26位,然后在末尾添加两个零)

  J型指令的目标地址范围:前后2^28字节(前后256MB)

非条件分支指令(R型)

  如何到达更远的目标地址

    可以两次调用J指令,第一条J指令尽可能调到最远的地方,然后在那个目标地址再放一条J指令。或者使用 jr 指令,jr 指令有一个寄存器操作数,可以把要转移的目标地址放到寄存器当中,这样可以使用32位的目标地址,就用原来的 r 型指令就可以很好的实现,只用占用其中的一个寄存器位域, 然后新增一种function的编码就可以了。

原文地址:https://www.cnblogs.com/dreamingoutloudly/p/13067099.html