复旦大学计算机体系结构期末考试B卷.docx
- 文档编号:1292813
- 上传时间:2022-10-20
- 格式:DOCX
- 页数:13
- 大小:19.16KB
复旦大学计算机体系结构期末考试B卷.docx
《复旦大学计算机体系结构期末考试B卷.docx》由会员分享,可在线阅读,更多相关《复旦大学计算机体系结构期末考试B卷.docx(13页珍藏版)》请在冰豆网上搜索。
复旦大学计算机体系结构期末考试B卷
(1)考虑下面这个for循环的汇编代码
looper:
pushl%ebp
movl%esp,%ebp
subl$16,%esp
movl$0,-8(%ebp)
movl$0,-4(%ebp)
jmp.L2
.L4:
movl-4(%ebp),%eax
sall$2,%eax
addl12(%ebp),%eax
movl(%eax),%eax
cmpl-8(%ebp),%eax
jle.L3
movl-4(%ebp),%eax
sall$2,%eax
addl12(%ebp),%eax
movl(%eax),%eax
movl%eax,-8(%ebp)
.L3:
addl$1,-8(%ebp)
addl$2,-4(%ebp)
.L2:
movl-4(%ebp),%eax
cmpl8(%ebp),%eax
jl.L4
movl-8(%ebp),%eax
leave
ret
根据以上的汇编代码,完成相应的for循环C程序代码(注意该程序有返回值)。
intlooper(intn,int*a)
{
inti;
intx=0;
for(i=0;i {______________________________________ if(a[i]>x)//2分 x=a[i];//2分 x++;//1分 }______________________________________ returnx;//1分 } (2) 根据已有的结构(structure)和联合(union)的声明以及C函数voidtest(inti,s2*bp)的IA32汇编代码,推断出结构s1的完整声明和s2中CNT的值;之后再根据推断结果以及IA32汇编代码,推断补齐相应的C程序代码。 下面是要使用到的结构和联合的声明,函数voidtest(inti,s2*bp)及其IA32汇编代码。 structs1{structs2{unionu1{ intleft;structs1*h; s1a[CNT];structs2*i; intright;charj; };unionu1b;}; charc; }; voidtest(inti,s2*bp) { intn=bp->left+bp->right; s1*ap=&bp->a[i]; ap->x[ap->idx]=n; } 其IA32汇编代码为: test: pushl%ebp movl%esp,%ebp subl$16,%esp movl12(%ebp),%eax movl(%eax),%edx movl12(%ebp),%eax movl184(%eax),%eax leal(%edx,%eax),%eax movl%eax,-4(%ebp) movl12(%ebp),%eax leal4(%eax),%ecx movl8(%ebp),%edx movl%edx,%eax sall$2,%eax addl%edx,%eax sall$2,%eax leal(%ecx,%eax),%eax movl%eax,-8(%ebp) movl-8(%ebp),%eax movl(%eax),%edx movl-8(%ebp),%eax movl-4(%ebp),%ecx movl%ecx,4(%eax,%edx,4) leave ret 1.CNT=___9_____//2分 2.写出s1的完整声明。 ____structs1{ intidx;//2分 intx[4];//2分 ___}____________________________________ _______________________________________ _______________________________________ 3.对于下面左边的每个IA32汇编代码,请在右边补全相应的C程序代码。 (请注意下面的函数都需要返回值) A.proc1: pushl%ebp movl%esp,%ebp movl8(%ebp),%eax movzbl188(%eax),%eax popl%ebp ret charproc1(structs2*x) { ______________________________ returnx->b.j; (4分) ______________________________ ______________________________ ______________________________ } B.proc2: pushl%ebp movl%esp,%ebp subl$16,%esp movl8(%ebp),%eax movl188(%eax),%eax movl(%eax),%eax movl%eax,-4(%ebp) movl8(%ebp),%eax movl188(%eax),%eax movl184(%eax),%eax addl%eax,-4(%ebp) movl-4(%ebp),%eax leave ret C.proc3: pushl%ebp movl%esp,%ebp subl$16,%esp movl8(%ebp),%eax movl(%eax),%eax movl188(%eax),%eax movzbl192(%eax),%eax movb%al,-1(%ebp) movl8(%ebp),%eax movl(%eax),%eax movzbl188(%eax),%eax andb%al,-1(%ebp) movzbl-1(%ebp),%eax leave ret intproc2(structs2*x) { ______________________________ inta=x->b.i->left;//2分 a+=x->b.i->right;//3分 returna; (3分) ______________________________ ______________________________ } charproc3(unionu1*x) { ______________________________ chara=x->i->b.i->c;//2分 a&=x->i->b.j//3分 returna; (3分) ______________________________ ______________________________ } (3)PentiumIII的算术操作性能如下: 操作 执行时间 发射时间 整数加法 1 1 整数乘法 4 1 整数除法 36 36 浮点加法 3 1 浮点乘法 5 2 浮点除法 38 38 加载或存储(高速缓存命中) 1 1 考虑如下程序: intloop(int*a,intx,intn) { inty=x*x; inti; for(i=0;i { x=y*a[i];取i,取y,再发射,共3个时钟周期;这里没迭代。 returnx*y; } } 用GCC进行编译,得到如下汇编代码: .L2: movl%ecx,%eax imull(%esi,%edx,4),%eax incl%edx cmpl%ebx,%edx jl.L2 1.每次循环需要的时钟周期数是多少? 3.0//4分 2.通过使用编译选项-funroll-loops,我们可以在编译时进行4路循环展开,此方法可以加快loop的运行,解释原因。 程序的循环次数变少,降低了循环的开销。 即减少了y和a[i]的load需要的1个时钟周期。 //6分 (4) 考虑如下一段程序: intcounter=2; voidhandler(intsig) { counter++; } intcount() { signal(SIGCHLD,handler); inti,status; for(i=1;i<=2;i++) { counter++; if(fork()>0) { counter++; while(waitpid(-1,&status,0)>0); returncounter; } counter+=i; } returncounter; } intmain() { printf("counter=%d\n",count()); exit(0); } 问: 1.程序是否总是有相同输出? 是//6分 2.如果第一问答案为”是”,给出此固定输出,如果答案为”否”,则列出所有可能输出。 counter=7 counter=7 counter=5//4分 (5)请写出一段代码,父进程利用fork()函数创建一个子进程之后挂起,子进程什么也不做,睡眠5s后通过kill函数发送SIGALRM信号给父进程,再睡眠3s,然后以状态1退出。 父进程在信号处理程序中,回收子进程,打印子进程的退出状态,之后以状态0退出。 注意程序中用到的系统调用函数不必进行错误检查,用到的头文件已经给出。 #include #include #include #include #include voidhandler(intsig) { intstatus; waitpid(-1,&status,0); printf("%d\n",WEXITSTATUS(status)); exit(0); } intmain() { pid_tpid; signal(SIGALRM,handler); if(fork()==0) { pid=getppid(); sleep(5); kill(pid,SIGALRM); sleep(3); exit (1); } pause(); } sigal()-handler()2分 fork()1分 kill()1分 waitpid()1分 sleep()1分 WEXITS
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 复旦大学 计算机体系结构 期末考试