MIPS指令 MIPS架构
华中科技大学 - 计算机组成原理
华中科技大学 - 计算机硬件系统设计
Microprocessor without Interlocked Pipleline Stages
无内部互锁流水级的微处理器
- 属于RISC
MIPS指令格式
R型指令
6 bits | 5 bits | 5 bits | 5 bits | 5 bits | 6 bits |
---|---|---|---|---|---|
000000 | Rs | Rt | Rd | shamt | funct |
第一源操作数 | 第二源操作数 | 目标操作数,保存结果 | 在移位指令中使用 | 指定指令的具体功能 |
三寄存器R型指令
add
000000 | Rs | Rt | Rd | 00000 | 100000 |
---|
sub
000000 | Rs | Rt | Rd | 00000 | 100010 |
---|
and
000000 | Rs | Rt | Rd | 00000 | 100100 |
---|
or
000000 | Rs | Rt | Rd | 00000 | 100101 |
---|
xor
000000 | Rs | Rt | Rd | 00000 | 100110 |
---|
两寄存器R型指令
sll(逻辑左移)
000000 | 00000 | Rt | Rd | 偏移量 | 000000 |
---|
srl(逻辑右移)
000000 | 00000 | Rt | Rd | 偏移量 | 000010 |
---|
sra(算术右移)
000000 | 00000 | Rt | Rd | 偏移量 | 000011 |
---|
单寄存器R型指令
jr(寄存器跳转)
000000 | Rs | 00000 | 00000 | 00000 | 001000 |
---|
R型指令中的无条件分支指令:jr,jalr
I型指令
6 bits | 5 bits | 5 bits | 16 bits |
---|---|---|---|
OP | Rs | Rt | |
标识操作功能 | 第1个源操作数 | 目的寄存器编号 | 第2个源操作数 |
双目运算、LOAD/STORE:Rs和立即数是源操作数,Rt为目标操作数
条件转移:Rs、Rt均为源操作数
面向运算的I型指令
addi
001000 | Rs | Rt | imm |
---|
andi
001100 | Rs | Rt | imm |
---|
ori
001101 | Rs | Rt | imm |
---|
xori
001110 | Rs | Rt | imm |
---|
addi的立即数扩展为符号扩展
(若为负数高16位补1)
其他三条进行0扩展
(高16位补0)
面向访存的I型指令
lw(从存储器读数据)
100011 | Rs | Rt | imm |
---|
sw(把数据保存到存取器)
101011 | Rs | Rt | imm |
---|
面向数位设置的I型指令
lui(把立即数加载到寄存器的高16位)
001111 | 00000 | Rt | imm |
---|
面向条件转移的I型指令
beq(寄存器相等则转移)
000100 | Rs | Rt | imm |
---|
bne(寄存器不相等则转移)
000101 | Rs | Rt | imm |
---|
I型指令中的有条件分支指令:beq, bne, bgtz( > 0 ), bgez( >= 0 ),bltz( < 0 ), blez( <= 0 )
J型指令
6 bits | 26 bits |
---|---|
OP | 立即数 |
跳转目标地址的部分地址 |
j(无条件跳转)
000010 | address |
---|
jal(调用与联接)
001100 | address |
---|
类似于X86架构的CALL。jal要保存返回地址
J型指令的无条件分支指令:j, jal
MIPS寄存器
在R和I型指令格式中,寄存器操作数字段均为5位,可编号32个寄存器
寄存器名 | 寄存器编号 | 说明 |
---|---|---|
$s0 | 0 | 保存固定的常数0 |
$at | 1 | 汇编器的临时变量 |
$v0 - $v1 | 2 - 3 | 字函数调用返回结果 |
$a0 - $a3 | 4 - 7 | 函数调用参数1-3 |
$t0 - $t7 | 8 - 15 | 临时变量,函数调用时不需要保存和恢复 |
$s0 - $s7 | 16 - 23 | 函数调用时需要保存和恢复的寄存器变量 |
$t8 - $t9 | 24 - 25 | 临时变量,函数调用时不需要保存和恢复 |
$k0 - $k1 | 26 -27 | 中断、异常处理程序使用 |
$gp | 28 | 全局指针变量(Global Pointer) |
$sp | 29 | 堆栈指针变量(Stack Pointer) |
$fp | 30 | 帧指针变量(Frame Pointer) |
$ra | 31 | 返回地址(Return Address) |
另外还有
- 32个32位单精度浮点寄存器f0 - f31
- 2个32位乘、商寄存器Hi和L0:运算乘法时分别存放64位乘积的高、低32位; 除法时分别存放余数和商
浮点寄存器和乘商寄存器没有编号,对程序员来说是透明的
MIPS寻址方式
MIPS32指令集中不单设寻址方式说明字段
- R型指令:由OP和funct字段共同隐含说明(R型指令字段全为0,需要结合funct字段表示)
- I、J型指令:由OP字段隐含
立即数寻址
immediate addressing
寄存器直接寻址
register addressing
add $t0,$s1,$s2 ;($t0 = $s1 + $s2)
基址寻址
basic addressing
使用通用寄存器作为基址寄存器,以立即数作为偏移量,立即数带符号扩展为32位,和基址寄存器的值一起得到主存地址
使用基址寻址的指令:lw, sw, lh, sh, lb, lbu等
相对寻址
PC的值和偏移量相加得到主存地址,以立即数为偏移量。立即数带符号扩展为32位并左移2位再和PC的内容相加
PC的值会被修改为相加结果
使用相对寻址的指令:beq, bne
页面寻址
26位的地址码左移2位变为28位,作为地址的低28位,PC的值会被修改
高4位是PC改变后的值(取出指令后PC自动增加)
单周期MIPS架构
取指Dp
由于需要在一个周期内完成取指译码执行的过程,不设置AR,DR,IR。
取指令和取操作数要同时完成,为了避免访存冲突将程序和数据分开存放(哈佛结构):
- 指令Cache
- 数据Cache
ALU和PC累加器分开
R型指令数据通路
以add $s0, $s1, $s2为例
- 以PC的内容访问IM,解析指令字段,分出3个寄存器编号
- 以寄存器编号访问寄存器堆
- 输出两路寄存器值,根据AluOP信号运算
- 当时钟到来,给出RegWrite,将结果写入寄存器堆
寄存器堆要支持两路读和一路写
I型指令数据通路
以lw $s0, 32($31)为例(从存储器读数据)
- 以PC的内容访问IM,解析指令字段,分出2个寄存器编号和立即数字段
- 以寄存器编号访问寄存器堆
- 立即数字段进行符号扩展单元,扩展为32位
- 输出一路寄存器值,和立即数相加得到DM地址
- 经过一个存储器延迟,数据到达WD端
- 时钟到来写入寄存器堆
sw $s0, 32($31)(从存储器读数据)
单周期MIPS数据通路
对于有多输入源的引脚,加上多路选择器和信号选择信号
beq数据通路的建立
J型指令的数据通路建立
需要增加JUMP控制信号,PC输入增加一个跳转地址
单周期MIPS控制器
单周期架构下,无时序逻辑
输入 | 输出 |
---|---|
OP + funct | 多路选择器选择信号 |
寄存器写使能信号 | |
内存访问控制信号 | |
运算器控制信号 | |
指令译码信号 |
单周期MIPS关键路径
lw的最长路径
时钟周期 = Tclk_to_Q + Tmem + Tregfile_read + Talu + Tmem + Tmux + Tsetup
多周期MIPS架构
不区分指令和数据存储器(冯诺依曼结构),功能部件分时使用
时钟周期变小,传输通路变短
功能部件输出端增加寄存器锁存数据
多周期MIPS CPU数据通路
取指令T1
PC += 4
- PC的内容传输到ALU的输入端和
- ALUSrcB信号选择4传输到ALU的输入端
- AluOP信号选择运算方式
- 时钟到来,在PCWrite信号的配合下结果送回PC
根据PC的内容从主存取指令
- 给出IRWrite信号,时钟到来时PC值写入IR锁存,同时PC原有的值更新为PC+4
取指令T2
- 将IR的内容送入控制器产生控制信号
- 计算条件分支转移的地址(图紫色部分)
时钟到来,取出的数据锁存在AB
R型指令执行T3-T4
- 给出AluOP和ALUSrcA、ALUSrcB信号,完成信号
- 时钟到来C更新
- C的内容输出,在RegDst和RegWrite信号配合下,写回寄存器堆
lw执行T3-T5
4. A和立即数相加计算操作数地址,时钟到来结果锁存在C
5. 将C的内容传输到主存,时钟到来数据锁存在DR
6. DR的内容写入寄存器堆(IR给出目标寄存器编号)
beq执行T3
- AB内容传输到ALU的输入端,进行比较,相等在给出equal信号,与branch信号与后输入到PC作为写使能
多周期状态转换图
多周期MIPS CPU控制器
输入 | 输出 |
---|---|
OP + funct | 多路选择器选择信号 |
时钟信号 | 寄存器写使能信号 |
复位信号 | 内存访问控制信号 |
运算器控制信号 | |
指令译码信号 |
MIPS指令 MIPS架构的更多相关文章
- MIPS指令学习二
1.MIPS寻址方式 MIPS架构的寻址模式有寄存器寻址.立即数寻址.寄存器相对寻址和PC相对寻址4种,其中寄存器相对寻址.PC相对寻址介绍如下: 1.1.寄存器相对寻址 这种寻址模式主要被加载/存储 ...
- QtSpim实现MIPS指令的编写
QtSpim实现MIPS指令的编写 由于各种对齐问题,cnblogs的格式难以控制,故贴图片,谅解.
- 3.6 MIPS指令简介
计算机组成 3 指令系统体系结构 3.6 MIPS指令简介 MIPS秉承着指令数量少,指令功能简单的设计理念.那这样的设计理念是如何实现的呢?在这一节,我们就将来分析MIPS指令的特点. 相比于X86 ...
- 自己动手写CPU之第五阶段(3)——MIPS指令集中的逻辑、移位与空指令
将陆续上传本人写的新书<自己动手写CPU>(尚未出版),今天是第17篇.我尽量每周四篇 5.4 逻辑.移位操作与空指令说明 MIPS32指令集架构中定义的逻辑操作指令有8条:and.and ...
- [zt]系统中常用MIPS指令
指令 功能 应用实例 LB 从存储器中读取一个字节的数据到寄存器中 LB R1, 0(R2) LH 从存储器中读取半个字的数据到寄存器中 LH R1, 0(R2) LW 从存储器中读取一个字的数据到寄 ...
- 计算机组成原理作业一 熟悉MIPS指令
第一题 .data outputd: .asciiz "Alpha","November","First","alpha" ...
- MIPS指令的CPU实现:ALU设计
设计CPU的第一步,设计一个简单的逻辑运算单元ALU.同时对Verilog语言也有一定要求. 一.实验内容 如图,ALU接受两个N位的输入,得到N位的输出,通过控制信号F决定运算功能. 将ALU的输出 ...
- 自己动手写处理器之第一阶段(2)——MIPS指令集架构的演变
将陆续上传本人写的新书<自己动手写处理器>(尚未出版),今天是第三篇.我尽量每周四篇 MIPS指令集架构自上世纪80年代出现后.一直在进行着更新换代,从最初的MIPS I到MIPS V,发 ...
- MIPS 汇编指令学习
MIPS 寄存器 MIPS comes with 32 general purpose registers named $0. . . $31Registers also have symbolic ...
随机推荐
- jq的slideToggle效果
slideToggle() 方法通过使用滑动效果(高度变化)来切换元素的可见状态. 如果被选元素是可见的,则隐藏这些元素,如果被选元素是隐藏的,则显示这些元素. 例子:一个简单的下拉菜单效果----& ...
- 史上最详细的信号使用说明(已被收藏和N次)
Unix环境高级编程(第三版) 第10章 信号 文章目录 1. 引言 2. 信号的概念 2.1 信号操作之忽略信号 2.2 信号操作之捕捉信号 2.3 信号操作之执行系统默认操作 2.4 常见的信号 ...
- Servlet生命周期和方法
一.五个生命周期方法,有三个很重要,初始化方法.提供服务方法和销毁方法 1.三个主要方法 2.另外两个重写的成员方法只做了解 二.生命周期详解 其中,每次刷新页面都是一次对servlet访问: 页面访 ...
- centos7修改服务器时区
查看时区设置 timedatectl 列出所有时区,通过键盘上下键进行浏览 timedatectl list-timezones 修改服务器时区为Africa/Lagos # 拉各斯的时区,UTC+1 ...
- 解决国内npm安装太慢的方法,又不能FQ情况下,使用淘宝镜像教程
安装npm及cnpm(Windows) [工具官网] 因为国内上网下载组件太慢,淘宝给我们提供了镜像源,,但是我不是建意FQ上网.条件有限的可以使用下面的方法安装CNPM,原文转自网络,正好自己需要也 ...
- Hello Wolrd
这是一篇测试文章.....后续会更新一些文章.
- nuxt打包等注意事项
打包步骤: 1.首先执行 npm run build 2.将打包好的 .nuxt static nuxt.config.js package.json 这四个文件丢到服务器的某个文件夹中,在服务器上安 ...
- 集合转数组:toArray()最优化方法探索
优化背景 有些场景下(比如入参要求)需要将集合(比如List)转为数组类型,利用集合的toArray方法应该最为方便的,对于toArray()无参方法其返回的是Object[],强制转其他类型数组会C ...
- verifycode验证码模版
# -*- coding:utf-8 -*- from django.shortcuts import HttpResponse def verifycode(request): # 引入绘图模块 f ...
- [转载]CentOS 7 创建本地YUM源
本文中的"本地YUM源"包括三种类型:一是直接使用CentOS光盘作为本地yum源,优点是简单便捷,缺点是光盘软件包可能不完整(centos 7 Everything 总共才6.5 ...