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,表示操作失败。