问答题
问答题     已知,f(n)=n!=n×(n-1)×(n-2)×…×2×1,计算f(n)的C语言函数f1的源程序(阴影部分)及其在32位计算机M上的部分机器级代码如下:
   
【正确答案】(1)计算f(10)需要调用函数f1其10次。执行第16行call指令会递归调用f1。 (2)第12行jle指令是条件转移指令。第16行call指令,第20行jmp指令、第30行ret指令一定会使程序跳转执行。 (3)第16行call指令的下一条指令的地址为0040 1025H+5=0040 102AH,故第17行指令的虚拟地址是0040 102AH。call指令采用相对寻址方式,即目标地址=(PC)+偏移量,call指令的目标地址为0040 1000H,所以偏移量=目标地址-(PC)=0040 1000H-0040102AH=FFFF FFD6H。根据第16行call指令的偏移量字段为D6 FF FF FF,可确定M采用小端方式。 (4)因为f(13)=6227020800,大于32位int型数据可表示的最大值,用而f1(13)的返回值是一个发生了溢出的结果。为使f1(13)能返回正确结果,可将函数f1的返同值类型改为double(或long long或long double或float)。 (5)若乘积的高33位为非全0或非全1,则OF=1。 编译器应该在imul指令后加一条“溢出自陷指令”,使得CPU自动查询溢出标志OF,当OF=1时调出“溢出异常处理程序”。
【答案解析】
问答题     对于上小题,若计算机M的主存地址为32位,采用分页存储管理方式,页大小为4KB,则第1行push指令和第30行ret指令是否在同一页中(说明理由)?若指令Cache有64行,采用4路组相联映射方式,主存块大小为64B,则32位主存地址中,哪几位表示块内地址?哪儿位表示Cache组号?哪几位表示标记(tag)信息?读取第16行call指令时,只可能在指令Cache的哪一组中命中(说明理由)?
 
【正确答案】第1行指令和第30行指令的代码在同一页。 因为页大小为4KB,所以虚拟地址的高20位为虚拟页号。第1行指令和第30行指令的虚拟地址高20位都是00401H,因此两条指令在同一页中。 Cache组数为64/4=16,因此,主存地址划分中,低6位为块内地址、中间4位为组号(组索引),高22位为标记。 读取第16行call指令时,只可能在指令Cache第0组中命中。因为页大小为4KB,所以虚拟地址和物理地址的最低12位完全相同,因而call指令虚拟地址0040 1025H中的025H=0000 0010 0101B=00 0000 100101 B为物理地址的低12位,故对应Cache组号为0。
【答案解析】