实验报告实验一 MIPS指令系统和MIPS体系结构

Posted Xavier Jiezou

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实验报告实验一 MIPS指令系统和MIPS体系结构相关的知识,希望对你有一定的参考价值。


实验一 MIPS指令系统和MIPS体系结构

实验目的

  1. 了解和熟悉指令级模拟器;
  2. 熟练掌握MIPSsim模拟器的操作和使用方法;
  3. 熟悉MIPS指令系统及其特点,加深对MIPS指令操作语义的理解;
  4. 熟悉MIPS体系结构。

实验要求

  1. 观察每次操作的结果,并进行记录;
  2. 根据操作结果、指令系统功能介绍详细分析程序中每一条指令的功能,并详细描述其执行过程。与操作结果进行比对,验证自己的分析;
  3. 对完整的程序撰写注释,画出程序流程图;
  4. 完成实验报告的撰写,描述你做实验的步骤和实验的结果(包含上述1-3要求的内容)。报告主要至少应包括:实验目的、实验步骤、实验结果、心得体会几部分。

实验内容

实验平台

实验平台采用指令级流水线操作级模拟器MIPSsim。

模拟器的使用方法请参考“附录B MIPSsim使用手册”。(实验附录B+C.pdf)

本实验涉及到的MIPSsim指令系统的模拟指令及具体每条指令的功能及用法请参考“附录C MIPS16模拟器及相关指令”。(实验附录B+C.pdf)

实验步骤

(1) 启动 MIPSsim。

(2) 选择“配置”->“流水方式”,使模拟器工作在非流水方式下。“寄存器”窗口选择“十六进制”方式显示寄存器的值。

(3) 载入一个样例程序,然后分别以单步执行一条指令、执行多条指令、连续执行、设置断点等方式运行程序,观察程序的执行情况,观察CPU中寄存器和存储器的内容的变化。

(4) 加载样例程序BMI.s,然后查看“代码”窗口,查看程序所在的位置。请对比程序源代码,判断程序在内存中的起始地址,为0x00000000

(5) 查看“寄存器”窗口PC寄存器的值,[PC]=0x00000000。其所代表的含义为将要执行的下一条指令的地址为0x00000000

(6) 逐一执行指令。通过键盘F7单步执行指令,执行完到一条程序后,[PC]=0x00000004。其所代表的含义为将要执行的下一条指令的地址为0x00000004。此时R1寄存器的值为:0x0000000000000038,其含义为:boy的初始地址是0x0000000000000038(提示:请结合BMI.s源代码中的程序理解)

根据上述现象,并查询相关资料,描述第一条语句ADDIU $r1,$r0, boy实现的功能为:将boy的初始地址赋给R1

(提示:boy的地址可在“代码”窗口中查看并计算得出——通过所在的上下对应地址来计算,boy所在地址所包含的内容可在“内存”窗口查看到)

(7) 执行控制器转移类指令。接着上述过程,继续单步执行程序,直到第二条语句BEQ $r0,$r0, CALCBOY语句执行完毕。此时[PC]=0x00000014。其所代表的含义为以B开头,是分支语句,判断R0=R0,为真,跳转到CALCBOY,CALCBOY的地址为0x00000014。(为什么变成此值?)

继续单步执行,观察程序走向。

(8) 执行访存类指令
继续上述过程,按F7键单步执行指令,执行完第六条指令LDC1 $f2,0($r1)后,F2寄存器的值变为7.200000E+001, 其代表的含义为:boy的体重(提示:请结合BMI.s源代码中的程序理解)根据上述现象,并查询相关资料,描述第三条语句LDC1 $f2,0($r1)实现的功能为:从通用寄存器R1中读取双精度浮点数到浮点寄存器F2中

(9) 执行算术运算类指令。继续接着上述过程,单步执行程序,直到DIV.D $f3,$f2,$f1语句执行完毕。过程中观察寄存器F1, F2, F3, F4,F6的值的变化并记录。逐步分析产生该结果的原因。(提示:浮点寄存器窗口请选择“双精度”模式,方便查看和理解)此时浮点寄存器F3中就是计算结果,它代表什么含义?

执行指令F1F2F3F4F6原因分析
LDC1 $f2,0($r1)0.000000E+0007.200000E+0010.000000E+0000.000000E+0000.000000E+000将boy的体重赋给F2
LDC1 $f4,8($r1)0.000000E+0007.200000E+0010.000000E+0001.730000E+0020.000000E+000将boy的身高赋给F4
LDC1 $f6,16($r1)0.000000E+0007.200000E+0010.000000E+0001.730000E+0021.000000E+004将身高平方的单位换算即10000赋给F6
MUL.D $f1,$f4,$f42.992900E+0047.200000E+0010.000000E+0001.730000E+0021.000000E+004计算身高的平方并赋给F1
DIV.D $f1,$f1,$f62.992900E+0007.200000E+0010.000000E+0001.730000E+0021.000000E+004对身高的平方进行单位换算并赋给F1
DIV.D $f3,$f2,$f12.992900E+0007.200000E+0012.405693E+0011.730000E+0021.000000E+004体重除以身高的平方得出boy的BMI值并赋给F3

答:F3代表的含义是体重(kg)/身高的平方(m^2),即boy的BMI值

