MIPS寄存器

MIPS指令表

指令 示例 含义 注释
加法 add \\(s1,\\\)s2,\\(s3 | \\\)s1=\\(s2+\\\)s3
减法 sub \\(s1,\\\)s2,\\(s3 | \\\)s1=\\(s2-\\\)s3
立即数加法 addi \\(s1,\\\)s2,20 \$s1=\\(2+20 | | | 取字 | lw \\\)s1,20(\\(s2) | \\\)s1=memory[\$s2+20] | | | 存字 | sw \\(s1,20(\\\)s2) | memory[\$s2+20]=\\(s1 | | | 取半字 | lh \\\)s1,20(\\(s2) | memory[\\\)s2+20]=\\(s1 | 从地址20(\\\)s2)开始取半字(16biwordts)(h==halfword)
取无符号半字 lhu \\(s1,20(\\\)s2)
存半字 sh \\(s1,20(\$s2) | | | | 取字节 | lb \\\)s1,20(\\(s2) | | | | 取无符号字节 | lbu \\\)s1,20(\\(s2) | | | | 存字节 | sb \\\)s1,20(\\(s2) | | | | 取链接字 | ll \\\)s1,20($s2) 是原子交换的前半部分
存条件字 sc \\(s1,20(\\\)s2) 是原子交换的后半部分
取立即数的最高位 lui \\(s1,20 | \\\)s1=20*2^{16} 取立即数并放到高16位
and \\(s1,\\\)s2,\\(s3 | \\\)s1=\\(s2 & \\\)s3
or \\(s1,\\\)s2,\\(s3 | \\\)s1=\\(s2 bitor \\\)s3
或非 or \\(s1,\\\)s2,\\(s3 | \\\)s1=~(\\(s2 bitor \\\)s3)
立即数与 andi \\(s1,\\\)s2,20 \\(s1=\\\)s2 & 20
立即数或 ori \\(s1,\\\)s2,20 \\(s1=\\\)s2 bitor 20
逻辑左移 sll \\(s1,\\\)s2,10 \\(s1=\\\)s2*4(左移两位)
逻辑右移 srl \\(s1,\\\)s2,20
相等时跳转 beq \\(s1,\\\)s2,25 if(\\(s1==\\\)s2) goto PC+4+100
不相等时跳转 bne \\(s1,\\\)s2,25 if(\$s1!=\\(2) goto PC+4+100 | | | 小于时置位 | slt \\\)s1,\\(s2,\\\)s3 if(\\(s2<\\\)s3) \\(s1=1 else \\\)s1=0
无符号数比较小于时置位 sltu \\(s1,\\\)s2,\\(s3 | if(\\\)s2<\\(s3) \\\)s1=1 else \\(s1=0 | 比较是否小于无符号数 | | 无符号数比较小于立即数时置位 | slti \\\)s1,\\(s2,20 | if(\\\)s2<20) \\(s1=1 else \\\)s1=0 比较是否小于常数
无符号数比较小于无符号数时置位 sltiu \\(s1,\\\)s2,20 if(\\(s2<20) \\\)s1=1 else \\(s1=0 | 比较是否小于无符号常数 | | 跳转 | j 2500 | goto 10000 | 跳转到目标地址 | | 跳转到寄存器所指位置 | jr \\\)ra goto \$
跳转并链接 jal 2500 \$ra=PC+4; goto 10000 用于过程调用

MIPS32指令集文档:https://s3-eu-west-1.amazonaws.com/downloads-mips/documents/MD00086-2B-MIPS32BIS-AFP-6.06.pdf

三种指令格式

  • R-型
op rs rt rd shamt funct
6bits 5bits 5bits 5bits 5bits 6bits

其中:

  • op:操作码
  • rs:第一个源寄存器编号
  • rt:第二个源寄存器编号
  • rd:destination目的寄存器编号
  • shamt:移位位数(00000表示不移位),仅在位移指令中使用
  • funct:功能码,用于选择op操作中的具体函数,如运算操作中的加法函数
  • R-型指令包括:add,sub,and,or,nor,slt,sltu,sll,srl,jr

  • I-型指令

op rs rt constant or address
6bits 5bits 5bits 16bits

其中:

  • op:操作码
  • rs:第一个源操作数寄存器号,参与运算使用
  • rt:第二个源操作数寄存器号,参与运算使用
  • 16位立即数
  • I-型指令包括:addi,lw,sw,lh,sh,lb,sb,ll,sc,lui,andi,ori,beq,bne,slti,sltiu

  • J-型指令

op address
6bits 26bits
  • 目标地址计算方法:dst=PC+4+address<<2(下一条指令的地址时当前PC加上4后,取最高的四位,再加上J型指令编码中的26位左移2位(×4)的结果)
  • J-型指令有:j, jr, jal

  • MIPS中的同步

    • 背景:处理器共享存储器同一区域,P1写,P2读。P1写的结果是P2要读的值,如果P1和P2不同步,将会发生数据竞争

    • 解决方法:依赖硬件提供同步指令,即原子读/写内存操作

    • MIPS中靠ll和sc这两个指令实现同步

      LL 指令的功能是从内存中读取一个字,以实现接下来的 RMW(Read-Modify-Write) 操作;SC 指令的功能是向内存中写入一个字,以完成前面的 RMW 操作。LL/SC 指令的独特之处在于,它们不是一个简单的内存读取/写入的函数,当使用 LL 指令从内存中读取一个字之后,比如 LL d, off(b),处理器会记住 LL 指令的这次操作(会在 CPU 的寄存器中设置一个不可见的 bit 位),同时 LL 指令读取的地址 off(b) 也会保存在处理器的寄存器中。接下来的 SC 指令,比如 SC t, off(b),会检查上次 LL 指令执行后的 RMW 操作是否是原子操作(即不存在其它对这个地址的操作),如果是原子操作,则 t 的值将会被更新至内存中,同时 t 的值也会变为1,表示操作成功;反之,如果 RMW 的操作不是原子操作(即存在其它对这个地址的访问冲突),则 t 的值不会被更新至内存中,且 t 的值也会变为0,表示操作失败。