北航计算机组成原理课程设计-2021秋 PreProject-MIPS-入门简介

北航计算机学院-计算机组成原理课程设计-2020秋

PreProject-MIPS

入门简介


本系列所有博客,知识讲解、习题以及答案均由北航计算机学院计算机组成原理课程组创作,解析部分由笔者创作,如有侵权联系删除。


从本节开始,课程组给出的教程中增添了很多视频讲解。为了避免侵权,本系列博客将不会搬运课程组的视频讲解,而对于文字讲解也会相应地加以调整,重点在于根据笔者自己的理解给出习题的解析。因此带来的讲解不到位敬请见谅。


MIPS 汇编

汇编语言

由于硬件方面的原因,计算机中的数据都是以二进制的形式表示的,这也代表着,CPU 所直接处理的都是一条条二进制机器码指令。而这些单纯的机器码是很难以阅读和理解的,因此人们发明了比机器语言稍微高级的一种程序语言——汇编语言(Assembly Language)。事实上,与其说汇编语言是一种语言,不如说它是一种助记符——用一些易于理解的符号代表特定含义的机器码,用标签(Label)来替代地址。

相比于 C、Java 这些高级语言,汇编语言要低级的多,它和机器码几乎是一一对应的,一般用于贴近于硬件的编程,正如我们的计组实验。我们在这里学习汇编语言,一方面是为了让同学们通过学习汇编语言来理解计算机底层硬件的运行过程,另一方面是使用汇编语言来编写测试程序验证我们设计的 CPU 的正确性。

由于汇编语言涉及到的知识点众多,部分知识点十分琐碎,建议在第一遍学习时不要陷入细节问题之中,快速阅览整章,对汇编语言有一个大概认识之后再回过头来将第一遍学习中不理解的点逐个攻克。

MIPS 汇编

不同架构的 CPU 都有各自独特的汇编语言,例如我们将会使用的 MIPS 汇编语言就是专门用于 MIPS 体系结构 CPU 的汇编语言。MIPS 汇编的最大特点就是指令的结构比较单一,所有的指令都可以翻译成 32 位二进制的机器码,指令的组成也大都只有 R、I、J 这三类(依照格式进行的分类,后面会详细讲解)。

这一特点让他看起来有些“死板“,因为大多数指令并不需要使用 32 位机器码才能表示,一般 10 位、20 位就已经足够了。从这点来看 MIPS 汇编确实比较浪费存储空间,这也是 MIPS 架构 CPU 不被主流所喜的重要原因。不过,有弊就有利,MIPS 汇编这种固定的指令格式非常具有规律性。可想而知,相对于其它架构的 CPU,MIPS 架构 CPU 的设计难度相对较低,很适合我们这些初学者。而它的这些规律性,会使我们在设计 MIPS 体系结构的 CPU 的过程中,更充分地体会到工程化设计给我们带来的便利,更容易理解 CPU 的整体构造。

MARS(MIPS ASSEMBLER AND RUNTIME SIMULATOR)

MARS 是一个轻量级的、用于教学的 MIPS 汇编语言集成开发环境(IDE)。它由密苏里州立大学开发,基于 Java 环境运行,完全绿色且免费。我们的课程即使用此软件来进行 MIPS 汇编语言的学习、编写和运行。

在我们的实验中,选择 Mars 的原因主要有以下几点:

  • Mars 是用于 MIPS 汇编语言的 IDE,和我们的设计的 CPU 相同。
  • Mars 的 Help 文档中,对指令、伪指令、系统调用等各种功能都有详细的介绍与使用样例,便于查阅使用。
  • 无论是正常程序还是异常处理程序,Mars 上都能很好的运行,同时还能够按需求导出程序代码运行于我们的 CPU 程序中。
  • 最重要的是,Mars 中的指令都是在他内部的 CPU 模型上运行的,无论单周期还是流水线,它内部的 CPU 模型都是我们实验设计的黄金校验模型,对我们的 CPU 设计有很大的指导作用。

北航计算机组成原理课程设计-2021秋 PreProject-MIPS-入门简介
图为 MARS 界面

基础知识测试

存储方式

计算机中的数据存储主要有两种方式:大端存储和小端存储。在我们的实验中使用的就是小端存储。

自行查阅资料后回答以下问题:

假如我们采取小端存储的方式,将32位的数据0x12345678存储到内存中,首地址是0x00。那么,内存地址为0x02的这一字节中存储的数据是多少?

A. 0x12

B. 0x34

C. 0x56

D. 0x78

存储形式

在计算机的存储器中,包含着众多的小电路,通过为这些电路充电放电来实现数据的存储。那么在正逻辑的情况下,这些小电路是如何存储数据的呢?

A. 电路输出为高电平时,代表存储数据为1;电路输出为低电平时,代表存储数据为0;

B. 电路输出为高电平时,代表存储数据为0;电路输出为低电平时,代表存储数据为1;

答案:A

存储单位(字节)

下列16进制数中,______为一个字节。(32位机,一般情况下)

A. 0x01020304

B. 0x0102

C. 0x01

D. 0x01020304050607080919111213141516

存储单位(字)

下列16进制数中,_______为一个字。(32位机,一般情况下)

A. 0x01020304

B. 0x0102

C. 0x01

D. 0x01020304050607080910111213141516

答案:A

存储单位

填空

题目编号 712-586

在计算机中,数据存储的最小单位是位(bit),基本单位是字节(Byte),当然,除了他们之外,我们还经常使用字(Word),半字(Half-Word)等单位,那这些存储单位之间的关系是怎样的呢?请自行查阅资料后回答以下问题。

(1) 一个字节(Byte)等于多少位(bit)?(32位机,一般情况下)_______________________

