计算机组成的⼀些总结(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-bit5-bit5-bit5-bit5-bit6-bit
R型指令
I型指令的格式
R型指令只有⼀个5-bit域(移位域)表⽰⽴即数,范围为0~31
opcode rs rt immediate
6-bit5-bit5-bit16-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-bit26-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的编码就可以了。