【计算机系统结构实验】实验1 RISC体系结构与指令系统
1.1 实验目的
了解和熟悉指令级模拟器MIPSsim的操作和使用方法;
熟悉MIPS体系结构;
熟悉MIPS指令系统及其特点,加深对MIPS指令操作语义的理解。
1.2 实验平台
实验平台采用指令级和流水线操作级模拟器MIPSsim(64位)。
1.3实验内容
简要阅读课件第2章的“2.6节MIPS指令系统结构”;
阅读“MIPSsim使用手册.pdf”(流水寄存器部分无需看),了解MIPSsim模拟器的使用方法;
实验时参照“MIPS指令列表.pdf”查用到的指令的含义。
- 启动MIPSsim(鼠标双击MIPSsim.exe)。
- 选择“配置”→“流水方式”选项,使模拟器工作在非流水方式下。
- 简要熟悉一下MIPSsim模拟器的使用方法。可先载入一个样例程序(在本模拟器目录的“样例程序”文件夹中 ),自己随便执行一下试一下。
- 载入样例程序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
执行到这句指令时,程序执行中止。
-------------------------------------------------------------------------------------------------------
最后一点碎碎念:如果各位有发现本文有哪处有误或理解不当的地方,敬请指正。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!