实验一MIPS指令集实验Word格式文档下载.docx

上传人:b****7 文档编号:22261550 上传时间:2023-02-03 格式:DOCX 页数:24 大小:698.17KB
下载 相关 举报
实验一MIPS指令集实验Word格式文档下载.docx_第1页
第1页 / 共24页
实验一MIPS指令集实验Word格式文档下载.docx_第2页
第2页 / 共24页
实验一MIPS指令集实验Word格式文档下载.docx_第3页
第3页 / 共24页
实验一MIPS指令集实验Word格式文档下载.docx_第4页
第4页 / 共24页
实验一MIPS指令集实验Word格式文档下载.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

实验一MIPS指令集实验Word格式文档下载.docx

《实验一MIPS指令集实验Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《实验一MIPS指令集实验Word格式文档下载.docx(24页珍藏版)》请在冰豆网上搜索。

实验一MIPS指令集实验Word格式文档下载.docx

2)学会正确使用WinMIPS64的IO方法;

(10分)

3)编写完整的排序程序;

三、实验环境

硬件:

桌面PC

软件:

Windows,WinMIPS64仿真器

四、实验步骤及说明

WinMIPS64是一款指令集模拟器,它是基于WinDLX设计的,如果你对于WinDLX这款软件十分熟悉的话,那么对于WinMIPS64也会十分的容易上手。

DLX处理器(发音为"

DeLuXe"

)是Hennessy和Patterson合著一书《ComputerArchitecture-AQuantitativeApproach》中流水线处理器的例子。

WinDLX是一个基于Windows的模拟器。

本教程通过一个实例介绍WinMIPS64的使用方法。

WinMIPS64模拟器能够演示MIPS64流水线是如何工作的。

本教程使用的例子非常简单,它并没有囊括WinMIPS64的各个方面,仅仅作为使用WinMIPS64的入门级介绍。

如果你想自己了解更多的资料,在给出的winmips64.zip中,有WinMIPS64 — DocumentationSummary.html和winmipstut.docx两个文件可以供你随时参考,其中涵盖了WinMIPS64的指令集和模拟器的组成与使用方法。

虽然我们将详细讨论例子中的各个阶段,但你应具备基本的使用Windows的知识。

现假定你知道如何启动Windows,使用滚动条滚动,双击执行以及激活窗口。

(一)、安装

请按以下步骤在Windows下安装WinMIPS64 :

1.为WinMIPS64 创建目录,例如D:

\WinMIPS64 

2.解压给出的winmips64.zip压缩文件到创建的目录中。

(二)、一个完整的例子

1.开始和配置WinMIPS64

在winmips64这个子目录下,双击winmips64.exe文件,即打开了WinMIPS64模拟器,其外观如下图:

为了初始化模拟器,点击File菜单中的Resetall(Ctrl+R)菜单项即可。

OKOK

WinMIPS64可以在多种配置下工作。

你可以改变流水线的结构和时间要求、存储器大小和其他几个控制模拟的参数。

点击Configuration/FloatingPointStages(点击Configuration打开菜单,然后点击Architecture菜单项),选择如下标准配置:

如果需要,可以通过点击相应区域来改变设置。

然后,点击OK返回主窗口。

在Configuration菜单中的其他四个配置也可以设置,它们是:

Multi-Step,EnableForwarding,EnableBranchTargetBuffer和EnableDelaySlot。

点击相应菜单项后,在它的旁边将显示一个小钩。

本次实验要求不要勾选“EnableForwarding”。

2.装载测试程序

用标准的text编辑器来新建一个名为sum.s的文件,这个文件的功能是,计算两个整数A、B之和,然后将结果传给C。

程序如下:

.data

A:

.word10

B:

.word8

C:

.word0

.text

main:

ldr4,A(r0)

ldr5,B(r0)

daddr3,r4,r5

sdr3,C(r0)

halt

在将该程序装载进WinMIPS64之前,我们必须用asm.exe来检验该输入程序的语法正确性。

asm.exe程序文件在所给的winmips压缩包里有,用命令行使用它。

具体操作为,打开终端,利用cd命令进到D:

\WinMIPS64目录中,然后直接使用asm.exesum.s命令,检查输出结果是否无误。

在开始模拟之前,至少应装入一个程序到主存。

