返回主页

[计算机组成原理 P1176] 已知f(n)=n!=n×(n-1)×(n-2)×…×2×1,计算f(n)的C语言函数f1的源程序(阴

 
学习人数: 2.2k
 
正确率: ??%
答案解析

题目描述
未通过

已知f(n)=n!=n×(n-1)×(n-2)×…×2×1,计算f(n)的C语言函数f1的源程序(阴影部分)及其在32位计算机M上的部分机器级代码如下:

int f1(int n){
1   00401000  55              push ebp
    ...       ...             ...
if(n>1)
11  00401018  83 7D 08 01     cmp dword ptr [ebp+8],1
12  0040101C  7E 17           jle f1+35h (00401035)
return n*f1(n-1);
13  0040101E  8B 45 08        mov eax, dword ptr [ebp+8]
14  00401021  83 E8 01        sub eax, 1
15  00401024  50              push eax
16  00401025  E8 D6 FF FF FF  call f1 (00401000)
    ...       ...             ...
19  00401030  0F AF C1        imul eax, ecx
20  00401033  EB 05           jmp f1+3Ah (0040103a)
else return 1;
21  00401035  B8 01 00 00 00  mov eax, 1
}
    ...       ...             ...
26  00401040  3B EC           cmp ebp, esp
    ...       ...             ...
30  0040104A  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指令后应加一条什么指令?


上一题
下一题
加入错题本
个人笔记
已有5条笔记

登录后提交答案


暂无评论,来抢沙发