从 01 开始 从 01 开始
首页
  • 📚 计算机基础

    • 计算机简史
    • 数字电路
    • 计算机组成原理
    • 操作系统
    • Linux
    • 计算机网络
    • 数据库
    • 编程工具
    • 装机
  • 🎨 前端

    • Node
  • JavaSE
  • Java 高级
  • JavaEE

    • 构建、依赖管理
    • Ant
    • Maven
    • 日志框架
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • 环境管理和配置管理-科普篇
    • Servlet
  • Spring

    • Spring基础
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC

    • SpringMVC 基础
  • SpringBoot

    • SpringBoot 基础
  • Windows 使用技巧
  • 手机相关技巧
  • 最全面的输入法教程
  • 最全面的浏览器教程
  • Office
  • 图片类工具
  • 效率类工具
  • 最全面的 RSS 教程
  • 码字工具
  • 各大平台
  • 校招
  • 五险一金
  • 职场规划
  • 关于离职
  • 杂谈
  • 自媒体
  • 📖 读书

    • 读书工具
    • 走进科学
  • 🌍 英语

    • 从零开始学英语
    • 英语兔的相关视频
    • Larry 想做技术大佬的相关视频
  • 🏛️ 政治

    • 反腐
    • GFW
    • 404 内容
    • 审查与自我审查
    • 互联网
    • 战争
    • 读书笔记
  • 💰 经济

    • 关于税
    • 理财
  • 💪 健身

    • 睡眠
    • 皮肤
    • 口腔健康
    • 学会呼吸
    • 健身日志
  • 🏠 其他

    • 驾驶技能
    • 租房与买房
    • 厨艺
  • 电影

    • 电影推荐
  • 电视剧
  • 漫画

    • 漫画软件
    • 漫画推荐
  • 游戏

    • Steam
    • 三国杀
    • 求生之路
  • 小说
  • 关于本站
  • 关于博主
  • 打赏
  • 网站动态
  • 友人帐
  • 从零开始搭建博客
  • 搭建邮件服务器
  • 本站分享
  • 🌈 生活

    • 2022
    • 2023
    • 2024
    • 2025
  • 📇 文章索引

    • 文章分类
    • 文章归档

晓林

程序猿,自由职业者,博主,英语爱好者,健身达人
首页
  • 📚 计算机基础

    • 计算机简史
    • 数字电路
    • 计算机组成原理
    • 操作系统
    • Linux
    • 计算机网络
    • 数据库
    • 编程工具
    • 装机
  • 🎨 前端

    • Node
  • JavaSE
  • Java 高级
  • JavaEE

    • 构建、依赖管理
    • Ant
    • Maven
    • 日志框架
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • 环境管理和配置管理-科普篇
    • Servlet
  • Spring

    • Spring基础
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC

    • SpringMVC 基础
  • SpringBoot

    • SpringBoot 基础
  • Windows 使用技巧
  • 手机相关技巧
  • 最全面的输入法教程
  • 最全面的浏览器教程
  • Office
  • 图片类工具
  • 效率类工具
  • 最全面的 RSS 教程
  • 码字工具
  • 各大平台
  • 校招
  • 五险一金
  • 职场规划
  • 关于离职
  • 杂谈
  • 自媒体
  • 📖 读书

    • 读书工具
    • 走进科学
  • 🌍 英语

    • 从零开始学英语
    • 英语兔的相关视频
    • Larry 想做技术大佬的相关视频
  • 🏛️ 政治

    • 反腐
    • GFW
    • 404 内容
    • 审查与自我审查
    • 互联网
    • 战争
    • 读书笔记
  • 💰 经济

    • 关于税
    • 理财
  • 💪 健身

    • 睡眠
    • 皮肤
    • 口腔健康
    • 学会呼吸
    • 健身日志
  • 🏠 其他

    • 驾驶技能
    • 租房与买房
    • 厨艺
  • 电影

    • 电影推荐
  • 电视剧
  • 漫画

    • 漫画软件
    • 漫画推荐
  • 游戏

    • Steam
    • 三国杀
    • 求生之路
  • 小说
  • 关于本站
  • 关于博主
  • 打赏
  • 网站动态
  • 友人帐
  • 从零开始搭建博客
  • 搭建邮件服务器
  • 本站分享
  • 🌈 生活

    • 2022
    • 2023
    • 2024
    • 2025
  • 📇 文章索引

    • 文章分类
    • 文章归档
  • 计算机简史

  • 数字电路

  • 计算机组成原理

    • 计算机组成原理(北大-陆俊林)

      • 概述-计算机组成原理(北大-陆俊林)
      • 第1周-计算机组成章节视频简介
      • 101-电子计算机的兴起
      • 102-冯·诺依曼结构的要点
      • 103-冯·诺依曼结构的小故事
      • 104-计算机结构的简化模型
      • 105-计算机执行指令的过程
      • 106-计算机输入和输出
      • 107-冯诺依曼结构和具体实现
      • 201-设计自己的计算机
      • 202-x86 体系结构
      • 203-x86 指令简介
      • 204-复杂的 x86 指令举例
      • 205-MIPS 体系结构
      • 206-MIPS 指令简介
      • 301-算术运算和逻辑运算
      • 302-门电路的基本原理
      • 303-寄存器的基本原理
      • 304-逻辑运算的实现
      • 305-加法和减法的实现
      • 306-加法器的优化
      • 401-乘法的运算过程
      • 402-乘法器的实现
      • 403-乘法器的优化 1
      • 404-乘法器的优化 2
      • 405-除法的运算过程
      • 406-除法器的实现
      • 407-除法器的优化
      • 501-处理器的设计步骤
      • 502-数据通路的建立
      • 503-运算指令的控制信号
      • 504-访存指令的控制信号
      • 505-分支指令的控制信号
      • 506-控制信号的集成
      • 601-流水线的基本原理
      • 602-流水线的优化
      • 603-超标量流水线
      • 604-流水线的冒险
      • 605-数据冒险的处理
      • 606-控制冒险的处理
      • 701-存储层次结构概况
      • 702-DRAM 和 SRAM
      • 703-主存的工作原理
      • 704-主存技术的发展
      • 705-高速缓存的工作原理
      • 706-高速缓存的组织结构
      • 707-存储容量的计算
      • 801-中断和异常的来源
      • 802-中断向量表的结构
      • 803-中断向量表的发展
      • 804-中断的处理过程
      • 805-内部中断分类说明
      • 806-基于中断的功能调用
      • 901-输入输出接口的基本功能
      • 902-输入输出接口的编址方式
      • 903-输入输出的控制方式
      • 904-中断控制方式
      • 905-外部中断的处理过程
      • 906-直接存储器访问方式
    • 字符编码入门

  • 操作系统

  • Linux

  • 计算机网络

  • 数据库

  • 编程工具

  • 装机

  • 计算机基础
  • 计算机组成原理
  • 计算机组成原理(北大-陆俊林)
