MIPS有多种意思,具体如下:
1、MIPS:机器语言指令数
MIPS(Million Instructions Per Second):单字长定点指令平均执行速度 Million Instructions Per Second的缩写,每秒处理的百万级的机器语言指令数,这是衡量CPU速度的一个指标。
像是一个Intel80386 电脑可以每秒处理3百万到5百万机器语言指令,即我们可以说80386是3到5MIPS的CPU。MIPS只是衡量CPU性能的指标。
2、MIPS:嵌入式系统
MIPS架构(英语:MIPS architecture,为Microprocessor without interlocked piped stages architecture的缩写,是一种采取精简指令集(RISC)的处理器架构,1981年出现,由MIPS科技公司开发并授权,广泛被使用在许多电子产品、网络设备、个人娱乐装置与商业装置上。
3、MIPS:处理器
MIPS是世界上很流行的一种RISC处理器。MIPS的意思是“无内部互锁流水级的微处理器”(Microprocessor without interlocked pipelined stages),其机制是尽量利用软件办法避免流水线中的数据相关问题。
它最早是在80年代初期由斯坦福(Stanford)大学Hennessy教授领导的研究小组研制出来的。MIPS公司的R系列就是在此基础上开发的RISC工业产品的微处理器。这些系列产品为很多计算机公司采用构成各种工作站和计算机系统。
mips汇编中常用的指令:
(1)mips指令中字段的命名:
op(6bit):指令的操作码
rs(5bit):第一源操作数寄存器
rt(5bit):第二源操作数寄存器
rd(5bit):存放结果的目的寄存器
shamt(5bit):偏移量
funct(6bit):功能码
(2)mips指令类型:
R型: op rs rt rd funct
I型: op rs rt immediate(12bit)
J型: op immediate(16bit)
R型指令:
add(求和) add $1, $2, $3 ' 寄存器寻址方式 $1=$2 + $3 寄存器2,3的值加起来赋给寄存器1 '
sub(求差) sub $1, $2, $3 ' $1=$2 - $3 '
and(与) and $1, $2, $3 ' $1=$2 & $3 '
or(或) or $1, $2, $3 ' $1=$2 | $3 '
nor(异或) nor $1, $2, $3
slt(三目运算) slt $1, $2, $3 ' if($2 < $3) $1 =1 else $1 = 0 '
sltu(无符号三目运算) sltu $1, $2, $3 '三个寄存器内的数都是无符号的'
sll(循环左移) sll $1, $2, 10 ' $1 = $2 << 10 '
srl(循环右移) srl $1, $2, 10 ' $1 = $2 >> 10 '
sra(保留符号位的循环左移) sra $1, $2, 10 ' $1 = $2 << 10(符号位保留)'
sllv sllv $1, $2, $3 ' $1 = $2 << $3'
srlv srlv $1, $2, $3 ' $1 = $2 >> $3'
Ih Ih $1, 10($2) 基址寻址
Sh Sh $1, 10($2) 基址寻址
lb Ib $1, 10($2) 基址寻址
ll Il $1, 10($2) 基址寻址
sc sc $1, 10($2) 基址寻址
div/divu : div des, src1, src2 'des = src1/src2(表示无符号的数) '
abs : abs des, src 'des = |src|src的绝对值给des '
mul : mul des, src1, src2 'des = src1*src2 '
seq/seq(u): seq des, src1, src2 'if(src1 == src2) des = 1 else des = 0 '
sgt : sgt des, src1, src2 'if(src1>src2) des = 1 else des = 0 '
sle : sle des, src1, src2 'if(src1< = src2) des = 1 else des = 0 '
slt : slt des, src1, src2 'if(src1
I型指令:
addi(求和) : addi $1, $2, 10 ' $1 = $2 + 10 '
subi(求差) : subi $1, $2, 10 ' $1 = $2 - 10 '
andi(与) : addi $1, $2, 10 ' $1 = $2 & 10 '
ori(或) : ori $1, $2, 10 ' $1 =$2 | 10 '
lui : lui $1, 100 ' 将100加载到$1寄存器的高16bit'
lw : lw $1, 10($2) ' 加载$2寄存器开始偏移10字节的地址的内容到$1寄存器'
sw : sw $1, 10($2) ' 保存$1的内容到$2寄存器开始偏移10字节的地址上'
beq : beq $1, $2, 10 ' if($1 == $2) goto 10(lable 10 的位置)'
bne : bne $1, $2, 10 ' if($1 != $2) goto 10 '
slti : slti $1, $2, 10 ' if( $2 <10) $1=1 else $1=0'
sltiu : sltiu $1, $2, 10 '10为无符号的数'
J型指令:
j : j lable '跳转到lable处 '
jar: j $1 '跳转到$1寄存器存储的地址处'
jal: jal lable1 '跳转到lable1标签处'
合成指令:
b 跳转
b和下面的其中一个或者下面一个以及z(zero)所构成的指令均为跳转指令:例如beq/beqz
eq 相等
ne 不等
ge 大于等于
gt 大于
le 小于等于
lt 小于
伪指令:
.globl __start 设置全局标签
lable: 设置局部标签lable
.ascii s 符合ascii码组成的字符串
.asciiz s like .ascii, null-terminated
.word w1, w2 一个字长(32bit)的数据w1 w2
.half h1, h2 半字节长(16bit)的数据
.byte b1,b2 一个字节的数据
.float f1, f2 32-bit single precision floating point numbers f1, f2, . . .
.double d1, d2 64-bit double precision floating point numbers d1, d2, . . .
.space n n zero bytes
.set push 保存所有设置
.set pop 重新保存设置
.set reorde 允许编译器优化指令,对代码进行优化排序
.set noreorde 不允许编译器优化指令,对代码进行优化排序
.set at/noat 使用/不是用at寄存器
.set mips 0 支持原来的ISA级别(小心使用)
.set mips 3 面的指令是mips64指令,兼容mips32的指令
.set volatile/novolatile 处在volatile区内的所有存取指令都不会被移动位置
.align 7 .align区内的代码必须使用2的7次方字节大小的内存空间
【3】MIPS架构特点
(1)独立的指令缓存和数据缓存
(2)每个指令的执行都分为五个阶段及五条流水线
(3)所有指令都一样长32bit这就是为什么mips指令的二进制文件要比同样x86的二进制文件大的原因
(4)无条件码
(5)三操作数指令(算数/逻辑操作不想要指明内存地址)
(6)没有字节或者半字节运算
(7)没有专门的栈支持
(8)最小子程序支持,跳转指令的限制(b上下64k内,J上下64M内)
【4】MIPS指令的五条流水线
IF:取指,从指令缓存I-cache中取出指令
RD:读寄存器,从指令中源寄存器或者cpu中的某一个寄存器中读取内容
ALU:算数逻辑单元,在一个时钟周期内完成算法或逻辑操作
MEM:指令从数据缓存中读写内存变量
WB:写回,将操作完成的值写回到寄存器中