编译原理期末考试卷.pdf

上传人:无*** 文档编号:90868212 上传时间:2023-05-18 格式:PDF 页数:20 大小:2.45MB
返回 下载 相关 举报
编译原理期末考试卷.pdf_第1页
第1页 / 共20页
编译原理期末考试卷.pdf_第2页
第2页 / 共20页
点击查看更多>>
资源描述

《编译原理期末考试卷.pdf》由会员分享,可在线阅读,更多相关《编译原理期末考试卷.pdf(20页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、2001年编译原理试题i.(i o 分)处于/*和*/之间的串构成注解,注解中间没有*/。画出接受这种注解的D F A 的状态转换图。2.(1 0分)为语言L =%1 1 I O W m W 2 n (即a 的个数不超过b的个数的两倍)写一个L R (1)文法,不准超过6个产生式。(若超过6 个产生式,不给分。若所写文法不是L R (1)文法,最多给5 分。)3.(1 0分)构造下面文法的L L (1)分析表。D fT LT-int|realL f id RR f ,id R|4.(1 5分)就下面文法S-(L)|a L fL,S|S给出一个语法制导定义,它输出配对括号的个数。给出一个翻译方案

2、,它输出每个a 的嵌套深度。如句子(a,(a,a),第一小题的输出是2,第二小题的输出是1 2 2。5.(1 0分)P a s c a l 语言f o r 语句的含义见教材第2 2 2 页习题7.1 3。请为该语句设计一种合理的中间代码结构。你可以按第2 1 5页图7.1 7的方式或者第2 1 9页图7.1 9的方式写出你的设计,不需要写产生中间代码的语法制导定义。6.(5分)一个 C 语言程序如下:f u n c(i l,i 2,i 3)l o n g i 1,i 2,i 3;(l o n g j l,j 2,j 3;p r i n t f (A d d r e s s e s o f i

3、l,i 2,i 3 =%o,%o,%o nz/,&i 1,&i 2,&i 3);p r i n t f (A d d r e s s e s o f j l,j 2,j 3 =%o,%o,%o nz,,&j l,&j 2,&j 3);)m a i n()l o n g i l,i 2,i 3;f u n c(i l,i 2,i 3);该程序在某种机器的L i n u x上的运行结果如下:A d d r e s s e s o f i l,i 2,i 3 =2 777777546 0,2 777777546 4,2 7777775470A d d r e s s e s o f j l,j 2,

4、j 3 =2 7777775444,2 7777775440,2 777777543 4从上面的结果可以看出,f u n c函 数 的3个形式参数的地址依次升高,而3个局部变量的地址依次降低。试说明为什么会有这个区别。7.(1 5分)一 个C语言程序及其在某种机器l i n u x操作系统上的编译结果如下。根据所生成的汇编程序来解释程序中四个变量的作用域、生存期和置初值方式等方面的区别。s t a t i c l o n g a a =1 0;s h o r t b b =2 0;f u n c ()s t a t i c l o n g c c =3 0;s h o r t d d =40;

5、.f i l e s t a t i c.c.ve r s i o n 01.01 g c c 2 _c o m p i l e d.:.d a t a.a l i g n 4,t y p e a a,o b j e c t.s i ze a a,4a a:.l o n g 1 0,g l o b l b b,a l i g n 2,t y p e b b,o b j e c t.s i ze b b,2b b:.va l u e 2 0.a l i g n 4,t y p e c c.2,o b j e c t.s i ze c c.2,4c c.2:.l o n g 3 0,t e x t

6、.a l i g n 4.g l o b l f u n c.t y p e f u n c,f u n c t i o nf u n c:p u s h l%e b pm o vl%e s p,%e b ps u b l$4,%e s pm o vw$40,-2 (%e b p).L I:l e a ver e t.L f e l:,s i ze f u n c,.L f e l-f u n c.i d e n t G C C:(G NU)e g c s-2.91.6 6 1 99903 1 4/L i n u x (e g c s-1.1.2 r e l e a s e)z,8.(1 0分

7、)C语言是一种类型语言,但它不是强类型语言,因为编译时的类型检查不能保证所接受的程序没有运行时的类型错误。例如,编译时的类型检查一般不能保证运行时没有数组越界。请你再举一个这样的例子说明C语言不是强类型语言。9.(1 0分)如果在A机器上我们有C语言编译器CCA,也有它的源码丛(用C语言写成)。如何利用它通过尽量少的工作来得到B机器的C语言编译器CCB。1 0.(5 分)表达式(X x.(九y z.(x +y)+z)3)4 5 和(X x.(九y z.(x +y)+z)3 5)4 有同样的结果。在抽象机FAM上,哪一个表达式对应的目标代码的执行效率高?为什么?2003年编译原理试题1.(20分

8、)写出字母表E=a,b上语言L=w I w中a的个数是偶数 的正规式,并画出接受该语言的最简DFAo2.(15分)考虑下面的表达式文法,它包括数组访问、加和赋值:E T EE I E+E I E=E I (E)I id该文法是二义的。请写一个接受同样语言的LR(1)文法,其优先级从高到低依次是数组访问、加和赋值,并且加运算是左结合,赋值是右结合。3.(10分)下面是产生字母表2=0,1,2上数字串的一个文法:S fD S D I2D-0l 1写一个语法制导定义,它打印一个句子是否为回文数(一个数字串,从左向右读和从右向左读都一样时,称它为回文数)。4.(10分)教材上7 2 1节的翻译方案P

9、foffset:=0DD T D;D-id:TT integerT real enter(A.name,T.type.offset);offset:=offset+T.width T.type:=integer,T.width:=4 T.type:=real;T.width:=8 使用了变量offset.请重写该翻译方案,它完成同样的事情,但只使用文法符号的属性,而不使用变量。5.(5分)一 个C语言程序如下:void fun(struct int x;double r;val)main()struct int x;double r;val;fun(val);)该程序在X86/Linux机器上

10、的用cc命令编译时,报告的错误信息如下:1:warning:structure defined inside parms1:warning:anonymous struct declared inside parameter list1:warning:its scope is only this definition or declaration,1:warning:which is probably not what you want.7:incompatible type for argument 1 of fun请问,报告最后一行的错误的原因是什么?如何修改程序,使得编译时不再出现这个

11、错误信息。6.(10分)一 个C语言程序如下:typedef struct _ashort i;short j;short k;a;typedef struct _blong i;short k;b;main()(printf(HSize of short,long,a and b=%d,%d,%d,%dn0,sizeof(short),sizeof(long),sizeof(a),sizeof(b);)该程序在X86/Linux机器上的运行结果如下:Size of short,long,a and b=2,4,6,8已知short类型和long类型分别对齐到2的倍数和4的倍数。试问,为什么类

12、型b的size会等于8?7.(1 5分)一 个C语言程序如下:int fact(i)int i;(if(i=0)return 1;elsereturn i*fact(i-l);main()(printf(%dn,fact(5);printf(%dn,fact(5,10,15);printf(%dn,fact(5.0);printf(%dn,fact();)该程序在X86/Linux机器上的运行结果如下:1201201Segmentation fault(core dumped)请解释下面问题:.第二个fact调用:结果为什么没有受参数过多的影响?第三个fact调用:为什么用浮点数5.0作为参数

13、时结果变成1?第四个fact调用:为什么没有提供参数时会出现Segmentation fault?8.(5分)C语言的赋值操作并非仅对简单类型而言,例如若有类型声明l on ga 1 0 0 ,b 1 0 0 ;,则赋值a=b是允许的。同样,若a和b是同一类型的两个结构,则赋值a=b也是允许的。用教材上第七章所给出的三地址语句,我们能否为这种赋值产生中间代码?若你持肯定态度,请你给出对应这种赋值的中间代码序列;否则请你为这种赋值设计一种三地址语句。你所选用或设计的三地址语句要便于目标代码的生成。9.(5分)一 个C程序的三个文件的内容如下:h e ad.h:sh o rt i n t a=1

14、0;f i l e l.c:#i n cl u d e h e ad.h m ai n()f i l e 2.c:#i n cl u d e h e ad.hn在X 8 6/L i n u x机器上的编译命令如下:cc f i l e l.c f i l e 2.c编译结果报错的主要信息如下:m u l t i p l e d e f i n i t i o n o f a试分析为什么会报这样的错误。10.(5分)按照教材上介绍的方法,把下面C+语言的函数翻译成C的函数。v o i d z o o m (Grap h i cal Obj&o bj,d o u bl e z o o m _f a

15、ct o r,Po i n t&ce n t e r)o bj.t ran sl at e (-ce n t e r.x,-ce n t e r.y);/将中心点移至原点(0,0)o bj.scal e (z o o m _f act o r);缩放2004年编译原理试题1.(20分)写出字母表Z=a,b上语言L=w lw的最后两个字母是a a或协的正规式,并画出接受该语言的最简DFA。2.(15分)说明下面的文法不是SLR(l)文法,并重写一个等价的SLR(l)文法。S -M alb M cld cIb d aM f d3.(10分)为下面的语言写一个无二义的文法:ML语言中用分号分隔语句的

16、语句块,例如:(S;S);(S;S;S);S);(S;S)4.(20分)考虑一个类Pascal的语言,其中所有的变量都是整型(不需要显式声明),并且仅包含赋值语句、读语句、写语句,条件语句和循环语句。下面的产生式定义了该语言的语法(其 中lit表示整型常量;OP的产生式没有给出,因为它和下面讨论的问题无关)。定 义Stmt的两个属性:例1表示它可能定值的变量集合,May Use表示它可能引用的变量集合。(1)写一个语法制导定义或翻译方案,它 计 算Stmt的May。以1和MayUse属性。(2)基于用ayZ/和MayUse属性,说 明Stmti;Stmt2和Stmt2;Stmt|在什么情况下有

17、同样的语义。.Program StmtStmt id:=ExpStmt-read(id)Stmt write(Exp)Stmt-Stmt;StmtStmt-if(Exp)then begin Stmt end else begin Stmt endStmt-while(Exp)do begin Stmt endExpTidExp litExp-Exp OP Exp5.(10分)下 面 是 一 个C语言程序:main()(long i;long a04;longj;i=4;j=8;printf(d,%dn”,sizeof(a),a00);虽然出现long a这样的声明,在X86/Linux机器上

18、该程序还是能通过编译并生成目标代码。请回答下面两个问题:(1)sizeof(a)的值是多少,请说明理由。(2)a00的值是多少,请说明理由。6.(15分)考虑下面的三地址语句序列:b:=1b:=2if w=x goto L2e:=bgoto L2LI:goto L3L2:c:=3b:=4c:=6L3:if y A a lb A c ld c lb d aA-d活前缀的DFA见下图。请根据这个DFA来构造该文法的SLR(l)分析表,并说明该文法为什么不是SLR(l)文法。3.(1 0 分)现有字母表X=a ,写一个和正规式a*等价的上下文无关文法,要求所写的文法既不是LR文法,也不是二义文法。4

19、.(20 分)(a)下面的文法定义语言L=aVcmlm,n 1写一个语法制导定义,其语义规则的作用是:对不属于语言L 的子集L尸 anbcn I n 1的句子,打印H1错信息。S fDC D fa D b la b C C c I c(b)语句的文法如下:S id:=E I if E then S I while E do S I begin S;S end I break写一个翻译方案,其语义动作的作用是:若发现break不是出现在循环语句中,及时报告错误。5.(5 分)C 程序设计的教材上说,可以用两种形式表示字符串:其一是用字符数组存放一个字符串,另一种是用字符指针指向一个字符串。教材上

20、同时介绍了这两种形式的很多共同点和不同点,但是有一种可能的区别没有介绍。下面是一个包含这两种形式的C 程序:char cl=good!”;char*c2=good!”;main()(clO=4G5;printf(cl=%sn,cl);c20=4G5;printf(c2=%sn”,c2);)该程序在X86/Linux机器上运行时的信息如下:cl=Good!Segmentation fault(core dumped)请问,出现Segmentation fault的原因是什么?6.(15分)下面是一个C 语言程序:long fl(i)long i;(return(i*10);long f2(lon

21、g i)(return。*10);main()|printfCfl=%d,f2=%dn”,fl(10.0),f2(10.0);)其中函数f l 和 f2仅形式参数的描述方式不一样。该程序在X86/Linux机器上的运行结果如下:fl=0,f2=100请解释为什么用同样的实在参数调用这两个函数的结果不一样。7.(1 0 分)下面是一个C 语言程序和在X86/Linux机器上编译(未使用优化)该程序得到的汇编代码(为便于理解,略去了和讨论本问题无关的部分,并改动了一个地方)。(a)为什么会出现一条指令前有多个标号的情况,如.L2和.L 4,还有.L5、.L3和.L 1?从控制流语句的中间代码结构加

22、以解释。(b)每个函数都有这样的标号1 1,它的作用是什么,为什么本函数没有引用该标号的地方?main()long i,j;if(j)i+;elsewhile(i)j+;main:push!%ebpmovl%esp,%ebpsubl$8,%espcmpl$0,-8(%ebp)je.L2incl-4(%ebp)jmp.L3.L2:.L4:cmpl$0,-4(%ebp)jne.L6jmp.L5.L6:incl-8(%ebp)jmp.L4.L5:.L3:,L1:leaveret将老的基地址指针压栈将当前栈顶指针作为基地址指针一一为局部变量分配空间一一和下一条指令一起完成恢复老的基地址指针,将栈顶一指

23、针恢复到调用前参数压栈后的位置,并返回调用者8.(5 分)c c 是 UNIX系统上C 语言编译命令,-1 是连接库函数的选择项。两个程序员分别编写了函数库libuserl.a和 libuser2.a。当用命令cc test.c-luserl.a-luser2.a编译时,报告有重复定义的符号。(备注:库名中的lib在命令中省略。该命令和命令cc test.clibuserl.a libuser2.a的效果是一致的)。而改用命令cc test.c-luser2.a-luserl.a时,能得到可执行程序。试分析原因。9.(5 分)根据教材上所介绍的方法,C+中的对象声明语句应如何翻译成C 语句?如

24、教材图 11.11(旧教材的图10.11)程序中的Point _center;应怎样翻译?中 国 科 学 技 术 大 学2005-2006学年第二学期考试试卷考试科目:编译原理和技术 得分:学生所在系:姓名:学号:1、(15 分)(a)用正规式表示字母表 a,b 上,a 不会相邻的所有串。(b)画出一个最简的确定有限自动机,它接受所有大于101的二进制整数。2、(10分)构造下面文法的LL(1)分析表。S a B S Ib A S IeA-bA A IaB f aB B lb3、(10分)下面的文法是二义文法S-EE t while E do E I id:=E I E+E I id I(E)

25、请你为该语言重写一个规范的LR(1)文法,它为该语言中的各种运算体现通常的优先级和结合规则。不需要证明你的文法是规范LR(1)的。4、(10分)为下面文法写一个语法制导的定义,它完成一个句子的while-do最大嵌套层次的计算并输出这个计算结果。S EE-while E do E I id:=E I E+E I id I(E)5、(15分)考虑一个类似Pascal的语言,其中所有的变量都是整型(不需要显式声明),并且仅包含赋值语句、读语句、写语句、条件语句和循环语句。下面的产生式定义了该语言的语 法(其 中 lit表示整型常量;O P的产生式没有给出,因为它和下面讨论的问题无关)。定义Stmt

26、的两个属性:表示在Stmt中一定会定值且在该定值前没有引用的变量集合,MayUse表示在Stmt中有引用且在该引用前可能没有定值的变量集合。(a)写一个语法制导定义或翻译方案,它计算Stmt的 和 MayUse属性。(b)基于上面的计算,程序可能未赋初值的变量集合从哪儿可以得到?可能未赋初值的变量是这样定义的:若存在从程序开始点到达变量a 某引用点的一条路径,在这条路径上没有对变量a 赋值,则变量a 属于程序可能未赋初值的变量集合。Program StmtStmt id:=ExpS tm tf read(id)Stmt write(Exp)Stmt Stmt;StmtStmt f if(Exp

27、)then begin Stmt end else begin Stmt endStmt-while(Exp)do begin Stmt endExp idExp f litExp t Exp OP Exp6、(15分)赋值语句Ax,y:=z(其中A 是 10 x 5 的数组)的注释分析树如下图。请根据教材上7 3 4 节的翻译方案,把图中的属性值都补上(像图7.9那样),并且把每步归约产生的中间代码写在相应产生式的旁边。SL.place:=L.offset:=E.place:=Elist.place:=Elist.ndim:=Elist.array:=L.place:=L.offset:=Z

28、AElist.place:=Elist.ndim:=Elist,array:=E.place:=L.place:=L.offset:=E.place:=L.place:=L.offset:=yX7、(1 5 分)通 常,函数调用的返回值是简单类型时;用寄存器传递函数值。当返回值是结构类型时需要采用别的方式。下面是一个C 语言文件和它在x86/Linux上经某版本GCC编译器编译生成的汇编代码。(备注,该汇编码略经修改,以便于阅读。该修改没有影响结果。)(a)请你分析这些代码,总结出函数返回值是结构类型时,返回值的传递方式。(b)若 m 函数的语句s=f(10)改成s.i=f(10).i+f(2

29、0).i+f(30).i,你认为m 函数的局部存储分配应该怎样修改,以适用该语句的计算。源文件return.c的内容如下:typedef struct long i;S;Sf(k)long k;(S s;s.i=k;return s;m()S s;s.i=20;s=f(10);汇编文件relurn.s的内容如下:.file return.c.text.globl f.typef,functionf:pushl%ebpmovl%esp,%ebpsubl$4,%espmovl 8(%ebp),%eaxmovl 12(%ebp),%edxmovl%edx,-4(%ebp)movl-4(%ebp),%

30、edxmovl%edx,(%eax)leaveret.size f,.-f.globl m.typem,functionm:pushl%ebpmovl%esp,%ebpsubl$4,%espmovl$20,-4(%ebp)leal-4(%ebp),%eaxpushl$10pushl%eaxcall faddl$8,%espleaveret.size m,.-m.section.note.GNU-stack,progbits.ident GCC:(GNU)3.3.5(Debian 1:3.3.5-13)8、(5 分)把下面左边的文件filel.c提交给编译器,编译器没有报告任何错误。而把文件fi

31、le2.c提交给编译器,错误报告如下:file2.c:2:error:conflicting types for funcfile2.c:1:error:previous declaration of func试分析原因。(在这两个文件中,第 1 行都是函数func的原型,第 2 行都是函数func的定义,函数体为空。)filel.c file2.cint func(double);int func(double);int func(f)float f;int func(float f)9、(5 分)教材上第342页倒数第7 行 说“将 C+语言中一个类的所有非静态属性构成一个C 语言的结构类

32、型,取类的名字作为结构类型的名字”。在这一章都学过后,你认为这句话需要修改吗?中 国 科 学 技 术 大 学2006 2007学年第二学期考试试卷(A)考试科目:编译原理和技术 得分:学生所在系:姓名:学号:1、(10分)用子集构造法给出由下面的NFA得到的DFA的转换表2、(20分)(1)通过构造识别活前缀的DFA和构造分析表,来 证 明 文 法 -+1(1仃 8M-8请指出其中有几个文法不是LR(1)文法,并给出它们不是LR(1)文法的理由。3、(10分)下 面 是 C 语言两个函数f 和 g 的概略(它们不再有其它的局部变量):int f(int x)int i;.return i+1;

33、.int g(int y)int j;.f(j+1);.)请按照教材上例6.5中图6.13的形式,画出函数g 调用f,f 的函数体正在执行时,活动记录栈的内容及相关信息,并按图6.12左侧箭头方式画出控制链。假定函数返回值是通过寄存器传递的。4、(10分)C 语言函数f 的定义如下:int f(int x,int*py,int*ppz)(*ppz+=1;*py+=2;x+=3;return x+*py+*ppz;)变量a 是指向b 的指针,变量b 是指向c 的指针,c 是整型变量并且当前值是4。那么执行f(c,b,a)的返回值是多少?5、(10 分)Java语言的实现通常把对象和数组都分配在堆

34、上,把指向它们的指针分配在栈上,依靠运行时的垃圾收集器来回收堆上那些从栈不可达的空间(垃圾)。这种方式提高了语言的安全性,但是增加了运行开销。编译时能否采用一些技术,以降低垃圾收集所占运行开销?概述你的方案。6、(5 分)在面向对象语言中,编译器给每个对象分配空间的第1 个域存放虚方法表的指针。是否可以把虚方法表指针作为最后1个域而不是第1个域?请简要说明理由。7、(15分)考虑个简单语言,其中所有的变量都是整型(不需要显式声明),并且仅包含赋值语句、读语句和写语句。下面的产生式定义了该语言的语法(其 中 lit表示整型常量;O P的产生式没有给出,因为它和下面讨论的问题无关)。Program

35、 t StmtListStmtList t Stmt StmtList I StmtS tm tf id:=Exp;I read(id);I write(Exp);Exp id I lit I Exp OP Exp我们把不影响write语句输出值的赋值(包括通过read语句来赋值)称为无用赋值,写一个语法指导定义,它确定一个程序中出现过赋予无用值的变量集合(不需要知道无用赋值的位置)和没有置初值的变量集合(不影响write语句输出值的未置初值变量不在考虑之中)。非终结符StmtList和 Stmt用下面3 个 属 性(你根据需要来定义其它文法符号的属性):(1)uses.in:在本语句表或语句

36、入口点的引用变量集合,它们的值影响在该程序点后的输出。(2)uses_out:在本语句表或语句出口点的引用变量集合,它们的值影响在该程序点后的输出。(3)useless:本语句表或语句中出现的无用赋值变量集合。8、(10分)一个C 文件array.c仅有下面两行代码:char a4=T 23”,“456”;char*p =“123”,“456”;从编译生成的下列汇编代码可以看出对数组a 和指针p 的存储分配是不同的。试依据这里的存储分配,为置了初值后的数组a 和指针p 写出类型表达式。.file“array.c”.globl a.data.type a,object.size a,8a:.st

37、ring“123”.string“456”.section.rodata.LCO:.string“123”.LC1:.string“456”.globl p.data.align 4.type p,object.size p,8P:Jong.LCOJong.LC1.section.note.GNU-stack,0,5 progbits.ident“GCC:(GNU)3.3.5(Debian 1:3.3.5-13)”9、(10分)两 个 C 文件long.c和 short.c的内容分别是longi=32768*2;和extern short i;main()printf(%dn,i);在 X86

38、/Linux机器上,用 cc long.c short.c命令编译这两个文件,能否得到可执行目标程序?若能得到目标程序,运行时是否报错?若不报错,则运行结果输出的值是否为65536?若不等于65536,原因是什么?中 国 科 学 技 术 大 学2007 2008学年第二学期考试试卷(A)考试科目:编译原理和技术 得分:1、(10分)用正规式表示字母表a,b上 a 不会相邻的所有句子的集合,并给出接受该语言的最简DFA。2、(15分)(1)为下面文法构造规范LR(1)分析表,画出像教材上图3.19这样的状态转换图就可以了。S-V=E EV-*f|idE V(2)上述状态转换图有同心项目集吗?若有

39、,合并同心项目集后是否会出现动作冲突?3、(10分)为字母表0,1上的回文数集合写一个LR 文法;若你认为该语言不存在LR 文法,则说明理由。(注:一个数字串,从左向右读和从右向左读都一样时,称它为回文数。)4、(10分)下面的翻译方案计算0 和 1 的串的值(解释为二进制的正整数)。0 B.val=B.valx2 B-B 1 B.val=Bx.val x 2+1 )8 f 1 B.val=I 重写该翻译方案,使得它基础文法没有左递归,并且为整个输入串计算的8M/和原来的一样。5、(10分)若布尔表达式有异或xor(exclusive-or)运 算(异或运算的结果为真,当且仅当它的一个运算对象

40、为真),请按照教材上表7.4的风格给出异或运算的语义规则。(备注:该题目设计得不好。)6、(5 分)在面向对象语言中,编译器给每个类建立虚方法表,如教材上图11.3和 图 11.4那样。请简要说明,为什么编译器给每个类仅建立虚方法表,而不是建立所有方法的方法表。7、(15分)C 语言和Java语言的数组声明和数组元素引用的语法形式同教材H 7.3.3节和7.3.4节讨论的不一样,例如float A1020和 并 且 每 一 维 的 下 界 都 是 0。若适应这种情况的赋值语句的文法如下:S t L:=EE E +E(E)LL-L E I id(1)重新设计教材H 7.3.3节数组元素的地址计算

41、公式,以方便编译器产生数组元素地址计算的中间代码。不要忘记每一维的下界都是0。(2)重新设计数组元素地址计算的翻译方案。只需写出产生式L L E id 的翻译方案,但要能和7.3.4节中产生式5-乙:=和 后 一 后+即(后)1,的翻译方案衔接。若翻译方案中引入新的函数调用,要解释这些函数的含义。8、(15分)一 个 C 语言的文件如下:func(long i,long j,long k)k=(i+j)-(i-j-f(k);)经 GCC 3.4.6编译器编译得到的汇编代码分两列在下面给出:.file“call.cmovl16(%ebp),%eax.textmovl%eax,(%esp).glo

42、bl funccallf.typefunc,functionsubl%eax,%ebxfunc:movl%ebx,%eaxpushl%ebpsubl%eax,%esimovl$esp,%ebpmovl%esi,%eaxpushl%esimovl%eax,16(%ebp)pushl%ebxpopl%ebxmovl12(%ebp),%eaxpopl%esimovl8(%ebp),%esipopl%ebpaddl%eax,%esiretmovl12(%ebp),%edx.sizefunc,.-funcmovl8(%ebp),%eax.section.note.GNU-stack,m,(a)progb

43、itsmovl%eax,%ebx.ident“GCC:(GNU)3.4.6”subl%edx,%ebx请根据上述汇编代码,并参考教材匕列6.5和第6 章到第9 章习题中的汇编代码进行总结:为适应函数调用引起的跨函数执行,该编译器在寄存器的值的保护方面有些什么约定?9、(10分)下面左边的函数被GCC:(GNU)3.3.5(Debian 1:3.3.5-13)优化成右边的代码。若你认为该优化结果不对或该优化不合理,则阐述你的理由。若你认为该优化结果是对的,请说明实施了哪些优化,并解释循环优化结果的合理性。popl%ebpretf(a,b,c,d,x,y,z)|f:int a,b,c,d,x,y,z;|pushl%ebp(|movl%esp,%ebpwhile(ab)|movl8(%ebp),%edxif(cd)|movl12(%ebp),%eaxX =x+z;|cmpl%eax,%edxelseI jge.L9x=y-z;|.L7:)I jl.L7)|.L9:

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