计算机系统结构实验报告.docx

上传人:b****5 文档编号:7182792 上传时间:2023-01-21 格式:DOCX 页数:12 大小:409.06KB
下载 相关 举报
计算机系统结构实验报告.docx_第1页
第1页 / 共12页
计算机系统结构实验报告.docx_第2页
第2页 / 共12页
计算机系统结构实验报告.docx_第3页
第3页 / 共12页
计算机系统结构实验报告.docx_第4页
第4页 / 共12页
计算机系统结构实验报告.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

计算机系统结构实验报告.docx

《计算机系统结构实验报告.docx》由会员分享,可在线阅读,更多相关《计算机系统结构实验报告.docx(12页珍藏版)》请在冰豆网上搜索。

计算机系统结构实验报告.docx

计算机系统结构实验报告

计算机系统结构实验报告

---------------------实验一、熟悉WinDLX的使用

 

 

姓名:

徐丽

班级:

计算机一班

学号:

201200131113

一、实验目的  

通过本实验,熟悉WinDLX模拟器的操作和使用,了解DLX指令集结构及其特点。

二、实验内容

(1)用WinDLX模拟器执行求阶乘程序facts。

执行步骤详见“WinDLX教程”。

这个程序说明浮点指令的使用。

该程序从标准输入读入一个整数,求其阶乘,然后将结果输出。

该程序中调用了input.s中的输入子程序,这个子程序用于读入正整数。

(2)输入数据“3”采用单步执行方法,完成程序并通过上述使用WinDLX,总结WinDLX的特点。

(3)注意观察变量说明语句所建立的数据区,理解WinDLX指令系统。

三、实验步骤

3.1装载测试程序

选择File/LoadCodeorData,将fact.s与input.s这两个文件装入主存。

fact.s计算一个整型值的阶乘,input.s中包含一个子程序,它读键盘并将值存入DLX处理器的通用寄存器R1中。

代码如下所示:

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

;Programbeginatsymbolmain

;requiresmoduleINPUT

;readanumberfromstdinandcalculatethefactorial(type:

double)

;theresultiswrittentostdout

;--------------------------------------------------------------------------

.data

Prompt:

.asciiz"Anintegervalue>1:

"在变量Prompt中存放一个字符串

PrintfFormat:

.asciiz"Factorial=%g\n\n"在变量pringformat中存放一个字符串

.align2

PrintfPar:

.wordPrintfFormatprintfFormat的地址值

PrintfValue:

.space8给PrintValue保留8个字节

.text正文

.globalmain标号main

main:

程序在main开始

;***ReadvaluefromstdinintoR1说明:

从标准输入程序读值到R1

addir1,r0,Prompt0+Prompt地址值送R1

jalInputUnsigned转输入程序InputUnsigned

;***initvalues输入的值在R1中

movi2fpf10,r1;R1->D0D0..CountregisterR1送F10(整形变量变为浮点变量)

cvti2df0,f10F10送F0,F1(单精度变为双精度)

addir2,r0,1;1->D2D2..result0+1送R2

movi2fpf11,r2R2送F11(整形变量变为浮点变量)

cvti2df2,f11F11送F2,F3(单精度变为双精度)

movdf4,f2;1->D4D4..Constant1F2,F3送F4,F5

;***BreakloopifD0=1说明

Loop:

ledf0,f4;D0<=1?

标号:

LOOPIF(F0<=F4)FPS=1ELSEFPS=0

bfptFinishIFFPS=1转Finish

;***Multiplicationandnextloop下一个程序段说明

multdf2,f2,f0f2*f0送f2

subdf0,f0,f4F0-F4送f0

jLoop转loop

Finish:

;***writeresulttostdout结束标号写结果到标准输出程序

sdPrintfValue,f2结果值由f2送变量PrintfValue

addir14,r0,PrintfParPrintfPar地址值送R14

trap5自陷调用5将结果值输出

;***end

trap0自陷调用0程序结束

该程序中调用了input.s中的输入子程序

;-----------------------------------------------------------------------------

;Subprogramcallbysymbol"InputUnsigned"

;expecttheaddressofazero-terminatedpromptstringinR1

;returnsthereadvalueinR1

