您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 实验一--熟悉WinDLX的使用
HUNANUNIVERSITY实验一熟悉WinDLX的使用学生班级:计科2班学生姓名:杨凌霄一.实验目的:通过本实验,熟练掌握WinDLX模拟器的操作和使用,熟悉DLX指令集结构及其特点。二.实验内容:(一)WinDLX的安装:1.WinDLX是一个基于Windows的模拟器,能够演示DLX流水线是如何工作的。WinDLX包含windlx.exe和windlx.hlp文件。同时,还需要一些扩展名为.s的汇编代码文件。按以下步骤在Windows下安装WinDLX:⑴WinDLX创建目录,例如D:\WINDLX⑵解压WinDLX软件包或拷贝所有的WinDLX文件(至少包含windlx.exe,windlx.hlp)到这个WinDLX目录。2.启动和配置WinDLX:双击WinDLX图标,将出现一个带有六个图标的主窗口,双击这些图标会弹出子窗口.为了初始化模拟器,点击File菜单中的Resetall菜单项,弹出一个“ResetDLX”对话框。然后点击窗口中的“确认”按钮即可。(二)程序介绍1.求阶乘程序fact.s这个程序说明浮点指令的使用。该程序从标准输入读入一个整数,求其阶乘,然后将结果输出。该程序中调用了input.s中的输入子程序,这个子程序用于读入正整数。2.程序gcm.sgcm.s程序从标准输入读入两个整数,求他们的greatestcommonmeasure,然后将结果写到标准输出。3.求素数程序prim.sprim.s程序计算若干个整数的素数。三、实验程序1.求阶乘程序Fact.s:;------------------------------------------------------------------------;Programbeginatsymbolmain;requiresmoduleINPUT;readanumberfromstdinandcalculatethefactorial(type:double);theresultiswrittentostdout;--------------------------------------------------------------------------.dataPrompt:.asciizAnintegervalue1:PrintfFormat:.asciizFactorial=%g\n\n.align2PrintfPar:.wordPrintfFormatPrintfValue:.space8.text.globalmainmain:;***ReadvaluefromstdinintoR1addir1,r0,PromptjalInputUnsigned;***initvaluesmovi2fpf10,r1;R1-D0D0..Countregistercvti2df0,f10addir2,r0,1;1-D2D2..resultmovi2fpf11,r2cvti2df2,f11movdf4,f2;1-D4D4..Constant1;***BreakloopifD0=1Loop:ledf0,f4;D0=1?bfptFinish;***Multiplicationandnextloopmultdf2,f2,f0subdf0,f0,f4jLoopFinish:;***writeresulttostdoutsdPrintfValue,f2addir14,r0,PrintfPartrap5;***endtrap02.输入子程序Input.s;-------------------------------------------------------------------;SubprogramcallbysymbolInputUnsigned;expecttheaddressofazero-terminatedpromptstringinR1;returnsthereadvalueinR1;changesthecontentsofregistersR1,R13,R14;-----------------------------------------------------------------------------.data;***DataforRead-TrapReadBuffer:.space80ReadPar:.word0,ReadBuffer,80;***DataforPrintf-TrapPrintfPar:.space4SaveR2:.space4SaveR3:.space4SaveR4:.space4SaveR5:.space4.text.globalInputUnsignedInputUnsigned:;***saveregistercontentsswSaveR2,r2swSaveR3,r3swSaveR4,r4swSaveR5,r5;***PromptswPrintfPar,r1addir14,r0,PrintfPartrap5;***callTrap-3toreadlineaddir14,r0,ReadPartrap3;***determinevalueaddir2,r0,ReadBufferaddir1,r0,0addir4,r0,10;DecimalsystemLoop:;***readsdigitstoendoflinelbur3,0(r2)seqir5,r3,10;LF-Exitbnezr5,Finishsubir3,r3,48;??multur1,r1,r4;Shiftdecimaladdr1,r1,r3addir2,r2,1;incrementpointerjLoopFinish:;***restoreoldregistercontentslwr2,SaveR2lwr3,SaveR3lwr4,SaveR4lwr5,SaveR5jrr31;Retur3.求最大公约数程序:gcm.s;------------------------------------------------------------------------;Programbeginsatsymbolmain;requiresmoduleINPUT;Readtwopositiveintegernumbersfromstdin,calculatethegcm;andwritetheresulttostdout;------------------------------------------------------------------------.data;***PromptsforinputPrompt1:.asciizFirstNumber:Prompt2:.asciizSecondNumber:;***Dataforprintf-TrapPrintfFormat:.asciizgcM=%d\n\n.align2PrintfPar:.wordPrintfFormatPrintfValue:.space4.text.globalmainmain:;***ReadtwopositiveintegernumbersintoR1andR2addir1,r0,Prompt1jalInputUnsigned;readuns.-integerintoR1addr2,r1,r0;R2-R1addir1,r0,Prompt2jalInputUnsigned;readuns.-integerintoR1Loop:;***CompareR1andR2seqr3,r1,r2;R1==R2?bnezr3,Resultsgtr3,r1,r2;R1R2?bnezr3,r1Greaterr2Greater:;***subtractr1fromr2subr2,r2,r1jLoopr1Greater:;***subtractr2fromr1subr1,r1,r2jLoopResult:;***Writetheresult(R1)swPrintfValue,r1addir14,r0,PrintfPartrap5;***endtrap04.求素数程序prim.s:;-------------------------------------------------------------------;Programbeginsatsymbolmain;generatesatablewiththefirst'Count'primenumbersfrom'Table';-------------------------------------------------------------------.data;***sizeoftable.globalCountCount:.word10.globalTableTable:.spaceCount*4.text.globalmainmain:;***Initializationaddir1,r0,0;IndexinTableaddir2,r0,2;Currentvalue;***Determine,ifR2canbedividedbyavalueintableNextValue:addir3,r0,0;HelpindexinTableLoop:seqr4,r1,r3;EndofTable?bnezr4,IsPrim;R2isaprimenumberlwr5,Table(R3)divur6,r2,r5multur7,r6,r5subur8,r2,r7beqzr8,IsNoPrimaddir3,r3,4jLoopIsPrim:;***WritevalueintoTableandincrementindexswTable(r1),r2addir1,r1,4;***'Count'reached?lwr9,Countsrlir10,r1,2sger11,r10,r9bnezr11,FinishIsNoPrim:;***Checknextvalueaddir2,r2,1;incrementR2jNextValueFinish:;***endtrap0四.窗口介绍第一次打开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窗口可以观
本文标题:实验一--熟悉WinDLX的使用
链接地址:https://www.777doc.com/doc-5561877 .html