转自http://blog.chinaunix.net/uid-23100434-id-10398.html
MIPS是世界上很流行的一种RISC处理器。MIPS的意思是“无内部互锁流水级的微处理器”(Microprocessor without interlocked piped stages),其机制是尽量利用软件办法避免流水线中的数据相关问题。它最早是在80年代初期由斯坦福(Stanford)大学Hennessy教授领导的研究小组研制出来的。MIPS公司的R系列就是在此基础上开发的RISC工业产品的微处理器。这些系列产品为很多计算机公司采用构成各种工作站和计算机系统。
数据类型 |
CPU |
协处理器1和2 |
|||
加载无符号数 |
加载有符号数 |
存储 |
加载 |
存储 |
|
字节 |
MIPS32 |
MIPS32 |
MIPS32 |
|
|
半字 |
MIPS32 |
MIPS32 |
MIPS32 |
|
|
字 |
MIPS32 |
MIPS32 |
MIPS32 |
MIPS32 |
MIPS32 |
双字(FPU) |
|
|
|
MIPS32 |
MIPS32 |
未对齐字 |
MIPS32 |
|
MIPS32 |
|
|
关联字(原子修改) |
MIPS32 |
|
MIPS32 |
|
|
助记符 |
指令格式 |
指令功能 |
实例 |
LB |
LB rt , offset (base) |
加载字节 |
LB a0, 4 (a1) |
LBU |
LBU rt , offset (base) |
加载无符号字节 |
LBU t0 , 7 (t3) |
SB |
SB rt , offset (base) |
存储字节 |
SB a0 , 3 (a3) |
LH |
LH rt , offset (base) |
加载半字 |
LH s2 , 5 (s5) |
LHU |
LHU rt , offset (base) |
加载无符号半字 |
LHU t0 , 6 (t3) |
SH |
SH rt , offset (base) |
存储半字 |
SH s4, 18 (s1) |
LW |
LW rt , offset (base) |
加载字 |
LW v0 ,6 (a1) |
SW |
SW rt , offset (base) |
存储字 |
SW s6 , 1 (t3) |
LWL* |
LWL rt , offset (base) |
加载字头 |
LWL a1 , 3 (t0) |
LWR* |
LWR rt , offset (base) |
加载字尾 |
LWR s2 , 5(a2) |
SWL* |
SWL rt , offset (base) |
存储字头 |
SWL s5 , 3 (t4) |
SWR* |
SWR rt , offset (base) |
存储字尾 |
SWR a3 , 8 (a0) |
LL* |
LL rt , offset (base) |
加载关联 |
LL t1 , 0 (t0) |
SC* |
SC rt , offset (base) |
条件存储 |
SC t2, 0 (t0) |
MIPS加载和存储指令的命名规则如下:
1) 首字母L表示加载(Load),S表示存储(Store)
2) 首字母U表示无符号(Unsigned),其余默认为有符号(Signed)
3) 尾字母R表示右(Right),L表示左(Left)
4) 字母B示字节(Byte),H表示半字(Halfword),W表示字(Word)
指令 |
功能 |
应用实例 |
LB |
从存储器中读取一个字节的数据到寄存器中 |
LB R1, 0(R2) |
LH |
从存储器中读取半个字的数据到寄存器中 |
LH R1, 0(R2) |
LW |
从存储器中读取一个字的数据到寄存器中 |
LW R1, 0(R2) |
LD |
从存储器中读取双字的数据到寄存器中 |
LD R1, 0(R2) |
L.S |
从存储器中读取单精度浮点数到寄存器中 |
L.S R1, 0(R2) |
L.D |
从存储器中读取双精度浮点数到寄存器中 |
L.D R1, 0(R2) |
LBU |
功能与LB指令相同,但读出的是不带符号的数据 |
LBU R1, 0(R2) |
LHU |
功能与LH指令相同,但读出的是不带符号的数据 |
LHU R1, 0(R2) |
LWU |
功能与LW指令相同,但读出的是不带符号的数据 |
LWU R1, 0(R2) |
SB |
把一个字节的数据从寄存器存储到存储器中 |
SB R1, 0(R2) |
SH |
把半个字节的数据从寄存器存储到存储器中 |
SH R1,0(R2) |
SW |
把一个字的数据从寄存器存储到存储器中 |
SW R1, 0(R2) |
SD |
把两个字节的数据从寄存器存储到存储器中 |
SD R1, 0(R2) |
S.S |
把单精度浮点数从寄存器存储到存储器中 |
S.S R1, 0(R2) |
S.D |
把双精度数据从存储器存储到存储器中 |
S.D R1, 0(R2) |
DADD |
把两个定点寄存器的内容相加,也就是定点加 |
DADD R1,R2,R3 |
DADDI |
把一个寄存器的内容加上一个立即数 |
DADDI R1,R2,#3 |
DADDU |
不带符号的加 |
DADDU R1,R2,R3 |
DADDIU |
把一个寄存器的内容加上一个无符号的立即数 |
DADDIU R1,R2,#3 |
ADD.S |
把一个单精度浮点数加上一个双精度浮点数,结果是单精度浮点数 |
ADD.S F0,F1,F2 |
ADD.D |
把一个双精度浮点数加上一个单精度浮点数,结果是双精度浮点数 |
ADD.D F0,F1,F2 |
ADD.PS |
两个单精度浮点数相加,结果是单精度浮点数 |
ADD.PS F0,F1,F2 |
DSUB |
两个寄存器的内容相减,也就是定点数的减 |
DSUB R1,R2,R3 |
DSUBU |
不带符号的减 |
DSUBU R1,R2,R3 |
SUB.S |
一个双精度浮点数减去一个单精度浮点数,结果为单精度 |
SUB.S F1,F2,F3 |
SUB.D |
一个双精度浮点数减去一个单精度浮点数,结果为双精度浮点数 |
SUB.D F1,F2,F3 |
SUB.PS |
两个单精度浮点数相减 |
SUB.SP F1,F2,F3 |
DDIV |
两个定点寄存器的内容相除,也就是定点除 |
DDIV R1,R2,R3 |
DDIVU |
不带符号的除法运算 |
DDIVU R1,R2,R3 |
DIV.S |
一个双精度浮点数除以一个单精度浮点数,结果为单精度浮点数 |
DIV.S F1,F2,F3 |
DIV.D |
一个双精度浮点数除以一个单精度浮点数,结果为双精度浮点数 |
DIV.D F1,F2,F3 |
DIV.PS |
两个单精度浮点数相除,结果为单精度 |
DIV.PS F1,F2,F3 |
DMUL |
两个定点寄存器的内容相乘,也就是定点乘 |
DMUL R1,R2,R3 |
DMULU |
不带符号的乘法运算 |
DMULU R1,R2,R3 |
MUL.S |
一个双精度浮点数乘以一个单精度浮点数,结果为单精度浮点数 |
DMUL.S F1,F2,F3 |
MUL.D |
一个双精度浮点数乘以一个单精度浮点数,结果为双精度浮点数 |
DMUL.D F1,F2,F3 |
MUL.PS |
两个单精度浮点数相乘,结果为单精度浮点数 |
DMUL.PS F1,F2,F3 |
AND |
与运算,两个寄存器中的内容相与 |
ANDR1,R2,R3 |
ANDI |
一个寄存器中的内容与一个立即数相与 |
ANDIR1,R2,#3 |
OR |
或运算,两个寄存器中的内容相或 |
ORR1,R2,R3 |
ORI |
一个寄存器中的内容与一个立即数相或 |
ORIR1,R2,#3 |
XOR |
异或运算,两个寄存器中的内容相异或 |
XORR1,R2,R3 |
XORI |
一个寄存器中的内容与一个立即数异或 |
XORIR1,R2,#3 |
BEQZ |
条件转移指令,当寄存器中内容为0时转移发生 |
BEQZ R1,0 |
BENZ |
条件转移指令,当寄存器中内容不为0时转移发生 |
BNEZ R1,0 |
BEQ |
条件转移指令,当两个寄存器内容相等时转移发生 |
BEQ R1,R2 |
BNE |
条件转移指令,当两个寄存器中内容不等时转移发生 |
BNE R1,R2 |
J |
直接跳转指令,跳转的地址在指令中 |
J name |
JR |
使用寄存器的跳转指令,跳转地址在寄存器中 |
JR R1 |
JAL |
直接跳转指令,并带有链接功能,指令的跳转地址在指令中,跳转发生时要把返回地址存放到R31这个寄存器中 |
JAL R1 name |
JALR |
使用寄存器的跳转指令,并且带有链接功能,指令的跳转地址在寄存器中,跳转发生时指令的放回地址放在R31这个寄存器中 |
JALR R1 |
MOV.S |
把一个单精度浮点数从一个浮点寄存器复制到另一个浮点寄存器 |
MOV.S F0,F1 |
MOV.D |
把一个双精度浮点数从一个浮点寄存器复制到另一个浮点寄存器 |
MOV.D F0,F1 |
MFC0 |
把一个数据从通用寄存器复制到特殊寄存器 |
MFC0 R1,R2 |
MTC0 |
把一个数据从特殊寄存器复制到通用寄存器 |
MTC0 R1,R2 |
MFC1 |
把一个数据从定点寄存器复制到浮点寄存器 |
MFC1 R1,F1 |
MTC1 |
把一个数据从浮点寄存器复制到定点寄存器 |
MTC1 R1,F1 |
LUI |
把一个16位的立即数填入到寄存器的高16位,低16位补零 |
LUI R1,#42 |
DSLL |
双字逻辑左移 |
DSLL R1,R2,#2 |
DSRL |
双字逻辑右移 |
DSRL R1,R2,#2 |
DSRA |
双字算术右移 |
DSRA R1,R2,#2 |
DSLLV |
可变的双字逻辑左移 |
DSLLV R1,R2,#2 |
DSRLV |
可变的双字罗伊右移 |
DSRLV R1,R2,#2 |
DSRAV |
可变的双字算术右移 |
DSRAV R1,R2,#2 |
SLT |
如果R2的值小于R3,那么设置R1的值为1,否则设置R1的值为0 |
SLT R1,R2,R3 |
SLTI |
如果寄存器R2的值小于立即数,那么设置R1的值为1,否则设置寄存器R1的值为0 |
SLTI R1,R2,#23 |
SLTU |
功能与SLT一致,但是带符号的 |
SLTU R1,R2,R3 |
SLTUI |
功能与SLT一致,但不带符号 |
SLTUI R1,R2,R3 |
MOVN |
如果第三个寄存器的内容为负,那么复制一个寄存器的内容到另外一个寄存器 |
MOVN R1,R2,R3 |
MOVZ |
如果第三个寄存器的内容为0,那么复制一个寄存器的内容到另外一个寄存器 |
MOVZ R1,R2,R3 |
TRAP |
根据地址向量转入管态 |
|
ERET |
从异常中返回到用户态 |
|
MADD.S |
一个双精度浮点数与单精度浮点数相乘加,结果为单精度 |
|
MADD.D |
一个双精度浮点数与单精度浮点数相乘加,结果为双精度 |
|
MADD.PS |
两个单精度浮点数相乘加,结果为单精度 |
|