;changesthecontentsofregistersR1,R13,R14

;-----------------------------------------------------------------------------

.data

;***DataforRead-Trap

ReadBuffer:

.space80输入缓冲区80个字节

ReadPar:

.word0,ReadBuffer,80变量ReadPar一个字“0”

;***DataforPrintf-Trap

PrintfPar:

.space4变量PrintfPar保留4个字节

SaveR2:

.space4变量SaveR2保留4个字节

SaveR3:

.space4

SaveR4:

.space4

SaveR5:

.space4

.text

.globalInputUnsigned标号InputUnisigned

InputUnsigned:

;***saveregistercontents

swSaveR2,r2R2送M(SaveR2)

swSaveR3,r3

swSaveR4,r4

swSaveR5,r5

;***Prompt

swPrintfPar,r1R1送PrintfPar

addir14,r0,PrintfParPrintfPar+0送R14

trap5自陷调用5

;***callTrap-3toreadline

addir14,r0,ReadParReadPar+0送R14

trap3自陷调用3

;***determinevalue

addir2,r0,ReadBufferReadBuffer+0送R2

addir1,r0,00送R1

addir4,r0,10;Decimalsystem10送R4

Loop:

;***readsdigitstoendofline标号LOOP

lbur3,0(r2)M(R2)+0送R3(R2内容为ReadBuffer的地址)

seqir5,r3,10;LF->ExitIF(R3=立即数10)1送R5ELSE0送R5

bnezr5,FinishIF(R5不等于0)转Finish

subir3,r3,48;?

?

R3-48送R3(48为十六进制30,ASCII码变换)

multur1,r1,r4;ShiftdecimalR4*R1送R1

addr1,r1,r3R3+R1送R1

addir2,r2,1;incrementpointerR2+1送R2

jLoop转LOOP

Finish:

;***restoreoldregistercontents标号Finish

lwr2,SaveR2M(SaveR2)送R2

lwr3,SaveR3

lwr4,SaveR4

lwr5,SaveR5

jrr31;ReturR31送PC从子程序返回

3.2模拟

双击Code图标,从左到右依次为代表存储器内容的三栏信息:

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

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

按F7键开始执行。

这时,窗口中带有地址“$TEXT”的第一行变成黄色。

按下F7键,模拟就向前执行一步,第一行的颜色变成橘黄色,下一行变成黄色。

这些不同颜色指明命令处于流水线的哪一段。

命令“jalInputUnsigned”在IF段,“addir1,r0,0x1000”在第二段ID。

其他方框中带有一个“X”标志,表明没有处理有效信息。

再次按下F7键,代码窗口中的颜色会再改变,红色表明命令处入第三段“intEX”。

再按下F7,在代码窗口中,黄色出现在更下面的位置,并且是唯一彩色行。

打开ClockCycleDiagram窗口。

它显示流水线的时空图。

  第一条命令正在MEM段,第二条命令在intEX段,第四条命令在IF段。

而第三条命令指示为“aborted”。

其原因是:

第二条命令(jal)是无条件分支指令,但只有在第三个时钟周期,jal指令被译码后才知道,这时,下一条命令movi2fp已经取出,但需执行的下一条命令在另一个地址处,因而,movi2fp的执行应被取消,在流水线中留下气泡。

jal的分支地址命名为“InputUnsigned”。

为找到此符号地址的实际值,点击主窗口中的Memory和Symbols,出现的子窗口中显示相应的符号和对应的实际值。

在“Sort”:

区域选定“name”,使它们按名称排序,而不是按数值排序。

数字后的“G”代表全局符号,“L”代表局部符号。

“input”中的“InputUnsigned”是一个全局符号,它的实际值为0x144,用作地址。

点击OK按纽关闭窗口。

再一次点击F7,第一条命令(addi)到达流水线的最后一段。

对准Clockcyclediagram窗口中相应命令所在行,然后双击它,弹出一个新窗口。

窗口中会详细显示每一个流水段处理器内部的执行动作。

这个窗口“Informationabout...”作为将来的Information窗口。

观察完后,点击OK按钮关闭窗口。

双击第三行(movi2fp),它只执行了第一段(IF),这是因为出现跳转而被取消。

