实验一 熟悉WInDLX的使用
实验目的
通过本实验,熟练掌握WinDLX模拟器的操作和使用,熟悉DLX指令集结构及其特点。
实验内容
1. 用WinDLX模拟器执行求阶乘程序fact.s 。执行步骤详见“WinDLX教程”。
这个程序说明浮点指令的使用。该程序从标准输入读入一个整数,求其阶乘,然后将结果输出。该程序中调用了input.s中的输入子程序,这个子程序用于读入正整数。
2. 用WinDLX模拟器执行程序gcm.s 。
该程序从标准输入读入两个整数,求他们的最大公约数(greatest common measure),然后将结果写到标准输出。该程序中调用了input.s中的输入子程序。
3. 用WinDLX模拟器执行求素数程序prim.s。 这个程序计算若干个整数的素数。
4. 通过上述使用WinDLX,总结WinDLX的特点。
实验环境
Win7 旗舰版 + WinDLX
WinDLX流水线描述:DLX 执行指令的流水线是一个5 段流水线,包括取指段(IF)、译码段(ID)、执行段(EX)、访存段(MEM)和写回段(WB)。其中,执行段分为4个单元,分别是:intEX 单元(整数操作),faddEX 单元(浮点加减),fmulEX(浮点乘法),fdivEX(浮点除法)。每个单元的个数和延迟时间,可以通过菜单进行设定。
实验步骤:
1. 运行WinDLX仿真器,打开各窗口;
2. 初始化各寄存器;
3. 装载代码:
装载过程如图所示,注意同时装载两端代码时,代码有先后顺序。
4. 如图,用F7,F8,F5,F4进行模拟,观察各窗口变化;
注:执行过程中,可能需有输入。
5. 从各窗口观察程序运行情况,进行总结分析;
6. 其他三个程序,重复执行过程2~5,注意选择对应的文件。
实验结果
【1.求阶乘程序】 源代码:fact.s input.s
打开Pipeline 窗口,点击 F7用单步执行,做完以后,用多步执行命令,实验结果如下所示:
用F7单步跟踪直到出现如下所示:
输入“4”然后点击“OK”按钮。 结果如下所示:
【2.求最大公约数】 程序代码:gcm.s input.s
程序执行,与程序1类似,执行过程,不赘述,实验结果截图:
【3.求素数程序】 程序代码:prim.s
此程序,没有输入、输出,只是不停地寻找素数,故没有程序运行结果截图。
截图分析
【分析1】
截图的第2条指令,取指后,便被丢弃的原因如下:
第一条指令取指还未被译码时,流水操作就必须取指,即第二条指令。但当第一条指令译码完成后,发现是跳转指令,意味着,取得的第二条指令有误,故第二条指令被丢弃而重新取指,译码段也会出现空闲。
【分析2】
当遇到trap中断时,流水线上会出现T—Stall,必须等待流水线上其他段工作完成,防止出现程序结果错误,如截图的第2条和第4条指令。
【分析3】
当流水线上的后续指令要用到前面指令的执行结果且前面指令还未执行完成时,那么后续指令会取指完成后就等待前面指令执行完成后,开始译码。如截图的第3条和第6条指令,均出现了R-Stall(寄存器延迟)。
实验总结
通过本次实验,我有如下收获:
1. 我掌握了WinDLX模拟器的基本操作;
2. 了解了DLX指令集结构及其特点,特别注重指令流水效率; 3. 更加深入的了解计算机系统流水线的工作过程;
4. 加深对指令调度的理解,了解指令调度技术对CPU性能改进的好处。