(2) 一个字(Word)等于多少字节(Byte)?(32位机,一般情况下)_______________________

(3) 一个半字等于多少位(Bit)?(32位机,一般情况下)_______________________

答案:

(1) 8

(2) 4

(3) 16

寄存器简介

什么是寄存器?

寄存器是 CPU 的组成部分之一,是一种高速存储器(甚至是 CPU 可以使用的最高速的一种存储器),可以用来暂存指令,数据,地址等。由于寄存器的成本较高,一般的 CPU 中只有数量很有限的寄存器可供使用。

在 MIPS 体系结构中,CPU 对数据的操作均是基于寄存器的。内存中的数据需要先使用读取(load)类指令保存到寄存器才可使用。操作完成的数据也不能直接保存到内存中,需要使用装载(store)类指令保存至内存中。

在我们实验中的 CPU 是 32 位 CPU,一次能处理的最大位数即为 32 位,绝大部分寄存器也均是 1 字大小的(即 4 字节,也就是 32 位)。

MIPS 中的 32 个通用寄存器

在一般的(至少是本课程所需要用的)MIPS 汇编程序中,比较常用的是 32 个通用寄存器。所谓通用寄存器,代表它没有明确规定的用途,程序员可以随意对他们赋值、取值,同时他们的值也可以直接参与到各种指令之中。然而,虽然冠有通用的头衔,程序员们还是会以一定的规则来使用它们,这是为了便于程序员之间的交流,同时也是为编译器等工具定下了一定的标准。

这 32 个通用寄存器有两种命名方式,一种是按序号命名 $0~$31(注意前面有个美元的符号),一种就是按功能命名,如下表:

北航计算机组成原理课程设计-2021秋 PreProject-MIPS-入门简介

其中 usage 那一列可能暂时不好理解,没有关系,在之后的学习中会慢慢用到。特别地,对于 $0$1 两个寄存器:

  • $0 一般不能用于赋值,但这不代表你对它赋值就是错的。在实际中,你可以对 $0 进行赋值,但它的值会始终保持为 0。也就是说对 $0 赋值并不违反语法,但没有实际效果。
  • $1 保留给汇编器,一般不使用此寄存器(使用该寄存器可能会导致难以发现的 bug,具体原因请在编写 MIPS 汇编时注意扩展指令是如何翻译成普通指令的)

三个特殊寄存器

  • PC(Program Counter):这个寄存器想必已经在理论课上讲解过了。它用于存储当前 CPU 正在执行的指令在内存中的地址。需要注意的是,这个寄存器的值不能用常规的指令进行取值和赋值,但这并不意味着不能做到,只是麻烦一些。那么,怎样对其取值、赋值呢?这可以作为一个思考的题目,在之后的学习中自行探索。(提示:跳转)
  • HI:这个寄存器用于乘除法。它被用来存放每次乘法结果的高 32 位,也被用来存放除法结果的余数
  • LO:HI 的孪生兄弟。它被用来存放每次乘法结果的低 32 位,也被用来存放除法结果的

CP0 寄存器

当我们的 CPU 设计推进到比较深入的阶段时,我们就需要对异常和中断进行处理,届时我们就会使用到 CP0 寄存器。

CP0 是一个系统控制协处理器,而 CP0 寄存器则是该协处理器工作时需要用到的一些寄存器。在我们的实验中,只会用到其中的 4 个寄存器:SR、Cause、EPC 和 PRId。

这里先介绍一下这几个寄存器的职能,具体细节在 P7 时会详细讲解。

  • **SR:**用于系统控制,决定是否允许异常和中断
  • **Cause:**记录异常和中断的类型
  • **EPC:**保存异常或中断发生时的 PC 值,也就是发送异常或中断时 CPU 正在执行的那条指令的地址。当处理完成之后,CPU 会根据这个地址返回到正常程序中继续往下执行。
  • **PRId:**处理器 ID,用于实现个性的寄存器。

上面所述的那些寄存器是 MIPS 体系结构和我们的课程中常用的重要的寄存器,他们都是 32 位的。但寄存器的范围很广,上述的寄存器只是他们的一部分。除他们以外,还有许多寄存器被用于临时之用,或许都没有名字,而他们的真正应用,需要同学们在自己设计 CPU 时自行合理安排。

寄存器的功能测试

寄存器的功能测试1

对于一些需要保存的数据,我们通常使用哪些寄存器进行保存?

A. $v0-$v1

B. $a0-$a3

C. $s0-$s7

D. $t0-$t7

答案:C

寄存器的功能测试2

通常用来保存返回地址的寄存器是哪一个?

A. $gp

B. $sp

C. $fp

D. $ra

答案:D

寄存器的功能测试3

通常用来保存函数返回值的寄存器是哪些?

A. $v0-$v1

B. $a0-$a3

C. $s0-$s7

D. $t0-$t7

答案:A

寄存器的功能测试4

通常若函数只需要传入三个变量,则这三个变量会被存在哪些寄存器中?

A. $a0-$a3

B. $s0-$s7

C. $sp

D. $fp

答案:A

寄存器的功能测试5

通常若函数需要传入十个变量,则会用到以下哪个寄存器来存储变量?

A. $sp

B. $gp

C. $ra

D. $fp

答案:A

参考资料

MIPS 指令集文档

  • 中文、精简版:MIPS-C指令集
  • 英文、完整版:MIPS32 Architecture For Programmers

MARS 相关

JAVA 运行环境

参考书目

  • 《See MIPS Run Linux》. 作者 D Sweetman
上一篇:InGaAs-SWIR探测器的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告


下一篇:全球及中国多晶金刚石行业市场发展展望及投资趋势预测报告2022-2027年