已知f(n)=n!=n×(n-1)×(n-2)×…×2×1,计算f(n)的C语言函数f1的源程序(阴影部分)及其在32位计算机M上的部分机器级代码如下:
int f1(int n){100401000 55 push ebp...... ...if(n>1)11 00401018 83 7D 08 01 cmp dword ptr [ebp+8],112 0040101C 7E 17jle f1+35h (00401035)return n*f1(n-1);13 0040101E 8B 45 08mov eax, dword ptr [ebp+8]14 00401021 83 E8 01sub eax, 115 00401024 50 push eax16 00401025 E8 D6 FF FF FF call f1 (00401000)...... ...19 00401030 0F AF C1imul eax, ecx20 00401033 EB 05jmp f1+3Ah (0040103a)else return 1;21 00401035 B8 01 00 00 00 mov eax, 1}...... ...26 00401040 3B ECcmp 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指令后应加一条什么指令?