实验一熟悉WinDLX的使用.docx

上传人:b****5 文档编号:6213875 上传时间:2023-01-04 格式:DOCX 页数:12 大小:226KB
下载 相关 举报
实验一熟悉WinDLX的使用.docx_第1页
第1页 / 共12页
实验一熟悉WinDLX的使用.docx_第2页
第2页 / 共12页
实验一熟悉WinDLX的使用.docx_第3页
第3页 / 共12页
实验一熟悉WinDLX的使用.docx_第4页
第4页 / 共12页
实验一熟悉WinDLX的使用.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

实验一熟悉WinDLX的使用.docx

《实验一熟悉WinDLX的使用.docx》由会员分享,可在线阅读,更多相关《实验一熟悉WinDLX的使用.docx(12页珍藏版)》请在冰豆网上搜索。

实验一熟悉WinDLX的使用.docx

实验一熟悉WinDLX的使用

HUNANUNIVERSITY

 

实验一熟悉WinDLX的使用

 

学生班级:

计科2班

学生姓名:

***

 

一.实验目的:

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

二.实验内容:

(一)WinDLX的安装:

1.WinDLX是一个基于Windows的模拟器,能够演示DLX流水线是如何工作的。

WinDLX包含windlx.exe和windlx.hlp文件。

同时,还需要一些扩展名为.s的汇编代码文件。

按以下步骤在Windows下安装WinDLX:

1WinDLX创建目录,例如D:

\WINDLX

2解压WinDLX软件包或拷贝所有的WinDLX文件(至少包含windlx.exe,windlx.hlp)到这个WinDLX目录。

2.启动和配置WinDLX:

双击WinDLX图标,将出现一个带有六个图标的主窗口,双击这些图标会弹出子

窗口.

 

为了初始化模拟器,点击File菜单中的Resetall菜单项,弹出一个“Reset

DLX”对话框。

然后点击窗口中的“确认”按钮即可。

(二)程序介绍

1.求阶乘程序fact.s

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

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

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

2.程序gcm.s

gcm.s程序从标准输入读入两个整数,求他们的greatestcommonmeasure,然后将结果写到标准输出。

3.求素数程序prim.s

prim.s程序计算若干个整数的素数。

三、实验程序

1.求阶乘程序Fact.s:

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

;Programbeginatsymbolmain

;requiresmoduleINPUT

;readanumberfromstdinandcalculatethefactorial(type:

double)

;theresultiswrittentostdout

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

.data

Prompt:

.asciiz"Anintegervalue>1:

"

PrintfFormat:

.asciiz"Factorial=%g\n\n"

.align2

PrintfPar:

.wordPrintfFormat

PrintfValue:

.space8

.text

.globalmain

main:

;***ReadvaluefromstdinintoR1

addir1,r0,Prompt

jalInputUnsigned

;***initvalues

movi2fpf10,r1;R1->D0D0..Countregister

cvti2df0,f10

addir2,r0,1;1->D2D2..result

movi2fpf11,r2

cvti2df2,f11

movdf4,f2;1->D4D4..Constant1

;***BreakloopifD0=1

Loop:

ledf0,f4;D0<=1?

bfptFinish

;***Multiplicationandnextloop

multdf2,f2,f0

subdf0,f0,f4

jLoop

Finish:

;***writeresulttostdout

sdPrintfValue,f2

addir14,r0,PrintfPar

trap5

;***end

trap0

2.输入子程序Input.s

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

;Subprogramcallbysymbol"InputUnsigned"

;expecttheaddressofazero-terminatedpromptstringinR1

;returnsthereadvalueinR1

;changesthecontentsofregistersR1,R13,R14

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

.data

;***DataforRead-Trap

ReadBuffer:

.space80

ReadPar:

.word0,ReadBuffer,80

;***DataforPrintf-Trap

PrintfPar:

.space4

SaveR2:

.space4

SaveR3:

.space4

SaveR4:

.space4

SaveR5:

.space4

.text

.globalInputUnsigned

InputUnsigned:

;***saveregistercontents

swSaveR2,r2

swSaveR3,r3

swSaveR4,r4

swSaveR5,r5

;***Prompt

swPrintfPar,r1

addir14,r0,PrintfPar

trap5

;***callTrap-3toreadline

addir14,r0,ReadPar

trap3

;***determinevalue

addir2,r0,ReadBuffer

addir1,r0,0

addir4,r0,10;Decimalsystem

Loop:

;***readsdigitstoendofline

lbur3,0(r2)

seqir5,r3,10;LF->Exit

bnezr5,Finish

subir3,r3,48;?

?

multur1,r1,r4;Shiftdecimal

addr1,r1,r3

addir2,r2,1;incrementpointer

jLoop

Finish:

;***restoreoldregistercontents

lwr2,SaveR2

lwr3,SaveR3

lwr4,SaveR4