为此,选择File/OPEN,窗口中会列出当前目录中所有汇编程序,包括sum.s。

按如下步骤操作,可将这个文件装入主存。

点击sum.s

点击open按钮

现在,文件就已被装入到存储器中了,现在可以开始模拟工作了。

你可以在CODE窗口观察代码内容,可以在DATE窗口观察程序数据了。

3.模拟

在主窗口中,我们可以看见七个子窗口,和一条在底部的状态栏。

这七个子窗口分别是Pipeline,Code,Data,Registers,Statistics,Cycles和Terminal。

在模拟过程中将介绍每一个窗口的特性和用法。

(1)Pipeline窗口

在Pipeline窗口中,展示了MIPS64处理器的内部结构,其中包括了MIPS64的五级流水线和浮点操作(加法/减法,乘法和除法)的单元。

展示了处于不同流水段的指令。

(2)Code窗口

我们来看一下Code窗口。

你将看到代表存储器内容的三栏信息,从左到右依次为:

地址(符号或数字)、命令的十六进制机器代码和汇编命令。

我们可以看到,初始时,第一行为黄色,表示该行指令处于“取指”阶段。

现在,点击主窗口中的Execution开始模拟。

在出现的下拉式菜单中,点击SingleCycle或按F7键。

这时,第一行变成了了蓝色,第二行变成了黄色,这表示第一行指令处于“译码”阶段,而第二行指令处于“取指”阶段。

这些不同的颜色代表指令分别处于不同的流水线阶段。

黄色代表“取指”,蓝色代表“译码”,红色代表“执行”,绿色代表“内存数据读或写”,紫色代表“写回”。

接着按F7,直到第五个时钟周期的时候,有趣的事情发生了,“daddr3,r4,r5”指令没有从“译码”跳到其下一个流水阶段“执行”,并且“sdr3,C(r0)”指令,仍然停留在“取指”阶段,同时在terminal窗口显示一行信息“RAWStallinID(RS)”,思考一下这是为什么?

(3)Cycls窗口

我们将注意力放到Cycls窗口上。

它显示流水线的时空图。

在窗口中,你将看到模拟正在第五时钟周期,第一条指令正在WB段,第二条命令在MeM段,第四条命令在处于暂停状态(installed),第五条指令也因此停滞不前。

这是因为发生了数据相关(第四条指令的dadd命令需要用到寄存器r5的值,但是r5的值并不可用)。

接着点击F7,到第五个时钟周期时,再次发生相关,造成停滞。

接着点击F7,直至第十三个时钟周期全部指令执行结束。

值得一提的是,Cycls窗口是分为两个子窗口的,左边的子窗口是一系列的指令,右边的窗口是图示的指令执行过程。

其中,左边子窗口的命令是动态出现的,当一条指令在进行“取指”时,该指令才出现,而且,当出现了数据相关的时候,所涉及到的指令会变色,暂停的指令会变成蓝色,而被其影响的后续指令会变成灰色。

(4)Data窗口

在Data中,我们可以观察到内存中的数据,包括数据内容和地址两个方面,其中地址使用64位表示。

如果想改变一个整型的数据的值,左键双击该值所在的行,如果是想改变一个浮点类型的数据的值,那么请右键双击该值所在的行。

上图即为第十三个时钟周期的data窗口的图示,其中,左边一行即为用64位表示的内存地址,中间行为数据的内容,右边的一行为相关的代码。

可以看出,在这个时钟周期,A与B的值分别为0xa和0x8,C的值为0x12,表明A与B的值之和已经相加并保存到了C中。

(5)Registers窗口

这个窗口显示存储在寄存器中的值。

如果该寄存器为灰色,那么它正处于被一条指令写入的过程,如果它用一种颜色表示,那么就代表,该颜色所代表的的流水线阶段的值可以用来进行前递(forwarding)。

同时,这个窗口允许你交互式的该变寄存器的值,但是前提是该寄存器不能处于被写入或者前递的阶段。

如果想改变一个整型的数据的值,左键双击该值所在的行,如果是想改变一个浮点类型的数据的值,那么请右键双击该值所在的行,然后按OK来进行确定。

上图即为第十三个时钟周期的Registers窗口的图示,很显然,其中可以很清楚的看出每个寄存器的值是什么。

(6)Statistics窗口