2023-06-13

205-MIPS 体系结构

# 205-MIPS 体系结构

MIPS 是精简指令系统的代表,采用了与 X86 相反的设计理念,并引领了精简指令系统的潮流,那就让我们一起来看一看这 究竟是怎么一回事。

‍‍ ‍ 要探讨 MIPS 指令系统,就得从它的设计者 John Hennessy 开始说起。 Hennessy 1977 年进入斯坦福大学, 1981 年领导了 RISC 微处理器研究小组,他也被称为 RISC 的先驱。 RISC 是精简指令系统计算机的简称,与之相对,之前的计算机上的指令系统就被称为复杂指令系统,X86 就是其中的代表。 后来,Hennessy 共同创立了 MIPS 计算机系统公司, 90 年代,他主要是在斯坦福计算机系担任系主任等职务, 2000 年起开始担任斯坦福大学的校长。

​

由于他所设计的 MIPS 体系结构引领了精简指令系统的潮流, 后来还获得了 IEEE 的荣誉奖章, 而他所创立的 MIPS 公司也一度创造了辉煌。 在 80 年代末上市,后来被收购, 然后再一次上市,再一次被收购, 现在 MIPS 处理器已经不再应用在计算机产品中了, 但是在广义的计算设备包括数字电视,游戏机,网络设备等领域仍然有广泛的应用,其实 MIPS 公司商业上的兴衰 也是诸多 RISC 微处理器公司的命运写照。

​

第一代的 MIPS 是 32 位的, 在 1985 年推出了对应的处理器,R2000,90 年, R3000 处理器对应着第二代的 MIPS, 92 年,MIPS 扩展到了 64 位,94 年,64 位的 MIPS 又 进一步升级,96 年的 MIPS5 并没有对应的处理器, 然后在 99 年,MIPS 指令系统进行了较大的调整, 形成了 MIPS32,到了 99 年,以 MIPS5 为基础, 推出了 MIPS64 指令系统。

​

MIPS 的设计指导思想非常的简单, 从它的名字就可以看出来。MIPS 全称的含义 是一个流水线不会互锁的微处理器,流水线是 现代微处理器为提高性能而采用的一项技术,而流水线中的互锁 则是导致流水线性能降低的一个非常重要的因素。从这个名称也可以看出,MIPS 的 指导思想是希望其指令的设计能让微处理器运行的更快,性能更好。 所以它主要的关注点是减少指令的类型,并且降低指令的复杂度,所以在 MIPS 指令系统当中, 指令的总数是很少的。 而且每条指令都比较简单。它的主要目的就是希望可以用 一个非常简单的 CPU 来支持这样的指令系统。而 CPU 越简单就可以运行的更快。假设要编写程序完成同样的任务,用 MIPS 指令编写,其指令数量是 X-86 指令的 5 倍, 但是如果 MIPS 的 CPU 能够做到比 X86 CPU 快 10 倍,那它仍然获得了明显的性能优势。 这就是 MIPS,同时也是 RISC 的设计思想。

​