lwr5,SaveR5

jrr31;Retur

3.求最大公约数程序:

gcm.s

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

;Programbeginsatsymbolmain

;requiresmoduleINPUT

;Readtwopositiveintegernumbersfromstdin,calculatethegcm

;andwritetheresulttostdout

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

.data

;***Promptsforinput

Prompt1:

.asciiz"FirstNumber:

"

Prompt2:

.asciiz"SecondNumber:

"

;***Dataforprintf-Trap

PrintfFormat:

.asciiz"gcM=%d\n\n"

.align2

PrintfPar:

.wordPrintfFormat

PrintfValue:

.space4

.text

.globalmain

main:

;***ReadtwopositiveintegernumbersintoR1andR2

addir1,r0,Prompt1

jalInputUnsigned;readuns.-integerintoR1

addr2,r1,r0;R2<-R1

addir1,r0,Prompt2

jalInputUnsigned;readuns.-integerintoR1

Loop:

;***CompareR1andR2

seqr3,r1,r2;R1==R2?

bnezr3,Result

sgtr3,r1,r2;R1>R2?

bnezr3,r1Greater

r2Greater:

;***subtractr1fromr2

subr2,r2,r1

jLoop

r1Greater:

;***subtractr2fromr1

subr1,r1,r2

jLoop

Result:

;***Writetheresult(R1)

swPrintfValue,r1

addir14,r0,PrintfPar

trap5

;***end

trap0

4.求素数程序prim.s:

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

;Programbeginsatsymbolmain

;generatesatablewiththefirst'Count'primenumbersfrom'Table'

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

.data

;***sizeoftable

.globalCount

Count:

.word10

.globalTable

Table:

.spaceCount*4

.text

.globalmain

main:

;***Initialization

addir1,r0,0;IndexinTable

addir2,r0,2;Currentvalue

;***Determine,ifR2canbedividedbyavalueintable

NextValue:

addir3,r0,0;HelpindexinTable

Loop:

seqr4,r1,r3;EndofTable?

bnezr4,IsPrim;R2isaprimenumber

lwr5,Table(R3)

divur6,r2,r5

multur7,r6,r5

subur8,r2,r7

beqzr8,IsNoPrim

addir3,r3,4

jLoop

IsPrim:

;***WritevalueintoTableandincrementindex

swTable(r1),r2

addir1,r1,4

;***'Count'reached?

lwr9,Count

srlir10,r1,2

sger11,r10,r9

bnezr11,Finish

IsNoPrim:

;***Checknextvalue

addir2,r2,1;incrementR2

jNextValue

Finish:

;***end

trap0

四.窗口介绍

第一次打开WINDLX模拟器,我们可以看到如下六个小窗口。

1Register窗口

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

为此,双击主窗口中的Register图标。

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

看一下R1到R5的值。

按F5使模拟继续运行到下一个断点处,有些值将发生改变。

2Code窗口

该窗口代表存储器内容的三栏信息,从左到右依次为:

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

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

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

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

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

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

3Pipeline窗口

Pipeline窗口显示DLX处理器的内部结构。

窗口中用图表形式显示了DLX的五段流水线。

你应尽可能地扩大此窗口,以便处于不同流水段的指令都能够在图表中显示。

4ClockCycleDiagram窗口

该窗口使所有子窗口图标化,然后打开ClockCycleDiagram窗口。

它显示流水线的时空图。

该时空图中显示了每一个时隙内的运行情况。

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

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

5Statistics窗口

该窗口是对运行程序中数据的分析。

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

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

窗口中给出事件发生的次数和百分比。

在静态窗口中我们可以比较一下不同配置对模拟的影响。

6Breakpoint窗口

通过Code窗口可以观察代码(如果未打开,双击图标Code),可以通过Breakpoint来观察代码运行的情况。

单击SetBreakpoint,将弹出一个新的"SetBreakpoint"窗口。

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

缺省为ID段。

点击OK关闭窗口。

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

如果想查看已定义的断点,你只要单击图标Reakpoints,将弹出一个小窗口,其中显示了所有断点。

重新使窗口图标化。

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

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

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

五、实验过程

(1)通过双击WinDLX图标

启动WinDLX,将出现一个带有六个图标的主窗口:

(2)进行初始化模拟器,点击File菜单中的Resetall菜单项,弹出一个“ResetDLX”对话框。

然后点击窗口中的“确认”按钮即可。

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

为此,选择File/LoadCodeorData,窗口中会列出目录中所有汇编程序。

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

按如下步骤操作,把fact.s和input.s加载入主存。

点击fact.s

点击select按钮

点击input.s

点击select按钮

点击load按钮

得到如下图:

弹出一下询问对话框,点击“是”。

(4)模拟结果

阶乘函数答案:

最大公因数

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

当前位置:首页 > 党团工作 > 入党转正申请

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

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