某程序中有如下循环代码段p“for(int i=0;i<N;i++)sum+=A[i];”。假设编译时变量sum,和i分别分配在寄存器R1和R2中。常量N在寄存器R6中,数组A的首地址在寄存器R3中。程序段P起始地址为0804 8100H,对应的汇编代码和

admin2015-12-30  13

问题 某程序中有如下循环代码段p“for(int i=0;i<N;i++)sum+=A;”。假设编译时变量sum,和i分别分配在寄存器R1和R2中。常量N在寄存器R6中,数组A的首地址在寄存器R3中。程序段P起始地址为0804 8100H,对应的汇编代码和机器代码如下表所示。

执行上述代码的计算机M采用32位定长指令字,其中分支指令bne采用如下格式:

OP为操作码:Rs和Rd为寄存器编号;OFFSET为偏移量,用补码表示。
假设对以上的计算机M和程序P的机器代码,M采用页式虚拟存储管理;P开始执行时,(R1)=(R2)=0,(R6)=1000,其机器代码己调入主存但不在Cache中;数组A未调入主存,且所有数组元素在同一页,并存储在磁盘同一个扇区。
请回答下列问题并说明理由。
P在执行过程中,哪条指令的执行可能发生溢出异常?哪条指令的执行可能产生缺页异常?对于数组A的访问,需要读磁盘和TLB至少各多少次?

选项

答案指令4为加法指令,即对应sum+=A[i],当数组A中元素的值过大时,则会导致这条加法指令发生溢出异常;而指令2、5虽然都是加法指令,但他们分别为数组地址的计算指令和存储变量i的寄存器进行自增的指令,而i最大到达1000,所以他们都不会产生溢出异常。 只有访存指令可能产生缺页异常,即指令3可能产生缺页异常。 因为数组A在磁盘的一页上,而一开始数组并不在主存中,第一次访问数组时会导致访盘,把A调入内存,而以后数组A的元素都在内存中,则不会导致访盘,所以该程序一共访盘一次。 每访问一次内存数据就会查TLB一次,共访问数组1000次,所以此时又访问TLB1000次,还要考虑到第一次访问数组A,即访问A[0]时,会多访问一次TLB(第一次访问A[0]会先查一次TLB,然后产生缺页,处理完缺页中断后,会重新访问A[0],此时又查TLB),所以访问TLB的次数一共是1001次。

解析
转载请注明原文地址:https://jikaoti.com/ti/rrfjFFFM
0

最新回复(0)