(10) 执行控制器转移类指令。接着上述过程,继续单步执行程序,直到BGTZ $r2, CALCGIRL语句执行完毕。此时[PC]=0x0000000C。其所代表的含义为将要执行的下一条指令的地址为0x0000000C,因为BGTZ以B开头,是跳转指令,跳转到CALCGIRL,而CALCGIRL指令的地址为0x0000000C。(为什么变成此值?)

继续单步执行,观察程序走向。最后,直到DIV.D $f3,$f2,$f1语句执行完毕,此时浮点寄存器F3的计算结果是什么,代表什么含义?
答:F3的计算结果是1.981405E+001,代表girl的BMI值

(11) 对照源代码和上述执行过程,理解BMI.s整个程序的功能、含义,撰写完整的程序注释,并画出程序工作流程图。

程序注释:

# BMI.s
.text                      # .text为代码段的开始标志
main:                      # main标志为程序入口
ADDIU $r1,$r0,boy          # 将boy的初始地址赋给r1
ADDIU $r2,$r0,1            # 将r2赋值为1
B CALCBOY                  # 以B开头,分支指令,若判断为真则跳转到CALCBOY
CALCGIRL:                  # CALCGIRL程序段
ADDIU $r1,$r0,girl         # 将girl的初始地址赋给r1
ADDIU $r2,$r0,0            # 将r2赋值为0
CALCBOY:                   # CALCBOY程序段
LDC1 $f2,0($r1)            # Regs[F2]←Mem[0+Regs[R1]],即用F2存体重
LDC1 $f4,8($r1)            # Regs[F4]←Mem[8+Regs[R1]],即用F4存身高
LDC1 $f6,16($r1)           # Regs[F6]←Mem[16+Regs[R1]],即用F6存单位换算的值

MUL.D $f1,$f4,$f4          # 求身高的平方并赋给F1
DIV.D $f1,$f1,$f6          # 对身高的平方进行单位换算
DIV.D $f3,$f2,$f1          # 计算BMI的值并存入F3

BGTZ $r2,CALCGIRL          # 如果r2的值大于0,则跳转到CALCGIRL

NOP                        # 没有操作,即程序结束
TEQ $r0,$r0                # 比较r0与r0是否相等,没什么用

.data                      # 以下是数据段,存放的是boy和girl的身高、体重及单位换算要用的值
boy:
.double 72.0,173.0,10000.0 # 计算boy的bmi需要用到的数据
girl:
.double 52.0,162.0,10000.0 # 计算girl的bmi需要用到的数据

#计算BMI = 体重(kg)/身高的平方(m^2)

工作流程:

拓展内容(选做)

请自行练习Ripes(RISC-V ISA可视化模拟器)运行示例程序(或自编程序),查看单步运行过程,观察5阶段RISC-V处理器架构、寄存器窗口、内存窗口等变化。并结合RISC-V手册尝试读懂部分汇编源程序的内容,记录实验过程中所看到的现象并进行分析和理解。

提示:
1. Load Example…中有三段不同功能的汇编程序(Assembly)
2. MIPSsim和Ripes中都有计算阶乘的内置示例程序(fact/factorial),请查看各自的汇编源程序代码进行对照比较,分析相同和不同之处。

笔者并非系统结构的专业研究人员,也未参与高性能等与硬件相关的课题研究,因此未选做。

实验结果

通过本次实验,了解和熟悉了指令级模拟器;熟练掌握了MIPSsim模拟器的操作和使用方法;熟悉了MIPS指令系统及其特点,加深了对MIPS指令操作语义的理解;熟悉了MIPS体系结构。并通过使用MIPSsim模拟器,执行bmi.s代码计算了boy和girl的bmi值:

  • boy的bmi值是2.405693E+001,转为十进制:24.05693,根据BMI中国标准就是过重
  • girl的bmi值是1.981405E+001,转为十进制:19.81405,根据BMI中国标准就是正常

BMI中国标准

心得体会

本次实验,了解和掌握了MIPS体系结构和指令系统。并通过一个示例程序bmi.s熟练了MIPS常见指令的用法及含义。因为平常都是使用高级语言如C/C++,及Python等编程,对汇编语言接触比较少,通过本次实验,发现了高级语言其实和汇编语言也有一些相同的地方,比如都申明一个main标志作为程序的入口。因此,只要认真学了,理清逻辑思路,体系结构或许也没想象中的那么难。

参考资料

  1. MIPS指令系统介绍,请参考实验附录C
  2. MIPSSim模拟器使用说明,请参考实验附录B。
  3. 关于内存编址、CPU控制器、PC寄存器等基础知识,请自行查找资料学习和了解计算机组成原理。
  4. David Patterson, Andrew Waterman. RISC-V 手册
  5. Ripes模拟器:https://github.com/mortbopet/Ripes/releases

以上是关于实验报告实验一 MIPS指令系统和MIPS体系结构的主要内容,如果未能解决你的问题,请参考以下文章

MIPS编程系列总结

3.5 MIPS体系结构

设计mips32cpu时,运算指令溢出怎么处理

计算机系统5-; 计组与体系结构2 | MIPS指令集(上)| 指令系统

3.6 MIPS指令简介

mipsel汇编指令学习