跳转至

实验 1:汇编语言与监控程序

实验目的

本实验是计算机组成原理课程一系列实验中的第一个实验。计算机组成原理的一系列实验最终的目的是做出一个兼容 RV32I 指令的五级流水线处理器,并可以执行监控程序。监控程序使用了 RV32I 中的 19 条指令,实验只要实现这 19 条指令即可(参看监控程序源代码下的 README.md 文件给出的 19 条指令的描述)。为了完成所有的实验,熟悉 RISC-V 的汇编语言编程,RISC-V 指令格式是非常必要的。本实验是所有后续实验的基础,帮助同学们熟悉 RISC-V 的汇编语言。

实验环境

本实验需要 RISC-V 的交叉编译环境,模拟器环境。本实验对于操作系统环境没有特殊的要求,Windows,Linux 或者 macOS 下均可。但是,由于之后的实验需要编写 Verilog 代码,并且只能使用 Vivado 编程环境,因此建议使用 Windows 环境或者 Linux 环境。

实验内容

阅读监控程序源代码,使用模拟器运行监控程序,通过终端连接监控程序,使用 RISC-V 汇编编写代码,并且在监控程序中运行。

  1. 在模拟器中运行 RISC-V 监控程序,掌握 Term 中几个命令的使用方法。
  2. 编写汇编程序,求前 10 个 Fibonacci 数(前两项为 1),将结果保存到起始地址为 0x80400000 的 10 个字中,并用 D 命令检查结果正确性。
  3. 编写汇编程序,将 ASCII 可见字符(0x21~0x7E)从终端输出。
  4. 编写汇编程序,求第 60 个 Fibonacci 数,将结果保存到起始地址为 0x80400000 的 8 个字节中,并用 D 命令检查结果正确性。提示:计算过程中可以用两个 32 位寄存器保存 64 位整数。

Tips

为了从终端输出字符,你可以使用如下的函数:

WRITE_SERIAL:
    // 串口地址是 0x10000000
    li t0, 0x10000000

    // 轮询串口状态(0x10000005)
.TESTW:
    lb t1, 5(t0)
    // 判断是否可写
    andi t1, t1, 0x20
    beq t1, zero, .TESTW

.WSERIAL:
    // 向终端(0x10000000)输出 a0 寄存器中的最低字节
    sb a0, 0(t0)
    jr ra

请把它复制到你的代码中再调用。并注意这个函数调用的时候会破坏寄存器 t0t1 的值。

实验原理

监控程序使用的是 RISC-V 汇编语言编写而成,可以在任意的兼容 RISC-V 的模拟器中执行。终端程序通过串口程序与监控程序打交道。终端程序还具有汇编和反汇编的功能,将程序汇编之后输入到监控程序中,或者配合监控程序输出做反汇编。具体的功能建议阅读监控程序和终端程序的代码。

实验步骤

  1. 安装和配置实验环境,过程参考前述的模拟器安装,监控程序执行的流程。
  2. 按照实验内容的要求完成具体的汇编程序代码,并在监控程序中执行。
  3. 阅读监控程序和终端程序,了解其工作原理。

实验结果

  1. 撰写实验报告(建议以 PDF 格式提交),记录上述的实验过程及汇编代码。留存实验过程的截图,或者是通过录屏记录实验过程。
  2. 撰写监控程序以及终端程序的代码分析报告,包括程序的结构以及程序与外部交互的流程。

思考题目

实验报告需要提交实验思考题:

  1. 比较 RISC-V 指令寻址方法与 x86 指令寻址方法的异同。
  2. 阅读监控程序,列出监控程序的 19 条指令,请根据自己的理解对用到的指令进行分类,并说明分类原因。(参考 README.md)
  3. 结合 term 源代码和 kernel 源代码说明 term 是如何实现用户程序计时的。
  4. 说明 kernel 是如何使用串口的。
  5. 请问 term 如何检查 kernel 已经正确连入,并分别指出检查代码在 term 与 kernel 源码中的位置。

实验 1 的实验报告不需要涉及到非基础版本的监控程序。之后,如果计划设计的处理器需要支持扩展版本的监控程序,还是需要阅读扩展版本的监控程序。

实验 1 的代码可以使用 19 条指令之外的 RV32I 的指令,这样就需要在实验 6 中实现对应的指令。


最后更新: 2022年9月19日
作者:Jiajie Chen (56.34%), Youyou Lu (23.94%), gaoyichuan (14.08%), Kang Chen (5.63%)