计算机系统结构实验指导书.pdf
目 录W i n D L X 简介二.W i n D L X 寄存器结构及指令集三.W i n D L X 教程四.实验注意事项及要求五.实验一熟悉W i n D L X 的使用六.实 验 二 用 WinDLX执行程序求最大公约数七.实 验 三 用 WinDLX模拟器完成求素数程序八.实验四结构相关九.实验五数据相关十.实验六指令调度十一.实验七多处理机并行计算WinDLX 简介1.DLX流水线处理器DLX是贯穿本课程的一个流水线处理器实例,许多讨论、模拟结果和例题都是基于DLX的。它不仅体现了当今多种机器(AMD29K、DEC station 3100.HP850、IBM 801、Intel i860、MIPS M/120A、MIPS M/1000、Motorola 88k、RISCI,SGI4D/60,SPARC station 1、Sun 4/110,Sun 4/260 等)指令集结构的共同特点,而且它还将会体现未来些机器的指令集结构的特点。这些机器的指令集结构设计思想都和DLX指令集结构的设计思想十分相似,它们都强调:具有一个简单的Load/Store指令集;注重指令流水效率;简化指令的译码;高效支持编译器。2.DLX 模拟器-WinDLXWinDLX是一个基于Windows的DLX模拟器,用于模拟DLX流水线的工作过程。你可以灵活、方便地设置参数、控制执行、统计数据等。WinDLX提供了直观的窗口显小。我们将WinDLX模拟器及有关程序已放在实验用计算机上,同学们打开XTJG文件夹通过双击WinDLX舞图标,启动WinDLX即可。二.WinDLX寄存器结构及指令集1.DLX中的寄存器DLX中 的 寄 存 器长度为32位(R o 032个通用寄存器 :一(GPRs),:,、|Rsi-长度为32位F。32个浮点寄存器(FPRs)32位单精度浮点数t-F2 64位叫 r双精度浮点数f一些特殊的寄存器图 12.DLX的数据类型2DLX的 数 据 类 型DLXW供 了 多 种 氏 度 的 整 型 数 据 和 浮 点 数 据。8位|整 型 数 据16位32位32位 单 精 度 浮 点 数浮 点 数 据64位 双 精 度 浮 点 数图 23.DLX的寻址方式和数据传送3DLX的 寻 址 方 式 和 数 据 传 送寻 址 方 式 寄存器寻址立即值寻址偏移寻址、寄存器间接寻址存储器通过寄存器和存储器之间的数据传送操作完成对存储器的访问广寄存器I图 3由于DLX支持上述数据类型,所以对通用寄存器而言,相应的存储器访问数据大小有8位、16位和32位;而对浮点寄存器而言,相应的存储器访问数据大小有32位(单精度浮点数)和64位(双精度浮点数)值得注意的是,DLX的所有存储器访问均需对齐。4.DLX的指令格式4DLX的指令格式6 5 5 16操作码0Prslrd立即值字节、半字、字的载入和储存rd rsl OP 立即值6.5 5 5 11R类型指令 操作码OP|rsl|rs2 rd Func寄存器-寄存器AL嗾 作:rd rsl Func rs2函数对数据的操作进行编码:力 口、减对特殊寄存器的读/写和移动6 26j 类 型 指 令|操作角O P|与pc相加的偏移豆一跳转,跳转并链接,从异常处自陷和返回。图 45.DLX中 的 操 作DLX除了支持上面提到的一些简单操作之外,还支持其它一些操作。DLX指令中的操作可以分为四种类型,即:Load和Store操作、ALU操作、分支和跳转操作、浮点操作。在分别讨论这四种操作类型之前,请先阅读有关本课程中所采用的一些符号的约定。5些 约 定一:数 据 传 送 操 作一n !传送一个n位的数据称:表示两个域的串联操作域的下标:表明从该域中选择某一位0 13 1R 40 1 2 3 2 4 3 1R e g s R 4 0:选择寄存器R 4中内容的符号位R e g s R 3次”:寄存器R 3中内容的最低一个字节上 标:表示复制一个域0窈0 0.0得到一个2 4位全为0的域变量M e m:表示存储器中的一个数组器储存图5为 了 进 一 步 说 明 上 述 约 定 表 示 方 法 的 用 途,现设R 8和R 1 0均 为32位寄存器举 例:R e g s R 1 0 i6.3i-1 6(Me m R e g s R 8 0)8#Me m R e g s R 8 J的 含 义 是:以寄存器R8的 内 容 为 地 址,取 出 存 储 器 单 元 内 容,将该内6容的第“0”位(最高位)复制为八个“0”作为高八位再并上该存储单元内容,形成十六位数送寄存器R10的 1631位。6.WinDLX指令综述(1)Load和 Store 操作:LF F0,50(R3)可以对DLX的所有通用寄存器和浮点寄存器进行Load(载入)和Store(储存)操作,但是对通用寄存器R0的Load操作没有任何效果。表 1给出了载入和储存指令的一些实例。表 1 DLX中Load和Store指令实例指令实例 指令名称 含 义LWR1,30(R2)载入整型字 Regs RlJ-32Mem 30+Regs R2LW RI,1000载入整型字 RegsfRl-32 Memfl000+0(R0)Regs Rl=32(Mem 4O+Regs R3o)24LB RI,40(R3)载入字节#Mem 40+Regs R3LBURl,4 0(R 3)载入无符号字节 Regs Rl-32024#Mem 40+Regs R3Regs Rl-32(Mem 4O+Regs R3o)6载入整型半字#Mem 40+Regs R3U#Mem 41+Regs R3J载入单精度浮点 Regs F0-32 Mem 50+Regs R3载入双精度浮点Regs F0#Regs Fl-M Mem 50+Regs R2储存整型字 Mem 500+Regs R4-32 Regs R3SF40(R3),F0 储存单精度浮点 Mem 40+Regs R3-32 Regs F0Mem 40+Regs R3-32 Regs F0SD 40(R3),F0 储存双精度浮点Mem 44+Regs R3-32 Regs FlSH502(R2),R31 储存整型半字 Mem 502+Regs R2一怖 Regs R31i63LHR1,40(R3)LD F0,50(R2)R37SB 41(R3),R2 储存整型字节 Mem41+RegsR3-8 RegsR2243(2)ALU操作:在DLX中,所有的ALU指令都是寄存器一寄存器型指令,其运算包含了简单的算术和逻辑运算,如加、减、AND、OR、XOR和移位。另外,DLX还允许所有这些指令对立即值进行操作,立即值以16位符号扩展形式出现。LHI(Load高位立即值)操作将立即值载入到一个寄存器的高半部分,而该寄存器的低半部分则设置为0。这样就可以通过两条Load指令构造一个32位的常数。正如上面所提到的,R0主要用来合成一些有用的操作。比如,Load一个常数就可以看作是一次简单的立即值加操作,其中一个嫄操作数是R0;寄存器一寄存器间的数据移动也可以看作是一次简单的加,其中一个源操作数是R0。这两个操作可以分别用LI和MOV表示。在DLX指令集中,还有一些寄存器比较指令(=,#,W,2),如果比较结果为真,这些指令就在目标寄存器中填入1 (表示真),否则填入0(表示假)。因为这些比较操作指令要对目标寄存器进行“设置”,所以也称它们为设置相等、设置不等、设置小于等指令。DLX同样也提供了这些比较指令的立即值形式,表2给出了ALU操作指令的一些实例。8表 2 ALU指令实例指令实例 指令名称含 义Add RI,R 2,R3 加RegsRl-RegsR2+RegsR3ADDI RI,R2,和立即值相加#3LHIR1,#42 载入高位立即值RegsRl J-RegsR2+3RegsfRl-42#016逻辑左移的立即值形SLLI RI,R2,#5式RegslRl J-RegsR2J 5if(RegsR2=D dregb)fps=1 else fps=0Both are double precision floats.gefEx:gef f3,f6if(F frega=F fregb)fps=1 else fps=0Both are single precision floats.gtdEx:gtd f8,f6if(D drega Dfdregb)fps=1 else fps=0Both are double precision floats.gtfEx:gtf f3,f6if(F frega F fregb)fps=1 else fps=0Both are single precision floats.jEx:j labelPC-PC+imm26+4Unconditionally jumps relative to the PC of the next instruction.imm26 is a26-bit signed integer.jalEx:jal labelR31-PC+8;PC-PC+imm26+4Saves a return address in register 31 and jumps relative to the PC of the nextinstruction.imm26 is a 26-bit signed integer.20jalrEx:jalr r2R31-PC+8;PC-R regaSaves a return address in register 31 and does an absolute jump to the target addresscontained in R rega.jrEx:jr r3PC RfregaR rega is treated as an unsigned integer.Does an absolute jump to the targetaddress contained in Rfrega.lbEx:lb rl,40-4(r2)Rfregb (sign extended)M imml6+RfregaOne byte of data is read from the effective address computed by adding signedinteger imml6 and signed integer R rega.The byte from memory is then signextended to 32-bits and stored in register R regb.IbuEx:Ibu r2Jabel-786+4(r3)RlregbJ-0A24#M imml6+R regaOne byte of data is read from the eflective address computed by adding signedinteger imm!6 and signed integer RLregaJ.The byte from memory is then zeroextended to 32 bits and stored in register R regb.IdEx:ldf2,240(rl)Dfdregb-6 4 Mfimm 16+RfregaTwo words of data are read from the effective address computed by addingsigned integer imml6 and unsigned integer Rfrega and stored in doubleregister Dfdregb.This is equivalent to two If instructions:F fregb-Mfimml6+R regaF freg(b+1)-M imm 16+R rega+4where F freg(b+1)is the next fp register after F fregb in sequence,and allvalues are simply copied and not converted.)21ledEx:led f8,f6if(D drega=D dregb)fps=1 else fps=0Both are double precision floats.lefEx:lef f3,f6if(F frega=F fregb)fps=1 else fps=0Both are single precision floats.IfEx:If f6,76(r4)Fffregb-Mfimml6+RfregaOne word of data is read from the effective address computed by adding signedinteger imml6 and signed integer R rega and stored in fp register Fffregb.lhEx:lhrl,32(r3)Rfregb (sign extended)M imml6+RfregaTwo bytes of data are read from the effective address computed by addingsigned integer imml6 and signed integer R rega.The address must be half-wordaligned.The half-word from memory is then sign extended to 32 bits and stored inregister R regb.IhiEx:Ihi r3,#-40Rfregb imml6#0A16Loads the 16 bit immediate value imml6 into the most significant half of aninteger register and clears the least significant half.IhuEx:Ihu r2,-40+4(r3)Rfregb-0A16#M imml6+R regaTwo bytes of data are read from the effective address computed by addingsigned integer imml6 and signed integer R rega.The address must be half-wordaligned.The half-word from memory is then zero extended to 32 bits and stored in22register Rfregb.ltdEx:lid f8,f6if(Dfdrega D dregb)fps=1 else fps=0Both are double precision floats.ItfEx:Itff3,f6if(F frega=Rfregb)R regc-1 else Rfregc-0All are signed integers.sgeiEx:sgei r2,rl,#6if(R rega=imm!6)R regb-1 else Rlregb-0All are signed integers.sgtEx:sgt r4,r5,r6if(R rega Rfregb)R regc-1 else R regc-0All are signed integers.sgtiEx:sgti rl,r2,#-3000if(R rega imml6)R regb-1 else R regbJ-0All are signed integers.shEx:sh 421(r3),r526M imml6+R rega-1 6 R regb_16.31Two bytes of data from the least significant half of register R regb are writtento the effective address computed by adding signed integer imml6 and unsignedinteger R rega.The effective address must be halfword aligned.sleEx:sle rl,r2,r3if(Rfrega=R regb)R regc-1 else Rfregc-0All are signed integers.sleiEx:slei r8”,#345if(R rega=imml6)R regb-1 else RlregbJ-0All are signed integers.sllEx:sll r6,r7,rl 1R regc-R rega R regb_27.31All are unsigned integers.R rega is logically shifted left by the low five bits ofRfregb.Zeros are shifted into the least-significant bit.slliEx:slli rl,r2,#3Rfregb-Rfrega uimml6_27.31All are unsigned integers.R rega is logically shifted left by the low five bits ofuimml6.Zeros are shifted into the least-significant bit.(Actually only thebottom five bits of R regb are used.)sitEx:sit r3,r4,r5if(R rega R regb)R regc-1 else Rlregc-0All are signed integers.sltiEx:slti rl,r2,#22if(Rfrega imml6)Rfregb-1 else R regb-0All are signed integers.27sneEx:sne rl,r2,r3if(R rega!=R regb)Rfregc-1 else R regc-0All are signed integers.sneiEx:snei r4,r5,#89if(R rega!=imml6)R regb-1 else RlregbJ-0All are signed integers.sraEx:sra rl,r2,r3R regc (R rega_O)AR regb#(R regaR regb)_Rfregbl.31R rega and R regc are signed integers.R regb is an unsigned integer.Rfrega is arithmetically shifted right by Rfregb.The sign bit is shifted into themost-significant bit.(Actually uses only the five low order bits of Rfregb.)sraiEx:srai r2,r3,#5R regbJ-(R regaJ_3 l)Auimm 16#(RlregaJuimm 16)_uimm 16.31R rega and R regc are signed integers.uimml6 is an unsigned integer.RlregaJ is arithmetically shifted right by RlregbJ.The sign bit is shifted into themost-significant bit.(Actually uses only the five low order bits of uimm!6.)srlEx:srl rl5,r2,r3R regc R rega R regb_27.31All are unsigned integers.R rega is arithmetically shifted right by R regb.Zeros are shifted into the most significant bit.srliEx:srli rl,r2,#5R regb-R rega uimml6_27.31All are unsigned integers.R rega is arithmetically shifted right by uimml6.Zeros are shifted into the most significant bit.28subEx:sub r3,r2,rlEx:R regc-R rega-RfregbAll are signed integers.subdEx:subd f2,f4J6D dregcJ-DldregaJ-D dregbAll are double precision floats.subfEx:subf f3,f4,f6Fffregc-F frega-F fregbAll are single precision floats.subiEx:subi rl5,rl6,#964R regbJ-R rega-imml6All are signed integers.subuEx:subu r3,r2,rlRfregc-R rega-R regbAll are unsigned integers.subuiEx:subui rl,r2,#53RlregbJ-R rega-uimml6All are unsigned integers.SWEx:sw 21(rl3),r6+R rega-R regbOne word from integer register R regb is written to the effective addresscomputed by adding signed integer imml6 and unsigned integer R rega.29trapEx:trap#3Execute trap with number in immediate fieldSaves state and jumps to an operating system procedure located at an address in theinterrupt vector table.In our systems,this is simulated by calling the procedurecorresponding to the trap number.xorEx:xor r2,r3,r4RlregcJ-Flrega XOR R regbJAll are unsigned integers.Logical xor is performed on a bitwise basis.xoriEx:xori r3,r4,#5R regb-R rega XOR uimml6All are unsigned integers.Logical xor is performed on a bitwise basis.符号说明符号 意 义x_yx 的第y 位x_y.zxAyx#yIRx 的第y 到第z 位XX.x(x 重复 y 次)xy(x 与 y 拼接)指令寄存器IAR中断地址寄存器PC程序计数器R regaR regbR regc整数寄存器即 _ 6.10整数寄存器整数寄存器 IRJ6.2030F fregaF fregbF fregcD dregaD dregbD dregcimml6浮点寄存器口 R_6.1O浮点寄存器 IRL 5浮点寄存器 IR6.2O双精度浮点寄存器双精度浮点寄存器 IR15双精度浮点寄存器 1RJ6.20(IR_16)A16#IR_16.31uimml60A16#IR_16.31imm26(IR_6)A6#IR_6.31fps浮点状态位 1:后鼠标闪烁,键入2 0 然后按Enter,模拟继续运行到断点#2 处。在Clock cycle diagram窗口中,在指令之间出现了红和绿的箭头。红色箭头表示需要一个暂停,箭头指向处显示了暂停的原因。R-Stall(R-暂停)表示引起暂停的原因是RAW。绿色箭头表示定向技术的使用。现在我们来看一下寄存器中的内容。为此,双击主窗口中的Register图标。Register窗口会显示各个寄存器中的内容。看一下R1到 R5的值。按F5使模拟继续运行到下一个断点处,有些值将发生改变,指令lw从主存中取数到寄存器中。如果你希望不设置断点,而使模拟继续进行。办法是:点击Execute39/Multiple Cycles或者按F 8键,在新出现的窗口中输入17,然后按Enter键,模拟程序将继续运行1 7个时钟周期。向上滚动Clock cyclediagram窗口,直到看到指令周期7 2到78。在EX段,两个浮点操作(multd and subd)分别在不同的部件上运行,它们都需要多个周期才能结束。因而在它们之后的下一条指令能取指,译码和执行,然后暂停一个周期以允许subd完成MEM段。2.3.6 Statistics 窗 口最后我们来看一下Statistics窗口。按F 5使程序完成执行,出现消息“Trap#。occurred”表明最后一条指令trap O已经执行,Trap指令中编号“0”没有定义,只是用来终止程序。双击图标Statistics。Statistics窗口提供各个方面的信息:模拟中硬件配置情况、暂停及原因、条件分支、Load/Store指令、浮点指令和traps。窗口中给出事件发生的次数和百分比,如RAW stalls:17(7.91%of all Cycles)o在静态窗口中我们可以比较一下不同配置对模拟的影响。现在我们看一看定向的作用。在前面的模拟过程中,我们采用了定向。如果不采用定向,执行时间将会怎样呢?我们先看一下Statistics窗口中的各种统计数字:总的周期数(215)和暂停数(17 RAW,25 Control,12 Trap;54 T otal),然后关闭窗口。点 击Configuration中的Enable Forwarding使定向无效(去掉小钩),打开断点Breakpoints图标并点击Breakpoints菜单,删除所有断点,然后按F 5,键入20后,按Enter,模拟程序一直运行到结束。重新查看静态窗口,你会看到控制暂停和T rap暂停仍然是同样的值,而RAW暂停从17变成了 5 3,总的模拟周期数增加到236。利用这些值,你能够计算定向技术带来的加速比:236/215=1.098DLX forwarded 比 DLXnot forwarded快 9.8%o403.实验有关知识的补充流水线中的相关流水线中的相关是指相邻或相近的指令因存在某种关联,后面的指令不能在原指定的时钟周期开始执行。一般来说,流水线中的相关主要分为如下三种类型:(1)结构相关:当硬件资源满足不了指令重叠执行的要求,而发生资源冲突时,就发生了结构相关。(2)数据相关:当一条指令需要用到前面指令的执行结果,而这些指令均在流水线中重叠执行时,就可能引起数据相关。(3)控制相关:当流水线遇到分支指令和其它能够改变PC值的指令时,就会发生控制相关。一旦流水线中出现相关,必然会给指令在流水线中的顺利执行带来许多问题,如果不能很好地解决相关问题,轻则影响流水线的性能,重则导致错误的执行结果。消除相关的基本方法是让流水线暂停执行某些指令,而继续执行其它一些指令。在后面的讨论中,我们约定:当一条指令被暂停口 寸,在该暂停指令之后发射的所有指令都要被暂停,而在该暂停之前发射的指令则可继续进行,在暂停期间,流水线不会取新的指令。3.3.1流水线的结构相关如果某些指令组合在流水线中重叠执行时,产生资源冲突,则称该流水线有结构相关。为了能够在流水线中顺利执行指令的所有可能组合,而不发生结构相关,通常需要采用流水化功能单元的方法或资源重复的方法。许多流水线机器都是将数据和指令保存在同一存储器中。如果在41某个时钟周期内,流水线既要完成某条指令对数据的存储器访问操作,又要完成取指令的操作,那么将会发生存储器访问冲突问题(如图3.3.1所示),产生结构相关。为了解决这个问题,可以让流水线完成前一条指令对数据的存储器访问时,暂停取后一条指令的 操 作(如图332所示)。该周期称为流水线的一个暂停周期。暂停周期一般也称为流水线气泡,或简称为气泡。从 图3.3.2可以看出,在流水线中插入暂停周期可以消除这种结构相关。结枸相关举例一一访存冲突load指令1指令2指令3指令4时间(时钟周期)-图3 3 1由于存储器访问冲突而带来的流水线结构相关42流水线气泡时 间(时钟周期)-CC1:CC2:CC3:CC4:CC5:CC6:CC7load指令1指令2暂停指令3图3 3 2 为消除结构相关而插入的流水线气泡43也可以用如图3.3.3所示的时空图来表示上述暂停情况。引入暂停后的流水线时空图指令编号时钟周期123456789指令iIFIDE XM E NV B指令1+1IFIDE XX E KIB指令1+2IFIDE XK E KIB指令i+3stallIFIDE XM E NIB指令i+4IFIDE XM E MV B图 3.3.3由上可知,为消除结构相关而引入的暂停将影响流水线的性能。为了避免结构相关,可以考虑采用资源重复的方法。比如,在流水线机器中设置相互独立的指令存储器和数据存储器;也可以将Cache分割成指令Cache和 数 据 Cache0假设不考虑流水线其它因素对流水线性能的影响,显然如果流水线机器没有结构相关,那 么 其 C P I也较小。然而,为什么有时流水线设计者却允许结构相关的存在呢?主要有两个原因:一是为了减少硬件代价,二是为了减少功能单元的延迟。如果为了避免结构相关而将流水线中的所有功能单元完全流水化,或者设置足够的硬件资源,那么所带来的硬件代价必定很大。3.3.2 流水线的数据相关(1)数据相关简介当指令在流水线中重叠执行时,流水线有可能改变指令读/写操作44数的顺序,使得读/写操作顺序不同于它们非流水实现的顺序,这将导致数据相关。首先让我们考虑下列指令在流水线中的执行情况:ADDR1,R2,R3SUB R4,R5,RIAND R6,RI,R7OR R8,RI,R9XOR RIO,RI,RllADD指令后的所有指令都要用到ADD指令的计算结果,如图334所示,ADD指令在WB段才将计算结果写入寄存器R1中,但 是SUB指令在其ID段就要从寄存器R 1中读取该计算结果,这种情况就叫做数据相关。除非有措施防止这一情况出现,否 则SUB指令读到的是错误的值。所以,为了保证上述指令序列的正确执行,流水线只好暂停ADD指令之后的所有指令,直 到ADD指令将计算结果写入寄存器R1之后,再启动ADD指令之后的指令继续执行。45数据相关举例果四仃顺序ADD R1,R2,R3hSUB 4,R1,R5AND:6,R1,R7OR R3,R1,R9XOR RlO.Rl.Rll时间(时钟周期)-图3.3.4流水线的数据相关从图3.3.4还可以看到,AND指令同样也将受到这种相关关系的影响。ADD指令只有到第五个时钟周期末尾才能结束对寄存器R1的写操作,所以AND指令在第四个时钟周期从寄存器R1中读出的值也是错误的。而XOR指令则可以正常操作,因为它是在第六个时钟周期读寄存器R1的内容。另外,利用DLX流水线的一种简单技术,可以使流水线顺利执行OR指令。这种技术就是:在DLX流水线中,约定在时钟周期的后半46(2)通过定向技术减少数据相关带来的暂停图3.3.4中的数据相关问题可以采用-种称为定向(也称为旁路或短路)的简单技术来解决。定向技术的主要思想是:在某条指令(如图3.3.4中的ADD指令)产生一个计算结果之前,其它指令(如图3.3.4中的SUB和AND指令)并不真正需要该计算结果,如果能够将该计算结果从其产生的地方(寄存器文件EX/MEM)直接送到其它指令需要它的地方(ALU的输入寄存器),那么就可以避免暂停。基于这种考虑,定向技术的要点可以归纳为:(1)寄存器文件EX/MEM中 的 ALU的运算结果总是回送到ALU的输入寄存器。(2)当定向硬件检测到前一个ALU运算结果的写入寄存器就是当前ALU操作的源寄存器时,那么控制逻辑将前一个ALU运算结果定向到ALU的输入端,后一个ALU操作就不必从源寄存器中读取操作数。47采用定向技术消除数据相关CC1 CC2 CC3 CC4 CC5 CC6程序执L朝序(指令)时 间(时抻周期)图 3.3.5图3.3.4还表明,流水线中的指令所需要的定向结果可能并不仅仅是前一条指令的计算结果,而且还有可能是前面与其不相邻指令的计算结果,图335是采用了定向技术后上述例子的执行情况,其中寄存器文件和功能单元之间的箭头表示定向路径。上述指令序列可以在图335中顺利执行而无需暂停。48采用定向技术后的工作过程指令 1 ADD R p 2,R 3指 令2 SUB R4,R1,R5指 令3 AND R6,R1,R7。指令4 OR R8,R1,R9指 令5 XOR R1O,R1,R11图 3.3.6上述定向技术可以推广到更一般的情况,可以将一个结果直接传送到所有需要它的功能单元。也就是说,一个结果不仅可以从某一功能单元的输出定向到其自身的输入,而且还可以从某一功能单元的输出定向到其它功能单元的输入。49举例:到数据存储器和ALU的定向路径程序妙仃顺序(指含时间(时钟周期)-C Cl CC2 CC3 CC4 CC5 CC6图337到数据存储器和ALU单元的定向路径在DLX中,任何流水线寄存器到任何功能单元的输入都可能需要定向路径。前面的一些数据相关的实例均是有关寄存器操作数的,但是数据相关也有可能发生在一对指令对存储器同一单元进行读写的时候。不过,本节仅讨论有关寄存器的数据相关。50实验一熟悉WinDLX的使用1.实验目的:通过本实验,熟悉WinDLX模拟器的操作和使用,了解DLX指令集结构及其特点。2.实验内容:(1)用WinDLX模拟器执行求阶乘程序facts。执行步骤详见“WinDLX教程”。这个程序说明浮点指令的使用。该程序从标准输入读入一个整数,求其阶乘,然后将结果输出。该程序中调用了 input.s中的输入子程序,这个子程序用于读入正整数。(2)输入数据“3”采用单步执行方法,完成程序并通过上述使用WinDLX,总结WinDLX的特点。(3)注意观察变量说明语句所建立的数据区,理解WinDLX指令系统。3.实验程序:求阶乘程序fact.s*2,Factoria*;Program begin at symbol main;requires module INPUT;read a number from stdin and calculate the factorial(type:double);the result is written to stdout.dataPrompt:.asciiz An integer value 1:PrintfFoiTnat:.asciiz Factorial=%gnnn.align 251PrintfPar:.word PrintfFormatPrintfValue:.space 8.text.global mainmain:;*Read value from stdin into RIaddi rl,rO,Promptjal InputUnsigned