MIPS32指令集
来源:互联网 发布:mac影音播放器 编辑:程序博客网 时间:2024/06/05 05:10
MIPS32指令集
MIPS指令可以分成以下各类:
空操作no-op;
寄存器/寄存器传输:用得很广,包括条件传输在内;
常数加载:作为数值和地址的整型立即数;
算术/逻辑指令;
整数乘法、除法和求余数;
整数乘加;
加载和存储;
跳转、子程序调用和分支;
断点和自陷;
CP0功能:CPU控制指令
浮点;
用户态的受限访问:rdhwr和synci
注:64位版本开头以“d”表示,无符号数以“u”结尾,立即数通常以“i”结尾,字节操作以“b”结尾,双字操作以“d”结尾,字操作以“w”结尾
1、空操作:nop:相当于 sll zero,zero,o,
ssnop: equals sll zero,zero,1.
这个指令不得与其它指令同时发送,这样就保证了其运行要花费至少一个时钟周期。这在简单的流水线的CPU上无关紧要,但在复杂些的实现上对于实现强制的延时很有用。
2、寄存器/寄存器传送:
move: 通常用跟$zero寄存器的or来实现,或者用addu。
movf, movt, movn, movz: 条件传送。
3、常数加载:
dla、la: 用来加载程序中某些带标号的位置或者变量的地址的宏指令;
dli、li: 装入立即数常数,这是一个宏指令;
lui: 把立即数加载到寄存器高位。
4、算术/逻辑运算:
add、addi、dadd、daddi、addu、addiu、daddu、daddiu、dsub、sub、subu:加法指令和减法指令;
abs,dabs:绝对值;
dneg、neg、negu:取相反数;
and、andi、or、ori、xor、nor:逐位逻辑操作指令;
drol、rol、ror:循环移位指令;
sll、srl、sra:移位。
5、条件设置指令:
slt、slti、sltiu、sltu、seq、sge、sle、sne:条件设置。
6、整数乘法、除法和求余数:
div、mul、rem等等。
7、整数乘加(累加):
mad等。
8、加载和存储:
lb、ld、ldl、ldr、sdl、sdr、lh、lhu、ll、sc、pref、sb等操作。
9、浮点加载和存储:
l.d、l.s、s.d、s.s等
常用MIPS指令集及格式:
MIPS 指令集(共31条)
助记符
指令格式
示例
示例含义
操作及其解释
Bit #
31..26
25..21
20..16
15..11
10..6
5..0
R-type
op
rs
rt
rd
shamt
func
add
000000
rs
rt
rd
00000
100000
add $1,$2,$3
$1=$2+$3
rd <- rs + rt ;其中rs=$2,rt=$3, rd=$1
addu
000000
rs
rt
rd
00000
100001
addu $1,$2,$3
$1=$2+$3
rd <- rs + rt ;其中rs=$2,rt=$3, rd=$1,无符号数
sub
000000
rs
rt
rd
00000
100010
sub $1,$2,$3
$1=$2-$3
rd <- rs - rt ;其中rs=$2,rt=$3, rd=$1
subu
000000
rs
rt
rd
00000
100011
subu $1,$2,$3
$1=$2-$3
rd <- rs - rt ;其中rs=$2,rt=$3, rd=$1,无符号数
and
000000
rs
rt
rd
00000
100100
and $1,$2,$3
$1=$2 & $3
rd <- rs & rt ;其中rs=$2,rt=$3, rd=$1
or
000000
rs
rt
rd
00000
100101
or $1,$2,$3
$1=$2 | $3
rd <- rs | rt ;其中rs=$2,rt=$3, rd=$1
xor
000000
rs
rt
rd
00000
100110
xor $1,$2,$3
$1=$2 ^ $3
rd <- rs xor rt ;其中rs=$2,rt=$3, rd=$1(异或)
nor
000000
rs
rt
rd
00000
100111
nor $1,$2,$3
$1=~($2 | $3)
rd <- not(rs | rt) ;其中rs=$2,rt=$3, rd=$1(或非)
slt
000000
rs
rt
rd
00000
101010
slt $1,$2,$3
if($2<$3)
$1=1 else
$1=0
if (rs < rt) rd=1 else rd=0 ;其中rs=$2,rt=$3, rd=$1
sltu
000000
rs
rt
rd
00000
101011
sltu $1,$2,$3
if($2<$3)
$1=1 else
$1=0
if (rs < rt) rd=1 else rd=0 ;其中rs=$2,rt=$3, rd=$1
(无符号数)
sll
000000
00000
rt
rd
shamt
000000
sll $1,$2,10
$1=$2<<10
rd <- rt << shamt ;shamt存放移位的位数,
也就是指令中的立即数,其中rt=$2, rd=$1
srl
000000
00000
rt
rd
shamt
000010
srl $1,$2,10
$1=$2>>10
rd <- rt >> shamt ;(logical) ,其中rt=$2, rd=$1
sra
000000
00000
rt
rd
shamt
000011
sra $1,$2,10
$1=$2>>10
rd <- rt >> shamt ;(arithmetic) 注意符号位保留
其中rt=$2, rd=$1
sllv
000000
rs
rt
rd
00000
000100
sllv $1,$2,$3
$1=$2<<$3
rd <- rt << rs ;其中rs=$3,rt=$2, rd=$1
srlv
000000
rs
rt
rd
00000
000110
srlv $1,$2,$3
$1=$2>>$3
rd <- rt >> rs ;(logical)其中rs=$3,rt=$2, rd=$1
srav
000000
rs
rt
rd
00000
000111
srav $1,$2,$3
$1=$2>>$3
rd <- rt >> rs ;(arithmetic) 注意符号位保留
其中rs=$3,rt=$2, rd=$1
jr
000000
rs
00000
00000
00000
001000
jr $31
goto $31
PC <- rs
I-type
op
rs
rt
immediate
addi
001000
rs
rt
immediate
addi $1,$2,100
$1=$2+100
rt <- rs + (sign-extend)immediate ;其中rt=$1,rs=$2
addiu
001001
rs
rt
immediate
addiu $1,$2,100
$1=$2+100
rt <- rs + (zero-extend)immediate ;其中rt=$1,rs=$2
andi
001100
rs
rt
immediate
andi $1,$2,10
$1=$2 & 10
rt <- rs & (zero-extend)immediate ;其中rt=$1,rs=$2
ori
001101
rs
rt
immediate
andi $1,$2,10
$1=$2 | 10
rt <- rs | (zero-extend)immediate ;其中rt=$1,rs=$2
xori
001110
rs
rt
immediate
andi $1,$2,10
$1=$2 ^ 10
rt <- rs xor (zero-extend)immediate ;其中rt=$1,rs=$2
lui
001111
00000
rt
immediate
lui $1,100
$1=100*65536
rt <- immediate*65536 ;将16位立即数放到目标寄存器高16
位,目标寄存器的低16位填0
lw
100011
rs
rt
immediate
lw $1,10($2)
$1=memory[$2
+10]
rt <- memory[rs + (sign-extend)immediate] ;rt=$1,rs=$2
sw
101011
rs
rt
immediate
sw $1,10($2)
memory[$2+10]
=$1
memory[rs + (sign-extend)immediate] <- rt ;rt=$1,rs=$2
beq
000100
rs
rt
immediate
beq $1,$2,10
if($1==$2)
goto PC+4+40
if (rs == rt) PC <- PC+4 + (sign-extend)immediate<<2
bne
000101
rs
rt
immediate
bne $1,$2,10
if($1!=$2)
goto PC+4+40
if (rs != rt) PC <- PC+4 + (sign-extend)immediate<<2
slti
001010
rs
rt
immediate
slti $1,$2,10
if($2<10)
$1=1 else
$1=0
if (rs <(sign-extend)immediate) rt=1 else rt=0 ;
其中rs=$2,rt=$1
sltiu
001011
rs
rt
immediate
sltiu $1,$2,10
if($2<10)
$1=1 else
$1=0
if (rs <(zero-extend)immediate) rt=1 else rt=0 ;
其中rs=$2,rt=$1
J-type
op
address
j
000010
address
j 10000
goto 10000
PC <- (PC+4)[31..28],address,0,0 ;address=10000/4
jal
000011
address
jal 10000
$31<-PC+4;
goto 10000
$31<-PC+4;PC <- (PC+4)[31..28],address,0,0
;address=10000/4
32个寄存器:
寄存器号 符号名 用途
0 始终为0 看起来象浪费,其实很有用
1 at 保留给汇编器使用
2-3 v0,v1 函数返回值
4-7 a0-a3 前头几个函数参数
8-15 t0-t7 临时寄存器,子过程可以不保存就使用
24-25 t8,t9 同上
16-23 s0-s7 寄存器变量,子过程要使用它必须先保存
然后在退出前恢复以保留调用者需要的值
26,27 k0,k1 保留给异常处理函数使用
28 gp global pointer;用于方便存取全局或者静态变量
29 sp stack pointer
30 s8/fp 第9个寄存器变量;子过程可以用它做frame pointer
31 ra 返回地址
硬件上这些寄存器并没有区别(除了0号),区分的目的是为了不同的编译器产生的代码可以通用
- MIPS32指令集
- MIPS32指令集
- MIPS32指令集
- 自己动手写处理器之第一阶段(3)——MIPS32指令集架构简介
- 自己动手写CPU之第九阶段(7)——MIPS32中的LL、SC指令说明
- 自己动手写CPU之第九阶段(8)——MIPS32中的LL、SC指令说明
- MIPS32->MIPS16E
- MIPS32的内部寄存器
- MIPS32 34K多线程处理器内核系列
- 指令集
- 指令集
- 指令集
- ARM指令集--移位指令
- ARM 指令集>>跳转指令
- ARM指令集 LDR指令
- ARM 指令集 比较指令
- arm指令集比较指令
- arm指令集分支指令
- [G+smo]gsMFunctionExpr
- netstat用法记录
- php发送邮件
- Java HasSet 不保证数据放入后再取出时顺序是一致的
- Neural Networks and Deep Learning
- MIPS32指令集
- 使用辗转相除法求得最大公约数
- Chrome 编译错误汇总
- 字符串删减函数
- shell 中的替换文本命令
- Thinkphp3.1.3学习——2、配置文件(单入口时)
- snmp网络协议总结一二
- css 选择器
- B. Han Solo and Lazer Gun