当通过Code窗口观察代码时,接下来的几条指令几近一样,它们都是sw-操作:

将寄存器中的数写入存储器中。

重复按F7将很枯燥,因此使用断点加快此过程。

  

现在,指向Code窗口中包含命令trap0x5的0x0000015c行,此命令是写屏幕的系统调用。

单击命令行,然后点击主窗口菜单Code,单击SetBreakpoint(确保命令行仍被标记!

),将弹出一个新的“SetBreakpoint”窗口。

通过此窗口,你可以选择命令运行到流水线的哪一阶段时,程序停止执行。

缺省为ID段。

点击OK关闭窗口。

在Code窗口中,trap0x5行上出现了“BID”,它表示当本指令在译码段时,程序中止执行。

现在点击Execution/Run或按F5,模拟就继续运行。

会出现一个对话框提示你“ID-Stage:

reachedatBreakpoint#1”,按"确认"按钮关闭。

点击Clockcyclediagram窗口中的trap0x5行,你将看到模拟正处于时钟周期14。

trap0x5行如下所示:

原因是:

无论何时遇到一条trap指令时,DLX处理器中的流水线将被清空。

在Information窗口(双击trap行弹出)中,在IF段显示消息“3stall(s)becauseofTrap-Pipeline-Clearing!

”。

指令trap0x5已经写到屏幕上,你可以通过点击主窗口菜单条上的Execute/DisplayDLX-I/O来查看。

为进一步模拟,点击Code窗口,用箭头键或鼠标向下滚动到地址为0x00000194的那一行(指令是lwr2,SaveR2(r0)),点击此行,点击Code/SetBreakpoint/OK,在这一行上设置一个断点。

采用同样的方法,在地址0x000001a4(指令jarr31)处设置断点。

现在按F5继续运行。

这时,会弹出DLX-Standard-I/O窗口,在信息“Anintegervalue>1:

”后鼠标闪烁,键入20然后按Enter,模拟继续运行到断点#2处。

在Clockcyclediagram窗口中,在指令之间出现了红和绿的箭头。

红色箭头表示需要一个暂停,箭头指向处显示了暂停的原因。

R-Stall(R-暂停)表示引起暂停的原因是RAW。

绿色箭头表示定向技术的使用。

双击主窗口中的Register图标。

Register窗口会显示各个寄存器中的内容。

看一下R1到R5的值。

按F5使模拟继续运行到下一个断点处,有些值将发生改变,指令lw从主存中取数到寄存器中。

点击Execute/MultipleCycles或者按F8键,在新出现的窗口中输入17,然后按Enter键,模拟程序将继续运行17个时钟周期。

向上滚动Clockcyclediagram窗口,直到看到指令周期72到78。

在EX段,两个浮点操作(multdandsubd)分别在不同的部件上运行,它们都需要多个周期才能结束。

因而在它们之后的下一条指令能取指,译码和执行,然后暂停一个周期以允许subd完成MEM段。

按F5使程序完成执行,出现消息“Trap#0occurred”表明最后一条指令trap0已经执行,Trap指令中编号“0”没有定义,只是用来终止程序。

双击图标Statistics。

Statistics窗口提供各个方面的信息:

模拟中硬件配置情况、暂停及原因、条件分支、Load/Store指令、浮点指令和traps。

窗口中给出事件发生的次数和百分比,如RAWstalls:

17(7.91%ofallCycles)。

Statistics窗口中的各种统计数字:

总的周期数(215)和暂停数(17RAW,25Control,12Trap;54Total),然后关闭窗口。

点击Configuration中的EnableForwarding使定向无效(去掉小钩),打开断点Breakpoints图标并点击Breakpoints菜单,删除所有断点,然后按F5,键入20后,按Enter,模拟程序一直运行到结束。

重新查看静态窗口,控制暂停和Trap暂停仍然是同样的值,而RAW暂停从17变成了53,总的模拟周期数增加到236。

利用这些值,计算定向技术带来的加速比:

236/215=1.098  

所以可知DLXforwarded比DLXnotforwarded快9.8%。

 

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

当前位置:首页 > 农林牧渔 > 林学

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

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