欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

精简指令集(MIPS为例)常用指令特点及其格式

程序员文章站 2022-04-19 08:52:43
...

精简指令集(MIPS为例)常用指令特点及其格式

一、指令集

指令集是指一台计算机的全部指令;不同的计算机有不同的指令集,但是在许多方面都有共同之处。早期的计算机有非常简单的指令集:实现简单,许多现代计算机也有简单的指令集。因此,指令集具有精简指令集(RISC)与复杂指令集(CISC)之分,本文主要介绍精简指令集,并以其中的MIPS为例展开。

二、设计原则

设计原则1: 简单源于规整
规整使得实现更简单
简单使得以较低成本实现更高性能成为可能
设计原则2: 越小越快
设计原则3: 加速执行常用操作

小常数出现频率高
立即数操作避免load指令
设计原则4:优秀的设计需要适宜的折中方案
不同的指令格式使译码变得复杂, 但是允许所有指令统一32-bit 字长
使格式尽可能相似

三、常用指令

常用指令汇总

	add rd,rs,rt
		rd=rs+rt;
	sub rd,rs,rt
		rd=rs-rt;
	addi rt,rs,constant
		rt=rs+constant;
	lw rt,rs,constant
		rt=Address(rs+constant/4);//Address(rs+constant/4)表示:rs对应的数组,索引为constant/4的取值
	lw rt,rs,constant
		Address(rs+constant/4)=rt;
	sll rt,rs,constant
		rt=rs<<4;
	srl rt,rs,constant
		rt=rs>>4;
	and rd,rs,rt
		rd=rs&rt;//按位与,还有andi
	or rd,rs,rt
		rd=rs|rt;//按位或,还有ori
	nor rd,rs,rt//rt取$zero
		rd=rs~rt;//按位取反
	beq rs,rt,L1
		if (rs == rt) 分支跳转到指令L1;
	bne rs, rt, L1
		if (rs != rt) 分支跳转到指令L1;
	j L1
		无条件跳转到指令 L1
	slt rd,rs,rt
		if (rs<rt) rd=1; else rd=0;
	slti rt,rs,constant
		if (rs<constant) rt=1; else rt=0;
	带符号数比较:slt, slti
	无符号数比较:sltu, sltiu
	例如:
		$s0 = 1111 1111 1111 1111 1111 1111 1111 1111
		$s1 = 0000 0000 0000 0000 0000 0000 0000 0001
	slt $t0,$s0,$s1  # signed1 < +1 ===> $t0 = 1
	sltu $t0,$s0,$s1  # unsigned
		+4,294,967,295 > +1 ===> $t0 = 0
	jal 过程标签l
		跳转到目标地址
	jr $ra
		复制 $ra的内容到程序计数器PC
	lb rt, offset(rs)     lh rt, offset(rs)
		在 rt中用符号位扩展到32 bits
	lbu rt, offset(rs)    lhu rt, offset(rs)
		在 rt中用0扩展到32 bits
	sb rt, offset(rs)     sh rt, offset(rs)
		只存储最右边的字节/半字
	lui rt, constant
		复制16-bit 常数值 到rt的高16位,将rt 的低16位清为 0
	链接取数:ll rt, offset(rs)
	条件存数:sc rt, offset(rs)

精简指令集(MIPS为例)常用指令特点及其格式

寄存器用法

$a0 – $a3:参数寄存器 (reg’s 4 – 7)
$v0, $v1:结果值寄存器(reg’s 2 and 3)
$t0 – $t9:临时寄存器,用于存储临时值,可以由被调用者重写
$s0 – $s7:保留寄存器,用于存储变量,必须由被调用者保存/恢复
$gp:静态数据的全局指针(reg 28)
$sp:栈指针(reg 29)
$fp:帧指针(reg 30)
$ra:返回地址(reg 31)

过程调用步骤

1.将参数放在寄存器中
2.将控制转移给过程
3.获得过程所需的存储资源
4.执行过程的操作
5.将结果放在调用者可以访问到的寄存器
6.返回调用点

四、32位指令格式

R-格式指令
精简指令集(MIPS为例)常用指令特点及其格式
op:操作码(opcode)
rs:第一源操寄存器号
rt:第二源操寄存器号
rd:目的寄存器号
shamt:移位的位数(其它指令为00000)
funct:功能码(扩展操作码)

I-格式指令
精简指令集(MIPS为例)常用指令特点及其格式
立即数运算和load/store指令
rt:源寄存器号(store指令)或目的寄存器号(立即数运算和load指令)
立即数:–215 — +215 – 1
地址:rs中的基地址加上偏移量

J-格式指令
精简指令集(MIPS为例)常用指令特点及其格式
跳转 (j和jal) 目标地址可以是代码段的任意位置