最后我们来看一下Statistics窗口。

这个窗口是用来记录一些模拟周期的统计数据。

其中包括Execution,Stalls,和CodeSize三个大项。

其中,Execution用来显示模拟周期中指令数,执行周期数和CPI(没条指令所用周期数),Stalls用来表示暂停的周期数,并且分门别类的进行了统计,其中包括RAWStalls,WAWStalls,WARStalls,StructuralStalls,BranchTakenStalls和BranchmispredictionStalls。

CodeSize表示了代码的大小,用byte表示。

上图即为Statistics窗口的图示,其中表示了该程序有13个时钟周期,5条指令,CPI

为2.600,有4个RAWStalls,代码大小为20个Bytes。

(三)、更多操作

首先,点击MIPS64(ctrl+R)进行重置。

如果你点击Reset,你将删除内存中的数据,这样你就不得不重新装载文件,所以点击(F10)是一个很方便的重置的方法。

你可以一次推进多个时钟周期,方法是点击Execute/Multicycle(F8),而多个时钟周期数是在Configure/Multi-step中设置的。

你也可以通过按F4一次完成整个程序的模拟。

同时,你可以设置断点,方法是,在Code窗口中左键双击想要设置断点的指令,该指令会变成蓝色,然后点击F4,程序就会停在这条指令执行“取指”的阶段,如果想要清除断点,再次左键双击改行指令。

(四)、终端I/O的简单实例

通过上面对WinMIPS64的了解,我们可以开始简单的使用该工具了。

这里,需要我们编写一个简单的终端输出“HelloWorld!

”的小程序,运行并且截图。

所以,我们需要了解如何将数据在终端中输出输入。

下图是I/O区域的内存映射,一个是控制字,一个是数据字:

所以我们需要先将CONTROL和DATA地址读取到寄存器,然后分别在这两个区域内存储相应的序列号(如上图所示)和要显示在Terminal窗口的数据,同时,设置CONTROL为9,我们能对其进行读取数据。

请编写完整程序,输出“HelloWorld!

”字符串。

然后通过asm.exe来检验该程序的语法正确性,然后在WinMIPS64中的File栏中open打开文件。

最后一步步按F7,同时观察各个窗口。

最终还要截取Terminal窗口,图如下:

证明你的程序结果输出了“HelloWorld!

”。

(五)、编写排序算法

在这一部分,我们要求编写一个排序算法,对一组int型数据进行排序。

该算法使用冒泡排序法,并且在其中嵌入一个swap函数过程(该算法在课本上有完整的程序,但是其中的数据初始化、寄存器映射、命令的映射以及I/O部分还需要自己手动编写)。

编写完成后,在asm.exe中进行检测,然后运行。

初始数据要求为:

“array:

.word8,6,3,7,1,0,9,4,5,2”

该程序需要对0到10,十个数进行了排序,其中使用了sort和swap两个函数过程,并且swap是嵌套在sort中的,在编写程序的时候一定要注意使用栈来保留寄存器的值,嵌套时还额外需要保存$ra的值。

在WinMIPS64运行上述程序,将得到如下结果(这里只给出Terminal窗口的截图即可):

观察实验截图,证明你的程序确实做到了对数组排序的效果。

注意:

需要将SP初始化为内存最高地址,否则为初始化SP为0,SP-1将指向FFFFFFFF,该地址将超出winmips默认的内存空间。

五、实验结果截图

(一)安装WinMIPS64 :

将安装包解压到D:

\

(二)一个完整的例子

1.开始和配置WINMIPS64

本实验要求不勾选“EnableForwarding”。

如下所示:

用asm.exe来检验该输入程序的语法正确性。

具体操作:

打开终端,利用cd命令进到D:

装入一个程序到主存。

选择File/OPEN,窗口中会列出当前目录中所有汇编程序,包括sum.s。

在CODE窗口观察代码内容,可以在DATA窗口观察程序数据。

3.模拟

点击主窗口中的Execution开始模拟。

这时,第一行变成了蓝色,第二行变成了黄色,这表示第一行指令处于“译码”阶段,而第二行指令处于“取指”阶段。

第五个时钟周期的时候,“daddr3,r4,r5”指令没有从“译码”跳到其下一个流水阶段“执行”,并且“sdr3,C(r0)”指令,仍然停留在“取指”阶段,同时在terminal窗口显示一行信息“RAWStallinID(RS)”。

