某程序中有如下循环代码段p“for(int i=0;i<N;i++)sum+=A[i];”。假设编译时变量sum,和i分别分配在寄存器R1和R2中。常量N在寄存器R6中,数组A的首地址在寄存器R3中。程序段P起始地址为0804 8100H,对应的汇编代码和机器代码如下表所示。执行上述代码的计算机M采用32位定长指令字,其中分支指令bne采用如下格式:
问答题 P执行结束时,R2的内容是多少?
【正确答案】正确答案:R2里装的是i的值,循环条件是i<N(1000),即当i自增到不满足这个条件时跳出循环,程序结束,所以此时i的值为1000。
【答案解析】
问答题 M的指令Cache和数据Cache分离。若指令Cache共有16行,Cache和主存交换的块大小为32字节,则其数据区的容量是多少?若仅考虑程序段P的执行,则指令Cache的命中率为多少?
【正确答案】正确答案:Cache共有16块,每块32字节,所以Cache数据区的容量为16*32B=512B。P共有6条指令,占24字节,小于主存块大小(32B),其起始地址为0804 8100H,对应一块的开始位置,由此可知所有指令都在一个主存块内。读取第一条指令时会发生Cache缺失,故将P所在的主存块调入Cache某一块,以后每次读取指令时,都能在指令Cache中命中。因此在1000次循环中,只会发生1次指令访问缺失,所以指令Cache的命中率为:(1000×6-1)/(1000×6)=99.98%。
【答案解析】
问答题 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次。
【答案解析】