题目
45.(16分)已知f(n)=n!=n×(n-1)×(n-2)×…×2×1,计算f(n)的C语言函数f1的源程序(阴影部分)及其在32位计算机 M上的部分机器级代码如下:
int f1(int n){
1 00401000 55 push edp
... ... ...
if (n>1)
1100401018 83 7D 08 01 cmp dword ptr [ebp+8],1
120040101C 7E 17 jle f1+35h(00401035)
return n*f1(n-1);
130040101E 8B 45 08 mov eax,dword ptr [ebp+8]
1400401021 83 E8 01 sub eax,1
1500401024 50 push eax
1600401025 E8 D6 FF FF EF call f1( 00401000)
... ... ...
1900401030 0F AF C1 imul eax,ecx
2000401033 EB 05 jmp f1+3Ah(0040103a)
else return 1;
2100401035 B8 01 00 00 00 mov eax, 1
}
... ... ...
2600401040 3B EC cmp ebp,esp
... ... ...
300040104A C3 ret
其中,机器级代码行包括行号、虚拟地址、机器指令和汇编指令,计算机 M按字节编址,int 型数据占32位。请回答下列问题:
(1)计算 f(10)需要调用函数 f1多少次?执行哪条指令会递归调用 f1?
(2)上述代码中,哪条指令是条件转移指令?哪几条指令一定会使程序跳转执行?(3)根据第16行的 call指令,第 17行指令的虚拟地址应是多少?已知第16行的 call指令采用相对寻址方式,该指令中的偏移量应是多少(给出计算过程)? 已知第 16行的 call指令的后4字节为偏移量,M是采用大端方式还是采用小端方式?
(4)f(13)=6227020800,但 f1(13)的返回值为1932053504,为什么两者不相等?要使f1(13)能返回正确的结果,应如何修改 f1的源程序?
(5)第19行的imul指令(带符号整数乘)的功能是R[eax]←R[eax]×R[ecx],当乘法器输出的高、低32位乘积之间满足什么条件时,溢出标志OF=1?要使CPU在发生溢出时转异常处理,编译器应在 imul 指令后应加一条什么指令?
(1)计算f(10)需要调用函数f1共 10次,执行第 16行的 call指令会递归调用f1。
(2)第 12行的jle指令是条件转移指令,其含义为小于等于时转移,本行代码的意义为∶当n≤1时,跳转至地址 0040 1035H。第 16行的call指令为函数调用指令,第 20行的jmp 指令为无条件转移指令,第 30行的 ret 指令为子程序的返回指令,这三条指令一定会使程序跳转执行。
(3)其长度计算机 M上按字节编址,第16行的 call指令的虚拟地址为 0040 1025H,长度为5字节,故第17行的指令的虚拟地址为00401025H+5=0040102AH。第16行的cal 指令采用相对寻址方式,即目标地址=(PC)+偏移量,call指令的目标地址为 0040 1000H,所以偏移量=目标地址-(PC)= 0040 1000H-0040 102AH=FFFFFFD6H。根据第 16行的call指令的偏移量字段为 D6FF FF FF,可以确定 M采用小端方式。
(4)因为f(13)=6227020800,其结果超出了32位int 型数据可表示的最大范围,因此f(13)的返回值是一个发生了溢出的错误结果。为使 f1(13)能返回正确结果,可将函数 f1的返回值类型改为double(或long long,或 long double,或float)类型。
(5)若乘积的高 33 位为非全 0或非全1,则 OF=1。编译器应在imu指令后加一条"溢出自除指令",使得 CPU自动香询溢出标志OF,当 OF=1时调出"溢出异常处理程序"。

多做几道

41.(10 分)带权图(权值非负,表示边连接的两顶点间的距离)的最短路径问题是找出从初始顶点到目标顶点之间的一条最短路径。假设从初始顶点到目标顶点之间存在路径,现有一种解决该问题的方法∶
①设最短路径初始时仅包含初始顶点,令当前顶点u为初始顶点;
② 选择离u最近且尚未在最短路径中的一个顶点v,加入最短路径中,修改当前顶点u=v;
③ 重复步骤②,直到u是目标顶点时为止。
请问上述方法能否求得最短路径?若该方法可行,请证明之;否则,请举例说明。
42. (5分)已知一个带有表头结点的单链表,结点结构为
Data/link
假设该链表只给出了头指针 list。在不改变链表的前提下,请设计一个尽可能高效的算法;查找链表中倒数第k个位置上的结点(k为正整数)。若查找成功,算法输出该结点的 data 域的值,并返回1∶否则,只返回0。要求∶
1)描述算法的基本设计思想。
2)描述算法的详细实现步骤。
3)根据设计思想和实现步骤,采用程序设计语言描述算法(使用C、C++或 Java 语言实现),关键之处请给出简要注释。
43.(8分)某计算机的CPU主频为 500Mz,CPI为5(即执行每条指令平均需5个时钟周期)。假定某外设的数据传输率为 0.5MB/s,采用中断方式与主机进行数据传送,以 32 位为传输单位,对应的中断服务程序包含 18条指令,中断服务的其他开销相当于2条指令的执行时间。请回答下列问题,要求给出计算过程。
1)在中断方式下,CPU用于该外设I/O的时间占整个CPU时间的百分比是多少?
2)当该外设的数据传输率达到5MB/s 时,改用DMA 方式传送数据。假定每次 DMA传送块大小为 5000B,且DMA预处理和后处理的总开销为 500个时钟周期,则 CPU用于该外设 I/O 的时间占整个 CPU时间的百分比是多少(假设 DMA与CPU 之间没有访存冲突)?
44.(13 分)某计算机字长为16位,采用16位定长指令字结构,部分数据通路结构如下图所示,图中所有控制信号为1时表示有效、为 0时表示无效。例如,控制信号MDRinE 为1表示允许数据从 DB打入 MDR,MDRin为1表示允许数据从内总线打入 MDR。假设 MAR 的输出一直处于使能状态。加法指令"ADD(R1),RO"的功能为(RO)+(R1))→(R1),即将R0中的数据与 R1的内容所指主存单元的数据相加,并将结果送入 R1的内容所指主存单元中保存。
下表给出了上述指令取指和译码阶段每个节拍(时钟周期)的功能和有效控制信号。请按表中描述方式用表格列出指令执行阶段每个节拍的功能和有效控制信号。
时钟:功能/有效控制信号
C1:MAR←(PC)/PCout, MARin
C2:MDR←M(MDR) PC←(PC)+1/MemR, MDRinE, PC+1
C3:IR←(MDR)/MDRout, IRin
C4:指令译码/无
45.(7分)三个进程P1、P2、P3互斥使用一个包含N(N>0)个单元的缓冲区。
P1每次用 produce()生成一个正整数并用 putO)送入缓冲区某一空单元中;P2每次用 getodd()从该缓冲区中取出一个奇数并用countodd()统计奇数个数;P3每次用 geteven()从该缓冲区中取出一个偶数并用 counteven()统计偶数个数。请用信号量机制实现这三个进程的同步与互斥活动,并说明所定义信号量的含义(要求用伪代码描述)。

该科目易错题

该题目相似题