
6.823计算机系统结构 ISA概述 作业1 2002春季 我们强烈建议,学生每三人分成一个小组合作完成作业。每组只需要交一份作业答案。学 生应该在预定的课开始前提交作业。为了便于评分,各种习愿应该分类。一旦参考答案公 布了,我们将不再接牧该作业每 另外提腿一点,。还没有在课程卸件列表上登记的月学请尽快给助教们发却件 为了这次作业,请同学们阅读H&P的第一章和第二章
1 6.823 计算机系统结构 ISA 概述 作业 1 2002 春季 我们强烈建议,学生每三人分成一个小组合作完成作业。每组只需要交一份作业答案。学 生应该在预定的课开始前提交作业。为了便于评分,各种习题应该分类。一旦参考答案公 布了,我们将不再接收该作业。 另外提醒一点,还没有在课程邮件列表上登记的同学请尽快给助教们发邮件。 为了这次作业,请同学们阅读 H&P 的第一章和第二章。 _____________________________________________________________________________

2 习题一:CISC与RSC 在这个习思中,你的任务是比较x奶的雷令集结构与DLX的指令集结构。x8斯是一个扩展 的累如器,指令长度可变的CSC结构。DX是一个读写、指令长度固定的R结构。现 在开始。让我们先看一段C代码: fo(-0ien:t特) 5m+=a 使用Pentium的8,上述循环拔编译成下面的x86折令序列: (在本代码的入口处,寄存器%的值为n,寄存墨%cx的值为a,寄存器%dk的值为 um。) xorl %eax.%eax #i0 cmpl %ebx jge LA L6: addl (%ecx,%eax 4)%ed incl %eax cmpl %ebx.%eax 1L6 14 上述折令的含义与长度在下表中给出,其中Rr表示寄存器,表示寄存 墨所存储的内容。 Instruction Operation Le知th addl (Raaet.Rrrrx.SCALE].Resc Rs←+(9CE×cR-2】 capl Raci.Racz Tenp +cRgneg>-cRane> 2 bytes inel Rpent Rg:CRces:>+1 I byte Jge label if (SF-OF) 2bytes jump to the address specified by 2abe 311a5e1 f(5E+0] 2bytes jump to the address specified by label xorl Rpmt.Rmc Br← 2 bytes 注意,条转指令g以大于成等于跳转)和(小于跳转)取决于状志标老位SF和OF,状老标志, 也称为条件骨,与DLX结构中的使用的条件寄存器类似。在跳转之前,处理瑞转的指令根 据计算结果将状态标边设置好,一些指令,比如©m响小于比较指令执行计算并设置状态标 志,并不返回任何结果。下表给出了各状态标志的详细含义: 名移 目的 所报告的状态 OF 溢出 结果出现上溢或下溢 SF 符号 结果是负数(比0小)
2 习题一:CISC 与 RISC 在这个习题中,你的任务是比较 x86 的指令集结构与 DLX 的指令集结构。x86 是一个扩展 的累加器,指令长度可变的 CISC 结构。DLX 是一个读-写、指令长度固定的 Risc 结构。现 在开始,让我们先看一段 C 代码: for ( i=0; i表示寄存 器所存储的内容。 注意,条转指令 jge(大于或等于跳转)和 jl(小于跳转)取决于状态标志位 SF 和 OF。状态标志, 也称为条件码,与 DLX 结构中的使用的条件寄存器类似。在跳转之前,处理跳转的指令根 据计算结果将状态标志设置好。一些指令,比如 cmpl(小于比较指令)执行计算并设置状态标 志,并不返回任何结果。下表给出了各状态标志的详细含义: 名称 目的 所报告的状态 OF 溢出 结果出现上溢或下溢 SF 符号 结果是负数(比 0 小)

习题1.A 对于上述x8新汇编代码。如果=10,我们需要取多少字节的指令?假设是32位的数据。需 要取多少字节的内存数据?又需要存多少呢? 习题1.B 根据下表,将每条x85指令转换为一条或多条DX指令。保应该尽可减少指令使用条数。 使用我1存储,R2存储a,R3存储i,R4存错sm,如果需要,将我5作为条件寄存器, R6,R7等作为临时数据存储寄存器。在你的代码中,你应该不会使用到浮点寄存器和浮点 指令, x86指令 DLX指令序列 xorl %eax,%eax cmpl %ebo %eax Jge addl (%ecx,%eax,4),%edx incl %eax ADDI R3,R3,#I cmpl %ebx.%eax jlL6 在《计算机结构-一定量研究)(Computer Architectre A Ounntatte Approach, Hennessy&Patterson的第二章第八节(Chapte28)中可以找到有关DlX指令集结 构的说明。 习题1.C 使用你在习题1B中转换的DLX指令,如果]0,需要取多少条指令?需要取多 少字节的内存数据?需要存储多少?和你在习题1A的答案相比,有什么不同? 习题1.D 现在对同一循环代到使用DX指令进行人工优化,优化后,如果=0,需要取多 少条番◆?需要取多少字节的内存数据?需要存储多少?和你在习恩1A和习题 1.C的答案相此,有什么不同? 习题2:压栈和出栈 在学习了6.823中基于栈的指令集后,Ben Bitdiddle认为向DLX指令集添加压栈和
3 习题 1.A 对于上述 x86 汇编代码,如果 n=10,我们需要取多少字节的指令?假设是 32 位的数据,需 要取多少字节的内存数据?又需要存多少呢? 习题 1.B 根据下表,将每条 x86 指令转换为一条或多条 DLX 指令。你应该尽可减少指令使用条数。 使用 R1 存储 n,R2 存储 a,R3 存储 i,R4 存储 sum。如果需要,将 R5 作为条件寄存器, R6,R7 等作为临时数据存储寄存器。在你的代码中,你应该不会使用到浮点寄存器和浮点 指令。 x86 指令 DLX 指令序列 xorl %eax, %eax cmpl %ebx %eax jge .L4 addl (%ecx, %eax, 4), %edx incl %eax ADDI R3,R3,#1 cmpl %ebx, %eax jl .L6 在《计算机结构---定量研究》(Computer Architecture A Quantitative Approach), Hennessy&Patterson的第二章第八节(Chapter2.8)中可以找到有关DLX指令集结 构的说明。 习题1.C 使用你在习题1.B中转换的DLX指令,如果n=10,需要取多少条指令?需要取多 少字节的内存数据?需要存储多少?和你在习题1.A的答案相比,有什么不同? 习题1.D 现在对同一循环代码使用DLX指令进行人工优化。优化后,如果n=10,需要取多 少条指令?需要取多少字节的内存数据?需要存储多少?和你在习题1.A和习题 1.C的答案相比,有什么不同? 习题2:压栈和出栈 在学习了6.823中基于栈的指令集后,Ben Bitdiddle认为向DLX指令集添加压栈和

4 出栈功能是一个非常好的塑法。认为如果有栈指令,票么栈调用操作会容易 很多。他决定保留寄存器R9用来存锦栈雪针,对于压栈和出栈指令(栈向下增 长)给出了下列语文,如下表所示 指李 根 作 push Rase He位【cR2>-4】+-cR) R26←-4 pop Reer BtF←Mem[1 R29-+4 习题2.A 为了包容这些新海加的指令,我们需要对基本的DX流水线(参考 erne可y&Patterson第三章相关内容)做出包样的修改?您对Rsr做什么样的 约束? 习题2.B 压栈和出栈香令各有11位编码,其中包括6位操作玛,5位操作数。这就是说在32 位长的指令中意然有2I位被浪费掉了,Ben觉得如果把DLX指令从固定长度政进 为可变长度,这样可以节省不少指令存储空间,保持压栈和出栈播令各11位的长 度。他把这个想法告诉了他的明友,Ay园P.Hc止。但是,A山sa立即否读了 这个提议, 让压栈和出栈指◆各保持1川个字节,这为什么不是一个好的提议呢?那指令合适 的长度又该是多少呢?假设我们不想政变其它DLX指令的意义,Bn的想法会让 我们碰到什么样的间题呢?(提示:考虑转移和跳转指令) 习题2.C 为了评结新霜令的效率,B决定研究典型堆操作,触采用了知下的子程序调用 实例: ·栈向下增长并且当前栈低由栈指针s即R9保存。栈指针指向栈内最后一项 的全地址。 ·为了调用子程序,主程序在钱里使用特定的数据结构来保存参数,并将甲 指向它。第一个参数在内存的最底部。为了能调用这个参数,你应该至少为 它分配16字节的空间,即使这个参数根本不雷要这么大的空间
4 出栈功能是一个非常好的想法。Ben认为如果有栈指令,那么栈调用操作会容易 很多。他决定保留寄存器R29用来存储栈指针,对于压栈和出栈指令(栈向下增 长)给出了下列语义,如下表所示 习题2.A 为了包容这些新添加的指令,我们需要对基本的 DLX 流水线(参考 Hennessy&Patterson第三章相关内容)做出怎样的修改?您对 RDEST 做什么样的 约束? 习题2.B 压栈和出栈指令各有11位编码,其中包括6位操作码,5位操作数。这就是说在32 位长的指令中竟然有21位被浪费掉了。Ben觉得如果把DLX指令从固定长度改进 为可变长度,这样可以节省不少指令存储空间,保持压栈和出栈指令各11位的长 度。他把这个想法告诉了他的朋友,Alyssa P. Hacker。但是,Alyssa立即否决了 这个提议。 让压栈和出栈指令各保持11个字节,这为什么不是一个好的提议呢?那指令合适 的长度又该是多少呢?假设我们不想改变其它DLX指令的意义,Ben的想法会让 我们碰到什么样的问题呢?(提示:考虑转移和跳转指令) 习题2.C 为了评估新指令的效率,Ben决定研究典型堆操作,他采用了如下的子程序调用 实例: z 栈向下增长并且当前栈低由栈指针sp(R29)保存。栈指针指向栈内最后一项 的全地址。 z 为了调用子程序,主程序在栈里使用特定的数据结构来保存参数,并将sp 指向它。第一个参数在内存的最底部。为了能调用这个参数,你应该至少为 它分配16字节的空间,即使这个参数根本不需要这么大的空间

任何被分配进参数数据结构中头16字节的参数都会被送至寄存器。主程序应 该不去定义这个结构中的头16字节。4个字大小的寄存器参数值被配置到R4 至R7. 返回植做入R2: ·R16至R23,还有R30是子程序保存的寄存器《callee-saved register)(有一 个专门的子程序,用来保证在被调用程序结来时这些寄存器里的值和他们在 被调用程序开始封的值一样)。 在这个间愿里,我们只处理32位整型参数和32位整重返回值。仔细考虑下C函 数及其DLX实现代码。 int bar(int d,int e.int t,int g) 1nt白=foo(d,e,4f)H return(d+e+E+g+白)H bar: SUBI P,p,24 zeserve 6 words on the stack SW 1e(ap),R16 save callee-saved register R16 ADD R16,R7,R0 年put argunent g1nR16 8时 24(8p),R4 年5 ave argunent d ADDI R9,ap,424 书put the address o上dinR 5描 20(8p1,R5 save a工anent e ADDI R5,ap,年2日 车put the address of e1n见5 SW 32(p),R6 车9 ave argunent t ADDI RE,P,+32 put the address of f in R6 S时 20(ep),R31 save the contents of the link register JAL foo ¥1pand11nkt0fo0 R3,24(P) 年rest0red R9,20(5D) 书re5t0ree 1材 R5,32(sp】 书reat0re L树 R31,20 (ap) restore the link register ADD R3,R3,R4 ADD R3,R3,R写 ADD R3,R3,R16 LW R16,16{p) 年Eeat0reCa11ee-5a7edr6g15ter我1日 ADD R2,R3,R2 年put return va1达e1nR2 ADDI 5p,P,年24 书restore stack 书return t0Ca11er 为实现上面的函数如r,需要取多少字节的指令?
5 z 任何被分配进参数数据结构中头16字节的参数都会被送至寄存器。主程序应 该不去定义这个结构中的头16字节。4个字大小的寄存器参数值被配置到R4 至R7。 z 返回值放入R2。 z R16至R23,还有R30是子程序保存的寄存器(callee-saved register)(有一 个专门的子程序,用来保证在被调用程序结束时这些寄存器里的值和他们在 被调用程序开始时的值一样)。 在这个问题里,我们只处理32位整型参数和32位整型返回值。仔细考虑下列C函 数及其DLX实现代码。 为实现上面的函数bar,需要取多少字节的指令?

点 习题2.D 对每一次栈的读取和存铺操作使用压栈和出线指令,重写上面的汇编代码。对新 的实现方式,需要取多少字节的指令?这与你在习题2C中的答案相比,效果怎 么样?通过这个例子,你对压栈和出找指令有了什么认识? 习题2.E Bn还在思考如何节省指令存储空间,并且决定向DX指令集增加两条新指令, 这个灵感来源于AM指令集结构中相同的一些雷令,这两条新指令是STMFD(多 重存储,store multiple指令和DMFD(多重读取,oad multiple》指令,它们允 许执行一条指令就对多个寄存器进行存储和读取操作,相关的指令语义定义如下 表所示: 指令 操 类 STMED Rum,(register_11st for each register R*Ro in register 11st 2en-4】】 RUr←+1 register list是一个有序的寄存器列表,寄存器号从低到高表示(如, {R1一R7R9别》. Ays又来了,地向B指出这些指令的语义不完全正确。那么是哪里不正确呢, 如何修改呢? 习题2.F 对于你在习题2.D所写的那些代码,现在用多重存能/多重读取指◆替换压栈/出栈 指令。假设我们可以将多重存销/多重读取指令编成32位代码。对于新的实现需要 取多少字节的指令?如果是64位代码呢?和你在习题2C和习题2D中的答案相比, 有什么变化?通过这个例子,你对多重读取和多重存储指令有了什么认识?
6 习题2.D 对每一次栈的读取和存储操作使用压栈和出栈指令,重写上面的汇编代码。对新 的实现方式,需要取多少字节的指令?这与你在习题2.C中的答案相比,效果怎 么样?通过这个例子,你对压栈和出栈指令有了什么认识? 习题2.E Ben还在思考如何节省指令存储空间,并且决定向DLX指令集增加两条新指令, 这个灵感来源于ARM指令集结构中相同的一些指令。这两条新指令是STMFD(多 重存储,store multiple)指令和LDMFD(多重读取,load multiple)指令,它们允 许执行一条指令就对多个寄存器进行存储和读取操作。相关的指令语义定义如下 表所示: register_list 是一个有序的寄存器列表,寄存器号从低到高表示(如, {R1—R7,R9})。 Alyssa又来了,她向Ben指出这些指令的语义不完全正确。那么是哪里不正确呢, 如何修改呢? 习题2.F 对于你在习题2.D所写的那些代码,现在用多重存储/多重读取指令替换压栈/出栈 指令。假设我们可以将多重存储/多重读取指令编成32位代码,对于新的实现需要 取多少字节的指令?如果是64位代码呢?和你在习题2.C和习题2.D中的答案相比, 有什么变化?通过这个例子,你对多重读取和多重存储指令有了什么认识?

2 习题3:DLX ISA的DSP扩展 DLX-Rs有限公司生产基于DLX ISA结构的微处理器,目前这一代的DLX处理 器除了内存读和内存写指令,可在一个时钟周期内执行任何一条指令。指令只能 按程序顺序执行。处理器本身没有cche:内存读和内存写指令一般需要5个CPU 时钟周期。 公可最近发观了一个潜在客户,是从事实时音频处理业务的,于是公可开始着手 为音频处理应用开发新一代处理器。音類处理的核心是滤被,由以下代码实现, C语言实现! sum -0; Eor(i=0:1《W;1++){ 8um+=a[1】*h[N-1-1]i } 习题3A 为音频处理核心编写DLX汇编代码。尽可能减少幅环内指令数。(假设R1和R2分 别存销指向数组a和h指针,使用寄存器R3、R4和R5位别存储变量'sum'、T 和N”。数组中每个元素都是32位的,) 习题3.B 如果N-100,为了完成习题3.A中的汇编代码,雷要执行多少条霜令?雷要多少时 钟周期?(除了内存读和内存写指令,所有指令的执行都只需要1个时钟周期,内 存读和内存写指令各活要5个时钟周期。处理器没有流水线结构,同一时刻只能处 理一条指令。) 习题3.C 许多客户对现在的D1X处理器的性能不满,并且要果有更快的处理器。现在,参 积是在多媒体应用时一个十分基本的操作,根据这个情况,DXRs决定为卷 积添加新指令,并使用硬件来支持它。于是被提出了下面两条指令
7 习题3:DLX ISA的DSP扩展 DLX-Rules有限公司生产基于DLX ISA结构的微处理器。目前这一代的DLX处理 器除了内存读和内存写指令,可在一个时钟周期内执行任何一条指令。指令只能 按程序顺序执行。处理器本身没有cache。内存读和内存写指令一般需要5个CPU 时钟周期。 公司最近发现了一个潜在客户,是从事实时音频处理业务的,于是公司开始着手 为音频处理应用开发新一代处理器。音频处理的核心是滤波,由以下代码实现。 C语言实现: 习题3.A 为音频处理核心编写DLX汇编代码,尽可能减少循环内指令数。(假设R1和R2分 别存储指向数组’a’和’h’指针,使用寄存器R3、R4和R5位别存储变量’sum’、’I’ 和’N’。数组中每个元素都是32位的。) 习题3.B 如果N=100,为了完成习题3.A中的汇编代码,需要执行多少条指令?需要多少时 钟周期?(除了内存读和内存写指令,所有指令的执行都只需要1个时钟周期,内 存读和内存写指令各需要5个时钟周期。处理器没有流水线结构,同一时刻只能处 理一条指令。) 习题3.C 许多客户对现在的DLX处理器的性能不满,并且要求有更快的处理器。现在,卷 积是在多媒体应用时一个十分基本的操作,根据这个情况,DLX-Rules决定为卷 积添加新指令,并使用硬件来支持它。于是被提出了下面两条指令

球作码 说明 MACC Rd Rs1.Rs2 Iml.Im2 Rd←]小MemR,2>D Rs1 +Iml. Rs2←Rs2◆m2 All operands (Rs1.Rs2)are read before updated REPEATRs Repeat the next instruction times. 表31DSP指令 DLX-Rules希望尽可俊减小对硬件的政动,于是决定具在原有DLX处理器上添如 一个简单的转化逻辑加单元米支持新的指令。也就是说,将新指令在硬件层面上 动态地转化为原来DLX】SA上的相应指令。一且从存错墨《mcm0y》读取了 一条指令,相关硬件单元就会检查这条指令是不是MACC或者REPEAT.如果是, 这条指令就会被源有D1X中的相应指令替换,并逐条执行。 这种执行MACC和REPEAT指令的近似方法真的不需要其他任何硬件改动吗?请 为每条新指令写出相应DLX指令序列。如果这么做有问题,请阐明问题所在,并 指出为了完成转化,还需要添加什么支持硬件。 习题3.D 使用DSP指令为给出的音频处理内核写出汇编代码(开始只使用MACC,然后一 起使用MACC和REPEAT)·如果N-IOO,对于每一种情形,为了完成工作需要调 用多少条指令,耗费多少个时钟周期?当指令是基于习题3C中的转化实现的,新 指令的执行有没有带来性能上的改善? 习题3.E Bn最近棱鸭用米实现处理器的DSP时扩展,他认为处理器应该拥有更多有川的硬件 单元来提高处理器性能。能针对MACC指令实现了一个专用的硬件单元,能并行 执行两次内存读和两次内存写(5个时钟周期),然后顺序完成一次乘法和一次加 法(2个时钟周期),现在执行MACC指令需要7个时钟周期。如果N=I00,完成 使用ACC和REPEAT指◆的程序,需要多少时钟周期: 修政上述专用硬件改动,我们还能如何进一步提高处理器的性能?这时,执行程 序又需要多少个时钟周期?
8 表3-1 DSP指令 DLX-Rules希望尽可能减小对硬件的改动,于是决定只在原有DLX处理器上添加 一个简单的转化逻辑加单元来支持新的指令。也就是说,将新指令在硬件层面上 动态地转化为原来DLX ISA上的相应指令。一旦从存储器(memory)读取了 一条指令,相关硬件单元就会检查这条指令是不是MACC或者REPEAT。如果是, 这条指令就会被原有DLX中的相应指令替换,并逐条执行。 这种执行MACC和REPEAT指令的近似方法真的不需要其他任何硬件改动吗?请 为每条新指令写出相应DLX指令序列。如果这么做有问题,请阐明问题所在,并 指出为了完成转化,还需要添加什么支持硬件。 习题3.D 使用DSP指令为给出的音频处理内核写出汇编代码(开始只使用MACC,然后一 起使用MACC和REPEAT)。如果N=100,对于每一种情形,为了完成工作需要调 用多少条指令,耗费多少个时钟周期?当指令是基于习题3.C中的转化实现的,新 指令的执行有没有带来性能上的改善? 习题3.E Ben最近被聘用来实现处理器的DSP扩展,他认为处理器应该拥有更多有用的硬件 单元来提高处理器性能。他针对MACC指令实现了一个专用的硬件单元,能并行 执行两次内存读和两次内存写(5个时钟周期),然后顺序完成一次乘法和一次加 法(2个时钟周期)。现在执行MACC指令需要7个时钟周期。如果N=100,完成 使用MACC和REPEAT指令的程序,需要多少时钟周期? 修改上述专用硬件改动,我们还能如何进一步提高处理器的性能?这时,执行程 序又需要多少个时钟周期?

2 习题4:寻址方式 Ben Bitdiddle注意到DLX只有一种数据寻址方式。就是变址寻址《displacemen addressing》·看过6.823后Ben如道了VAX1SA的寻址方式比DLX的多.在70年代 中期VAX设计中时,主流观点是编写与编程语言相近的指◆集,用米简化编译器: 因此,VAX提供了许多寻址方式,这有助于减小代码长度,降低寄存器使用量。 Bn想了解,对于下面的代码,DLX中新添加的寻址方式是如何第短代码并降低 寄存器使用量的。 for[1■0:1<n:1++) um+=[1】; 初始状态,R1存储,2存销a,R3存储1,最后R4用来存他sum 习题4.A 看一下习题1D中的优化DLX汇编代码,总共需要多少:时存储器?如果一I0,执 行了多少条动志指令? 习题4.B Bn塑知道,为DLX的算术指令游加间接寻址方式。会给他的代码带米什么影响, 重写习题4A中的代码,优化静态编码区和寄存答使用。在指令中使川间接寻 址方式的语法如下: ADD R4,(R1) //R4←R4+M[R1] 需要多少备时寄存器?如果=0。执行这段代码会需要多少动志指令? 习题4.C 接下米,Bem想看看为D1X算术指令添加自动增1(autoincrement)寻址方式会给 他的代码带米什么影响。重写习题4.A中的代码,优化静老编码区和临时寄存器使 用。在指◆中使用自动增1寻址方式的语法如下: ADD R1,(R2)+ //R1←R1+MR2】:R2←R2+d /d is the size of an element
9 习题4:寻址方式 Ben Bitdiddle注意到DLX只有一种数据寻址方式,就是变址寻址(displacement addressing)。看过6.823后Ben知道了VAX ISA的寻址方式比DLX的多。在70年代 中期VAX设计中时,主流观点是编写与编程语言相近的指令集,用来简化编译器。 因此,VAX提供了许多寻址方式,这有助于减小代码长度,降低寄存器使用量。 Ben想了解,对于下面的代码,DLX中新添加的寻址方式是如何缩短代码并降低 寄存器使用量的。 初始状态,R1存储n,R2存储a,R3存储i,最后R4用来存储sum。 习题4.A 看一下习题1.D中的优化DLX汇编代码,总共需要多少临时存储器?如果n=10,执 行了多少条动态指令? 习题4.B Ben想知道,为DLX的算术指令添加间接寻址方式,会给他的代码带来什么影响。 重写习题4.A中的代码,优化静态编码区和寄存器使用。在add指令中使用间接寻 址方式的语法如下: 需要多少临时寄存器?如果n=10,执行这段代码会需要多少动态指令? 习题4.C 接下来,Ben想看看为DLX算术指令添加自动增1(autoincrement)寻址方式会给 他的代码带来什么影响。重写习题4.A中的代码,优化静态编码区和临时寄存器使 用。在add指令中使用自动增1寻址方式的语法如下:

e 需要多少修时寄存器?如果=0,执行代码需要多少条指令? 习题4.D 如果源加间接寻址,B需要对DLX机的5段瓷水结构做什么样的修改?如果是添加 自动增】(autoincrement)寻址呢?对于这两种情况,Ben会醒到什么问题? 习题五:EDSACjr扩展 第一位计算机设计师不知道他到底需要什么。不管怎样,他们贝是如道他们的 机器很品贵并且不稳定,从而这些计算机先距开发出各种结构,以最少的硬件试 图给程序员提供足够的功能。EDSAC是世界上最早的计算机之一,能只有一个累 加器,绝对内存寻址。程序员具能通过在程序中明确列出地址访月内存,因此自 修改代码就显示必雷的。 现在我们知道基于备存器的寻址和间接寻址使汇编级的编程和编译容易了很多。 但是这是在程序员们使用绝对地址编程近五年后才意识到的。这个问题让我们喜 欢上EDSAC风格的编程基至其缺点。我们将使用一个能提供EDSAC功能的指令 集,同时略去了一些比较脚涩的操作码。表5:1详细解释了这个被称为EDSACir的 指令集。在下表所用的符号中,Mx表示由x确定的内存地址中的内容。A©cum表 示累加器。(A©©um)是指黑如器的内容。←符号表示数据←的右操作数被传输 (拷贝)到左操作数。立即变量是一个地址。成者是与前后程序相关的一个值。 EDSACjr结构允许程序员在程序被调入的时候,把常量放入任一内存位置. 保作码 解释悦明 按位表示 ADD Accm←(Accm)+Mm 000001 SUB Acan←(Acan)-M[U 10000n STORE M[D]←(Accum 00010H CLEAR Accm←-0 0001100000000000 AND Acan←(Acan&Mu 00100月 SHIFTR Accum←(Accum)shiftrn 00101n SHIFTL Accm←-(Accm)shiftl 00110n BGE If(Accum)20 then PC←n 00111n BLT w If(Accm)<0 then PC←n 01000n NOP Wait one cycle 0100100000000000 END Halt machine 0101000000000000 表5-1 EDSAC指令集 移位操作是算术移位。所有字都是16位长。在ED5AC中,指令被编码为整型数。 头5位是操作码,后11位是立即地址(1山位立即地址最大可寻址2048字(16位)的 存绪署空间)一是真实EDSAC寻址空间的两倍)。整型代码由16个小端位表示
10 需要多少临时寄存器?如果n=10,执行代码需要多少条指令? 习题4.D 如果添加间接寻址,Ben需要对DLX机的5段流水结构做什么样的修改?如果是添加 自动增1(autoincrement)寻址呢?对于这两种情况,Ben会碰到什么问题? 习题五:EDSACjr扩展 第一位计算机设计师不知道他到底需要什么。不管怎样,他们只是知道他们的 机器很昂贵并且不稳定。从而这些计算机先驱开发出各种结构,以最少的硬件试 图给程序员提供足够的功能。EDSAC是世界上最早的计算机之一,她只有一个累 加器,绝对内存寻址。程序员只能通过在程序中明确列出地址访问内存,因此自 修改代码就显示必需的。 现在我们知道基于寄存器的寻址和间接寻址使汇编级的编程和编译容易了很多。 但是这是在程序员们使用绝对地址编程近五年后才意识到的。这个问题让我们喜 欢上EDSAC风格的编程甚至其缺点。我们将使用一个能提供EDSAC功能的指令 集,同时略去了一些比较晦涩的操作码。表5-1详细解释了这个被称为EDSACjr的 指令集。在下表所用的符号中,M[x]表示由x确定的内存地址中的内容。Accum表 示累加器。(Accum)是指累加器的内容。Å符号表示数据Å的右操作数被传输 (拷贝)到左操作数。立即变量n是一个地址,或者是与前后程序相关的一个值。 EDSACjr结构允许程序员在程序被调入的时候,把常量放入任一内存位置。 表5-1:EDSACjr指令集 移位操作是算术移位。所有字都是16位长。在EDSAC中,指令被编码为整型数。 头5位是操作码,后11位是立即地址(11位立即地址最大可寻址2048字(16位)的 存储器空间)--是真实EDSAC寻址空间的两倍)。整型代码由16个小端位表示