那 MIPS 的指令是怎么体现它这样的设计思想的呢?

  • 第一,MIPS 固定了指令的长度,都是 32 个比特, 也就说 MIPS 中的一个 WORD,我们要注意这和 X86 中一个 WORD 是 16 位是不同的。 固定的指令长度,大大简化了 CPU 从存储器中取指令的工作。 不用像 X86 CPU 那样需要判断每条指令的长度。
  • 第二,MIPS 采用了非常简单的寻址模式,相比于 X86 提供的复杂多样的寻址模式, 虽然给编程带来了不变,但是大大简化了 CPU 访问存储器的控制逻辑。
  • 第三 MIPS 指令的数量比较少,每条指令的工作也很简单, 基本上一条指令只完成一个操作,不像 X86 的指令,一条指令往往完成丰富的功能, 这样可以简化指令的执行过程,不但简化了 CPU 的控制逻辑,而且可以方便的实现各种让指令并行执行的技术,从而提高 CPU 的性能。
  • 第四,在 MIPS 指令系统中只允许 LOAD 和 STORE 这两种指令访问存储器, 而不支持 X86 指令中这些让算术指令访问存储器的操作。 因为访存是一个相对复杂的工作, 这种限制就可以让运算指令的实现变得非常的简单,但是我们要注意,MIPS 的这些特点让直接使用 MIPS 指令进行编程变得非常的困难, 因此,想要有高效率的 MIPS 程序, 必须要有优秀的编译器的支持。

​

我们来看几个 MIPS 指令的例子。 例如加法指令,它的格式是 ADD A,B,C 我们注意,与 X86 指令不同,MIPS 的加法指令是三个操作数,这 A,B,C 可以是三个- 寄存器, 除了加法运算,这里还列出了减法,乘法,除法等等,还有逻辑运算, 还有左移和右移这样的移位运算。这类我们可以看出 MIPS 的运算指令 格式都非常简洁和统一,而且这些指令的操作数都不可以是存储器操作数。

​ ‍

要访问存储器,就必须使用专门的访存指令。我们来看一个例子,假设 A 是一个 100 个字的数组,它的首地址存放在 19 号寄存器中, MIPS 的寄存器编号用$符进行标记, 那如果我们想完成这样一个运算,也就说将一个变量 H 加上数组 A 中的第三个元素,并赋给数组 A 的第十个元素,我们注意, 变量 H 放在 18 号寄存器中,而我们可以使用 8 号寄存器用来存放临时数据, 那么对应的 MIPS 指令需要如下几条, ‍ 首先要用 LOAD 指令将 19 号寄存器对应的地址加上偏移量 12,因为 MIPS 当中 一个字是 32 位,所以第三个元素与首地址之间的偏移是 12, 将存储器中的这个字装入到 8 号寄存器中, 这就相当于将数组 A 中的第三个元素赋给了一个临时变量,

第二句是一个加法指令,将 8 号寄存器与 18 号寄存器相加, 并将结果存放在 8 号寄存器。这就 相当于将数组 A 的第三个元素与变量 H 相加,还存在这个临时变量中,

第三条指令是将 8 号寄存器中的数 也就是运算的结果存到以 19 号寄存器为首地址,偏移量为 40 的内存单元, 这就是数组 A 的第十个元素的位置。 那我们用这三条 MIPS 指令就完成了这个功能。

​

而这张表列出了 MIPS 的所有的通用寄存器,总共有 32 个, 每个都是 32 位,相比于 X86 的寄存器,MIPS 的通用寄存器是非常规正的。 这 32 个寄存器的编号从 0, 一直到 31,那我们可以用 $ 符加上编号 进行指示,同时每个寄存器还有一个符号的名称, 并且约定了一些特定的用途,例如 8 号到 15 号寄存器, 又被称为 T0,到 T7 的寄存器,用来保存临时的变量, 而 1 号寄存器,它的名称是 AT, 专门留给汇编器使用。

​ ‍

在编写汇编程序时, 我们可以用数字,也可以用名称,来表示这些寄存器,例如这两条指令所表达的含义以及对应的二进制编码都是一样的。这两条指令也是如此。如果我们直接用 MIPS 指令进行汇编语言的编程, 从 T0 到 T7,S0 到 S7,这些寄存器都是我们经常使用的。MIPS 的体系结构简明扼要,需要说明的就是这些。

​ ‍

我们已经了解了 MIPS 的设计理念, 那这样的理念究竟是如何实现的呢?在下一节我们将一起来探究 MIPS 的指令。

上次更新: 2025/6/3 17:50:46
204-复杂的 x86 指令举例
206-MIPS 指令简介

← 204-复杂的 x86 指令举例 206-MIPS 指令简介→

最近更新
01
语雀文档一键下载至本地教程
07-04
02
要成功,就不要低估环境对你的影响
07-03
03
血泪教训:电子设备要定期开机
07-02
更多文章>
Theme by Vdoing | Copyright © 2022-2025 | 粤 ICP 备 2022067627 号 -1 | 粤公网安备 44011302003646 号 | 点击查看十年之约
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式