在Cycls窗口中,可以看到模拟正在第五时钟周期,第一条指令正在WB段,第二条命令在MeM段,第四条命令在处于暂停状态(installed),第五条指令也因此停滞不前。

在Data窗口中,可以观察到内存中的数据,包括数据内容和地址两个方面,其中地址使用64位表示。

在Registers窗口,显示存储在寄存器中的值。

Statistics窗口,是用来记录一些模拟周期的统计数据。

上图即为Statistics窗口的图示,其中表示了该程序有5个时钟周期,1条指令,CPI

为5.000,有2个RAWStalls,代码大小为20个Bytes。

(三)更多操作

点击Execute/Multicycle(F8),可一次推进多个时钟周期。

(四)终端I/O的简单实例

程序如下所示:

通过asm.exe来检验该程序的语法正确性。

从cmd窗口中,可以看到程序语法正确。

在WinMIPS64中的File栏中open打开文件。

在第11个时钟周期,程序在Terminal窗口输出了“HelloWorld”。

如下图所示:

代码如下:

.data

after:

.asciiz"

Aftersortthearrayis:

\n"

before:

Beforesortthearrayis:

CONTROL:

.word0x10000

DATA:

.word0x10008

SP:

.word0x7ffffffc

flag:

.word0

array:

.word8,6,3,7,1,0,9,4,5,2

.text

daddir29,r0,SP#r29--$sp

ldr16,CONTROL(r0)

ldr17,DATA(r0)

daddir8,r0,4#setstringoutput

daddir9,r0,before#promptline

sdr9,(r17)

sdr8,(r16)#print

daddir8,r0,2#setsignedIntegeroutput

daddir1,r0,0#i<

-0

Loop:

ldr9,array(r1)#geta[i]

sdr8,(r16)#printa[i]

daddir1,r1,8#i++

daddir2,r1,-80

beqr2,r0,Exit#ifi=10,exit

jLoop

Exit:

daddir4,r0,array#parameter1addressofa[]

daddir5,r0,10#parameter2n

jalbubblesort

daddir9,r0,after#promptline

Loop3:

beqr2,r0,Exit3#ifi=10,exit

jLoop3

Exit3:

halt

bubblesort:

daddir29,r29,-24#makeroomonstack

sd$ra,16(r29)

sdr16,8(r29)

sdr17,0(r29)

daddr22,r4,r0#geta[]

daddir23,r5,0#getn

andr18,r18,r0#i=0

fori:

sltr10,r18,r23#ifi<

n,r10=1

beqr10,r0,exiti#ifi>

n,jumpexiti

daddir19,r18,-1#j<

-i-1

forj:

sltir10,r19,0#ifj<

0,r10=1

bner10,r0,exitj#ifj<

0,jumpexitj

dsllr11,r19,3#j*8

daddr12,r11,r22#a+j*8

ldr13,0(r12)#a[j]

ldr14,8(r12)#a[j+1]

sltr10,r14,r13

beqr10,r0,exitj#ifa[j+1]>

a[j]jumpexitj

daddr4,r0,r22#parameter1addressofa[]

daddir5,r19,0#parameter2j

jalswap

daddir19,r19,-1#j--

jforj

exitj:

daddir18,r18,1

jfori

exiti:

ldr17,0(r29)

ldr16,8(r29)

ld$ra,16(r29)

daddir29,r29,24#restorestackpointer

jr$ra

swap:

dsllr8,r5,3#r8=k*8

daddr8,r4,r8#r8=a+(k*8)

ldr9,0(r8)#r9=a[k]

ldr10,8(r8)#r10=a[k+1]

sdr10,0(r8)#a[k]=r10

sdr9,8(r8)#a[k+1]=r9

在cmd窗口中测试程序的正确性。

结果,显示0errors,说明程序正确。

在MIPS中运行,结果如下所示:

Terminal中数组元素已经正确排序。

六、实验总结与体会

本实验通过一个例子介绍了WinMIPS64的重要特性,使我对流水线和MIPS64的操作类型有了一定的了解。

当然,我还必须学习更多的知识,才能更深入地了解WinMIPS64。

指导教师批阅意见:

成绩评定:

指导教师签字:

年月日

备注:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 文学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1