【计算机系统结构实验】实验1 RISC体系结构与指令系统

2023-12-22 21:33:23

1.1 实验目的

了解和熟悉指令级模拟器MIPSsim的操作和使用方法;

熟悉MIPS体系结构;

熟悉MIPS指令系统及其特点,加深对MIPS指令操作语义的理解。

1.2 实验平台

实验平台采用指令级和流水线操作级模拟器MIPSsim(64位)。

1.3实验内容

简要阅读课件第2章的“2.6节MIPS指令系统结构”;

阅读“MIPSsim使用手册.pdf”(流水寄存器部分无需看),了解MIPSsim模拟器的使用方法;

实验时参照“MIPS指令列表.pdf”查用到的指令的含义。

  1. 启动MIPSsim(鼠标双击MIPSsim.exe)。
  2. 选择“配置”→“流水方式”选项,使模拟器工作在非流水方式下。
  3. 简要熟悉一下MIPSsim模拟器的使用方法。可先载入一个样例程序(在本模拟器目录的“样例程序”文件夹中 ),自己随便执行一下试一下。
  4. 载入样例程序alltest.s,单步执行,每执行一步,观察并记录特殊寄存器PC的值的变化,相应通用寄存器的值的变化,相应内存单元内容的变化,注意多字节数据在内存中按小端(little endian)模式存储(即低字节序:低字节占低地址)。运行到乘法指令时观察特殊寄存器LO, HI值的变化。并写出每条执行到的指令的含义(不明白的指令查MIPS指令列表.pdf和第2章课件2.6节)。一直单步执行到LABEL4? TEQ $r0, $r0指令为止。

1.ADDIU $r8, $r0, 124

这条命令将寄存器r0中的值(值为0)加上124,然后赋给寄存器r8。

可以看到,通用寄存器r8的值现在为124。

PC的值为下一条要执行的指令的地址0x00..0004。

2.LB $r1, 0($r8)

这条命令将寄存器r8内的值与偏移量0加起来(值为124,对应十六进制为7C),作为地址对应到内存中,找到这一地址中存放的值(取8位),并将其存放至寄存器r1中。

我们可以看到,在内存0x00..007C中,存储着0x80。

查看r1中的值,为带符号数。

PC指向下一条指令。

3.LW $r1, 0($r8)

这条命令将寄存器r8内的值与偏移量0加起来(值为124,对应十六进制为7C),作为地址对应到内存中,找到这一地址中存放的值(取32位),并将其存放至寄存器r1中。

我们可以看到,在内存0x00..007C中,存储着0x00000080。

查看r1中的值。

PC指向下一条指令。

4.LBU $r1, 0($r8)

这条命令将寄存器r8内的值与偏移量0加起来(值为124,对应十六进制为7C),作为地址对应到内存中,找到这一地址中存放的值(取8位无符号),并将其存放至寄存器r1中。

我们可以看到,在内存0x00..007C中,存储着0x80。

查看r1中的值,为无符号数。

PC指向下一条指令。

5.ADDIU $r8, $r0, 128

这条命令将寄存器r0中的值(值为0)加上128,然后赋给寄存器r8。

可以看到,通用寄存器r8的值现在为128。

PC的值为下一条要执行的指令的地址。

6.SW $r1, 0($r8)

这条指令将r1的内容存入内存(存字),内存的地址为0+r8中的数值。

可以看到,r1中的数值为0x00000080,r8中的数值为0x0080。

所以,这条指令将0x00000080存储到地址为0x0080的内存中。

PC的值为下一条要执行的指令的地址。

7.BEQ $r0, $r0, PROG2

这条指令表示,如果r0寄存器的值与r0中的相同,则跳转到PROG2标志所指向的指令。

PC的值为下一条要执行的指令的地址。

8.DADD $r3, $r1, $r2

这条指令将寄存器r1与r2的值相加,并存储至r3中(双字)。

可以看到,r1中的值0x0000000000000080与r2中的0相加,并放入了r3之中。

PC的值为下一条要执行的指令的地址。

9.DMULT $r1, $r2

该命令将寄存器r1与r2中的值相乘,并将乘积的低64位送入LO,高64位送入HI(有符号)。

可以看到128与0的乘积为0。

LO与HI中的值即为0,PC的值为下一条要执行的指令的地址。

10.BEQ $r0, $r0, PROG3

这条指令表示,如果r0寄存器的值与r0中的相同,则跳转到PROG3标志所指向的指令。

PC的值为下一条要执行的指令的地址。

11.AND $r3, $r1, $r2

这条指令将寄存器r1与r2之中的值相与,并将结果存储至r3中。

可以看到,r1与r2中的值相与的结果为0,所以r3之中的结果为0。

PC的值为下一条要执行的指令的地址。

12.ANDI $r3, $r1, 0

这条指令将r1之中的值与立即值0相与(结果为0),并将结果放至r3中。

可以看到,r3之中的值为0。

PC的值为下一条要执行的指令的地址。

13.BEQ $r0, $r0, PROG4

这条指令表示,如果r0寄存器的值与r0中的相同,则跳转到PROG4标志所指向的指令。

PC的值为下一条要执行的指令的地址。

14.BEQ $r1, $r2, 2

这条指令表示,如果r1寄存器的值与r2中的相同,则以2作为相对于PC + 4的偏移量进行转移。

显然,寄存器r1与r2之中的值并不相等,所以不发生转移。

PC的值为下一条要执行的指令的地址。

15.SLL $r0, $r0, 0

这条指令将r0中的低32位进行逻辑左移(左移0位),结果按符号位扩展,然后放入r0。

R0移位之前值为0,移位之后,值还为0。

PC的值为下一条要执行的指令的地址。

16.SLL $r0, $r0, 0

执行过程与15.SLL $r0, $r0, 0相似。

17.BGEZ $r1, 2

这条指令表示,如果寄存器r1中的值大于等于0,则由16位带符号偏移量0x0000000000000010左移两位后和PC(PC值为4C+4等于50)相加,得0x00000058。

可以看到,r1的值为0x00080,大于0,所以进行转移。

PC的值为下一条要执行的指令的地址。

18.BGEZAL $r1, 2

当r1之中的值大于等于0时,由16位带符号偏移量0x0000000000000010左移两位后和PC(PC值为58+4等于5C)相加,得0x00000064,并当前PC值(0x00005C)保存到r31。

可以看到,r1的值为0x00080,大于0,所以进行操作。

可以看到,r31中保存的值为5C。

PC的值为下一条要执行的指令的地址。

19.ADDIU $r1, $r0, 116

这条命令将寄存器r0中的值(值为0)加上116,然后赋给寄存器r1。

可以看到,通用寄存器r1的值现在为116。

PC的值为下一条要执行的指令的地址。

20.JALR $r3, $r1

无条件转移到寄存器r1给出的地址,并将返回地址保存到r3中。

可以看到,r1和PC寄存器的值为0x00000074。

R3寄存器的值为0x0000006C。

21.TEQ $r0, $r0

执行到这句指令时,程序执行中止。

-------------------------------------------------------------------------------------------------------

最后一点碎碎念:如果各位有发现本文有哪处有误或理解不当的地方,敬请指正。

文章来源:https://blog.csdn.net/weixin_52553215/article/details/135161012
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。