编译原理复习题集_第1页
编译原理复习题集_第2页
编译原理复习题集_第3页
编译原理复习题集_第4页
编译原理复习题集_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、编译原理复习题集1名词解释短语:令G是一个文法。S划文法的开始符号,假定是文法G的一个句型,如果有SA且AB,则称是句型相对非终结符A的短语。 设GZ是给定文法, w=xuyV+,为该文法的句型,如果满足下面两个条件: Z xUy; U u; 则称句型xuy 中的子串u是句型xuy的短语。句柄:设GZ是给定文法, w=xuyV+,为该文法的句型,如果满足下面两个条件: Z xUy; U Þ u; 则称句型xuy 中的子串u是句型xuy的简单短语(或直接短语)。一个句型中的最左简单短语称为该句型的句柄。文法上下文无关文法LL(1)文法:若文法的任何两个产生式A ® a | b

2、都满足下面两个条件:(1)FIRST(a ) Ç FIRST(b ) = f;(2)若b Þ* e ,那么FIRST(a ) Ç FOLLOW( A ) = f。 我们把满足这两个条件的文法叫做LL(1)文法,其中的第一个L代表从左向右扫描输入,第二个L表示产生最左推导,1代表在决定分析器的每步动作时向前看一个输入符号。除了没有公共左因子外,LL(1)文法还有一些明显的性质,它不是二义的,也不含左递归。LR(1)文法语法分析:按文法产生式识别输入的符号是否为一个句子的分析过程。无环路有向图(DAG):如果有向图中任一通路都不是环路,则称庐有向图为无环路有向图,简称

3、DAG。后缀式:一种把运算量写在前面,把算符写在后面的表示表达式的方法。语法制导翻译:在语法分析过程中,根据每个产生式所对应的语义子程序进行翻译的方法叫做语法制导翻译。遍:指编译程序对源程序或中间代码程序从头到尾扫描一次并作有关的加工处理,生成新的中间结果或目标程序。局部优化:对程序进行各种等价变换,使得从变换后的程序出发,能生成更有效的目标代码。词法分析:词法分析的主要任务是从左向右扫描每行源程序的符号,按照词法规则从构成源程序的字符串中识别出一个个具有独立意义的最小语法单位,并转换成统一的内部表示(token),送给语法分析程序。语义分析源语言源程序目标语言中间语言(中间表示)2简答题(1

4、) 编译程序和高级语言有什么区别? 用汇编语言或高级语言编写的程序,必须先送入计算机,经过转换成用机器语言表示的目标程序(这个过程即编译),才能由计算机执行。执行转换过程的程序叫编译程序。汇编程序是指没有编译过的汇编语言源文件。编译程序转换过的叫目标程序,也就是机器语言。 编译程序的工作情况有三种:汇编型、解释型和编译型。汇编型编译程序用来将汇编语言编写的程序,按照一一对应的关系,转换成用机器语言表示的程序。解释型编译程序将高级语言程序的一个语句,先解释成为一组机器语言的指令,然后立即执行,执行完了,取下一组语句解释和执行,如此继续到完成一个程序止。用解释型编译程序,执行速度很慢,但可以进行人

5、和计算机的"对话",随时可以修改高级语言的程序。BASIC语言就是解释型高级语言。编译型编译程序将级语言编写的程序,一次就会部翻译成机器语言表示的程序,而且过程进行很快,在过程中,不能进行人机对话修改。FORTRAN语言就是编译型高级语言。(2) 编译程序的工作分为那几个阶段? 词法分析、语法分析和语义分析是对源程序进行的分析(称为编译程序的前端),而中间代码生成、代码优化和代码生成三个阶段合称为对源程序进行综合(称为编译程序的后端),它们从源程序的中间表示建立起和源程序等价的目标程序。(3) 简述自下而上的分析方法。 所谓自下而上分析法就是从输入串开始,逐步进行“归约”,

6、直至归约到文法的开始符号;或者说从语法树的末端开始,步步向上“归约”,直到根节点。(4) 目标代码有哪几种形式?生成目标代码时通常应考虑哪几个问题? 答:目标代码通常采用三种形式:机器语言,汇编语言,待装配机器语言模块。 应着重考虑的问题: (1)如何使生成的目标代码较短; (2)如何充分利用寄存器,以减少访问内存次数;   (3)如何充分利用指仅系统的的特点。(5) 何谓优化?按所涉及的程序范围可分为哪几级优化?答:优化:对程序进行各种等价变换,使得从变换后的程序出发,能产生更有效的目标代码。分为三种级别:局部优化、循环优化、全局优化。 (6

7、) 简述代码优化的目的和意义。3叙述下面的正规式描述的语言,并画出接受该语言的最简DFA的状态转换图。( 1 | 01 )* 0*解答:该正规式描述的语言是,所有不含子串001的0和1的串。最小化:A和C的后继状态是相同的,所以可以将其合并4Pascal语言无符号数的正规定义如下:num ® digit+ (.digit+)? (E(+|-)? digit+)?其中digit表示数字,用状态转换图表示接受无符号数的确定有限自动机。解答:5画出Pascal中实数(不带正负号,可带指数部分)的状态转换图。 6用状态转换图表示接收(a|b)*aa的确定的有限自动机。答案 状态转换图见图1.

8、8。a102startaabbb图1.8 接收(a | b)* aa的DFA分析 和上一题不同的是,现在是直接构造DFA。我们仍然坚持这一点,大家既要会按教材上的算法从NFA的确定化得到DFA,也要会手工直接构造DFA。我们通过本题和下一题来说明,手工直接构造DFA也并不困难。该正规式表示的语言是,字母表S= a, b上最后两个字符都是a的串的集合。抓住这个特点,我们首先画出构造过程中的第一步,见图1.9。它表明最简单的句子是aa。然后,因为在第一个a前可以有若干个b,因此状态0有到自身的b转换。在最后两个字符都是a的串的末尾添加若干个a,能够保持串的这个性质,因此状态2有到自身的a转换。这样

9、我们有图1.10。102starsaa图1.9 构造过程中的第一步102startaaab图1.10 构造过程中的第二步最后,在状态1和状态2碰到b时,前面刚读过的a,不管连续有多少个,都不可能作为句子结尾的那两个字符a,因此状态1和状态2的b转换回到状态0。所有状态的a转换和b转换都已给出,这就得到最后结果。7处于/* 和 */之间的串构成注解,注解中间没有*/。画出接受这种注解的DFA的状态转换图。答案 见图1.3。标记为others的边是指字符集中未被别的边指定的任意其它字符。分析 这个DFA的状态数及含义并不难确定,见下面的五个状态说明。状态1:注释开始状态。状态2:进入注释体前的中间

10、状态。状态3:表明目前正在注释体中的状态。状态4:离开注释前的中间状态。124start52othersothers/*/图1.3 接受注释的DFA状态5:注释结束状态,即接受状态。在这个DFA中,最容易忽略的是状态4到本身的*转换。这个边的含义是:在离开注释前的中间状态,若下一个字符是*,那么把刚才读过的*看成是注释中的一个字符,而把这下一个字符看成可能是结束注释的第一个字符。若没有这个边,那么象/* This is a comment */这样的注释就被拒绝。另外,上面的状态转换图并不完整。例如,对于状态1,没有指明遇到其它字符怎么办。要把状态转换图画完整,还需引入一个死状态6,进入这个状

11、态就再也出不去了。因为它不是接受状态,因此进入这个状态的串肯定不被接受。完整的状态转换图见下面图1.4,其中all表示任意字符。在能够说清问题时,通常我们省略死状态和所有到它的边。124start52othersothers/*/6othersothersall all图1.4 接受注释的完整DFA8某操作系统下合法的文件名为device:name.extension其中第一部分(device:)和第三部分(.extension)可缺省,device, name和extension都是字母串,长度不限,但至少为1,画出识别这种文件名的确定有限自动机。答案 见图1.5,图中的标记d表示任意字母。

12、分析 这个DFA和一些教材上接受无符号数的DFA有类似的地方。我们首先考虑device:和.extension全都出现的情况。这时的DFA比较容易构造,见图1.6。dd123456d:dd.dstart图1.6 文件名的三部分都出现的DFA然后考虑缺省情况。因为.extension可缺省,因此把状态4也作为接受状态。因为name和device一样,都是字母序列,因此在device:缺省时,把到状态2为止得到的字母序列看成是name,所以从状态2画一条转换边到状态5,标记为.。(如果构成name和device的字符完全不一样,那么可以从状态1到状态4画一条边,其标记同状态3到状态4的标记一样。)

13、由于device:和.extension都可缺省,因此把状态2也作为接受状态。9构造一个DFA,它接受å=0, 1上0和1的个数都是偶数的字符串。解:状态0:偶数个0偶数个1状态1:奇数个1偶数个0 11001100状态2:奇数个0偶数个1状态3:奇数个0奇数个110设有非确定的有自限动机 NFA M=(A,B,C,0,1,A,C),其中: (A,0)=C (A,1)=A,B (B,1)=C (C,1)=C。请画出状态转换距阵和状态转换图。解:状态转换距阵为:d01ACA,BBÆCCÆC状态转换图为:1101111设 LÍ a,b,c* 是满足下述条件的

14、符号串构成的语言: (1)若出现 a ,则其后至少紧跟两个 c ; (2)若出现 b ,其后至少紧跟一个 c 。 试构造识别 L 的最小化的 DFA ,并给出描述 L 的正规表达式。 答:DFA 如图所示。相应的正规式为 (c|acc|bc)* 。12写出字母表 = a, b上语言L = w | w的最后两个字母是aa或bb的正规式,并画出接受该语言的最简DFA。解答:语言L的正规式是:(a|b)*(aa|bb) 1start3aabb204aaabbb接受该语言的最简DFA是:13有穷自动机M接受字母表0,1上所有满足下述条件的串:串中至少包含两个连续的0或两个连续的1。请写出与M等价的正规

15、式。 解答:(0|1)*(00|11)(0|1)*14有正规式 b*abb*(abb*)* ,(1) 构造该正规式所对应的 NFA(画出状态转换图) 。(2) 将所求的 NFA 确定化(画出确定化的状态转换图)。 (3) 将所求的 NFA 最小化. (画出最小化后的状态转换图)。15求出下列文法所产生语言对应的正规式. SàbS|aA AàaA|bB BàaA|bC|b CàbS|aA 16给出与下图的NFA等价的正规式。S0S1S3S217把下面的NFA确定化。123456101110118下面两个文法中哪一个不是LR(1)文法?对非LR(1)的那个文

16、法。给出那个有移进归约冲突的规范的LR(1)项目集。S ® aAcS ® aAcA ® bbA | bA ® bAb | b解答:S->aAc A->bAb|b 不是LR(1)文法。因为I(0): S->.S $S->.a A c $I(1): S->S. $I(2): S->a.Ac $A->.bAb cA->.b cI(3):S->Aa.c $I(4):A->b.Ab cA->b. cA->.bAb bA->.b bI(5):S->aAc. $I(6):A->b

17、.Ab bA->b. bA->.bAb bA->.b b所以在项目集I(6)会出现移近和规约的冲突。所以不是LR(1)文法。0123aababba,b19将下面的DFA化成最简形式。20为语言L w | w Î (a | b)*并且在w的任何前缀中,a的个数不少于b的个数写一个LR(1)文法,不准超过6个产生式。解答:S> aBS | bAS |A> a | BaaB>b | aBB21写一个文法,使其语言是奇数集,且每个奇数不以0开头。 解:文法G(N): NAB|B AAC|D B1|3|5|7|9 DB

18、|2|4|6|8 C0|D22考查文法G(s): S( T ) | a + S | aTT, S | S(1) 消除文法的左递归;(2) 提取公共左因子;(3) 对每个非终结符,写出不带回朔的递归子程序。解答:. S( T ) | a + S | a TST T ,ST| . S( T ) | aR R+S| T ,ST| . Procedure S Begin If SYM=( Then ADVANCE; E; If SYM=( Then ADVANCE; Else ERROR; Else If SYM=a Then Begin R; End Else ERROR; End; Pr

19、ocedure R Begin If SYM=+ Then Begin ADVANCE; S; End; End; Procedure T Begin If SYM=+ Then Begin ADVANCE; S; T; End; End;23设文法G(S): S(L)|a S|a LL,S|S (1)消除左递归和回溯; (2)计算每个非终结符的FIRST和FOLLOW; (3)构造预测分析表。 解: (1) S(L)|aS SS| LSL LSL| 评分细则:消除左递归2分,提公共因子2分。  (2) FIRST

20、)S)(,aFOLLOW(S)#,) FIRST(S),a, FOLLOW(S)#,) FIRST(L)(,aFOLLOW(L) ) FIRST(L), FOLLOW(L ) 24消除下列文法的左递归. SàSaP|Sf|P PàQbP|Q QàcSd|e 25已知文法 G :AàaABe|a BàBb|d 给出与上述文法等价的 LL(1)文法 G'。26已知文法GA:A aAB | a B Bb | d(1)构造与GA等价的LL(1)文法;(2)构造GA的预测分析表。27程序的文法如下:P &#

21、174; DD ® D ; D | id : T | proc id ; D ; S(1)写一个语法制导定义,打印该程序一共声明了多少个id。(2)写一个翻译方案,打印该程序每个变量id的嵌套深度。28构造下面文法的LL(1)分析表。D ® TLT ® int | realL ® id RR ® , id R | e解答:int realid,$DD®TLD®TLTT®intT®realLL®id RRR ®, id RR ® e29考虑下文法:D à TVT &#

22、224; int floatV à id , V | ida. 在该文法中提取左公因子。b. 为所得文法的非终结符构造First和Follow集合。c. 说明所得的文法是LL(1)文法。d. 为所得文法构造LL(1)分析表。e. 假设有输入串int x , y , z 写出相应LL(1)分析程序的动作。 答:在看一遍消除左递归a. 文法存在左公因子,提取左公因子后的文法为:D T VT int | floatV id V'V' ,V |b. 非终结符First集合Follow集合D int , float $ T int , float id V id $ V'

23、; , , $ c. (1) First ( TV ) = int , float First(int) First(float)=intfloat=; First(id V')=id; First(,V) First()=, =; (2) V'=>, First(V')Follow(V')= , , $ = 根据LL(1)文法的定义判断,此文法是LL(1)文法;d. LL(1)分析表为:intfloatid,$DD TVD TVTT intT floatVVidV'V'V' ,VV'e. 输入串int x,y,z的LL(1

24、)分析:步骤分析栈输入串分析程序的动作1$Dint x,y,z$D TV2$VTint x,y,z$T int3$V intint x,y,z$int匹配4$Vx,y,z$VidV'5$ V'xx,y,z$x匹配6$ V',y,z$V' ,V7$ V,y,z$, 匹配8$ Vy,z$VidV'9$ V'yy,z$y匹配10$ V',z$V' ,V11$ V,z$, 匹配12$ Vz$VidV'13$ V'zz$z匹配14$接受30说明如下文法是否是LL(1)文法,若不是,将其转换为LL(1)文法。最后给出该文法的L

25、L(1)分析表。 A à B e B à B b | a 解答:文法中有左递归,不是LL(1)文法.            转换为 G :                         A 

26、; B e                          B  a B                    

27、60;    Bb B |                   Predict(A  B e) = a  .1            Predict(B  aB) = a  .2   

28、60;        Predict(B bB)= b  .3            Predict(B ) = e  .4LL(1)分析表:       a      b     

29、; e A     1   B     2   B      3     431设有文法:Pbegin XYendXXd;Xd;YY;sYs(1) 该文法含有左递归吗?若有,消除它。(2) 改造后的文法是LL(1)文法吗?若是,给出其预测分析表。(3) 写出句子 begin d;s end的分析过程。32已给

30、文法 GS : S SaP | Sf | P P qbP | q 将 GS 改造成 LL ( 1 )文法,并给出 LL ( 1 )分析表。 答:改造后的文法: S PS' S' aPS'| fS' | e P qP' P' bP | e各候选式的 FIRST 集,各非终结符的 FOLLOW 集为产生式FIRST 集FOLLOW 集S PS'q#S' aPS' fS' eaf e #P qP'qa,f,#P' bP eb e a,f,#LL(1) 分析表为33设文法G(S): S(L)|a S|a L

31、L,S|S (1) 消除左递归和回溯; (2) 计算每个非终结符的FIRST和FOLLOW; (3) 构造预测分析表。 34给定文法 GS : S Aa|dAb|Bb|dBa A c B c 构造文法 GS 的 LR ( 1 )分析表。 解答:分析表如下图所示35已知文法G(S) Sa|(T) TT,S|S 写出句子(a,a),a)的规范归约过程及每一步的句柄。 解答:句型规约规则句柄(a,a),a)Saa (S,a),a)TSS(T,a),a)Saa(T,S),a)TT,S T,S (S),a) TSS(T),a)SS(T)(T) (S,a)

32、TSS (T,a)Saa (T,S)TT,S T,S (T)S(T)(T)S36已知文法G(E) ET|ET TF|T *F F(E)|i 给出句型(T *Fi)的最右推导及画出语法树; 解:(1) 最右推导: ETF(E)(ET)(EF)(Ei) (Ti)(T*Fi) 37说明下面的文法不是SLR(1)文法,并重写一个等价的SLR(1)文法。S à M a | b M c | d c | b d aM à d解答:S ® S S ® M a | b M c | d c |

33、b d aM ® d因为a是M的后继符号之一,因此在上面最右边一个项目集中有移进-归约冲突。等价的SLR(1)文法是S ® d a | b d c | d c | b d a38在PASCAL语言中,简单类型的变量的声明例举如下:m, n : integerp, q, r : real为这样的声明写一个LR(1)文法(为简单起见,变量标识符都用id表示),并根据你的文法写一个语法制导定义(或叫做为你的文法加上语义动作),它将变量的类型填入符号表。39一个非LR(1)的文法如下:L ® MLb | aM ® e请给出所有有移进归约冲突的LR(1)项目集,以

34、说明该文法确实不是LR(1)的。解答:40若有文法 G(S)的产生式如下:SàL=R SàR Là*R Lài RàL,构造识别所有项目集规范族的 DFA.,判断该文法是否是 SLR(1)文法,说明理由。 41现有句型g ba lb 和产生式A® ba,分别指出LL(1)方法和LR(1)方法在扫描到此句型的什么位置决定用此产生式?42为下面的算术表达式文法写一个语法制导的翻译方案,它将每个子表达式E的符号(即值大于零还是小于零)记录在属性E.sign中(属性值分别用POS或NEG表示)。你可以假定所有的整数都不为零,这样就不用担心零的

35、符号。E ® E *E | +E | -E | unsigned_integer解答:E ® E1 *E2if E1.sign= E2.sign then E.sign := POS else E.sign := NEG E ® +E1 E.sign := E1.sign E ® -E1 if E1.sign= POS then E.sign := NEG else E.sign := POSE ® unsigned_integer E.sign := POS43一个文法如下: S ® ( S ) S ® a 请给出该文法中

36、对活前缀(有效的LR (1)项目。44为下面文法添加语义规则(或叫动作子程序),输出S¢产生的二进制数的值,如输入是101时,输出5。S¢ ® SS ® S B | BB ® 0 | 145写出表达式(ab*c)/(ab)d的逆波兰表示及三元式序列。 解答:逆波兰表示: abc*ab/d三元式序列:  (*,b,c)  (,a,)  (,a,b)  (/,)  (,d)【附:几个练习】(1)aba0b0解答:逆波兰表示为:aba0b0。

37、(2)a(a*bd)*(ab*d)/d解答:逆波兰表示为:aab*dabd*d/。(3)ab0a0(ab)>2解答:逆波兰表示为:ab0a0ab2。(4)a*(b*ca)bcd解答:逆波兰表示为:abc*a*bcd。46把表达式- (a+b)*(c+d)+(a+b+c)翻译成三地址码序列。47设布尔表达式的文法为 E E1E2 E E1E2 E i 假定它们将用于条件控制语句中,请 (1)改写文法,使之适合进行语法制导翻译; (2)写出改写后的每个产生式的语义动作。 解:(1) E0E(1)  EE0E(2)  EAE(1)  EEAE(

38、2)  Ei  (2) EE(1) BACKPATCH(E(1)·FC,NXQ); E0·TC:E(1)·TC EE0E(2) E·FC:E(2)·FC;  E·TC:MERG(E0·TC,E(2)·TC) EAE(1) BACKPATCH(E(1)·TC,NXQ); E0·FC:E(1)·FC  EEAE(2)  E·

39、;TC:E(2)·TC; E·FC:MERG(EA·FC,E(2)·FC) Ei E·TC:NXQ;E·FC:NXQ1; GEN(jn2,entry(i),0); GEN(j,0) 48将语句 if (A<X Ù B>0) while ( C>0 ) C=C+D; 翻译成三地址码序列。49设有基本块如下:T1=S+RT2= 3T3= 12/T2T4=S/RA=T1-T4T5=S+RB=T5T6=T5*T3B=T6(1) 画出中间代码的流图;(2)

40、设A、B是出基本块后的活跃变量,请给出优化后的三地址码序列。50设已构造出文法G(S):(1) S ® BB (2) B ® aB (3) B® b的LR分析表如下ACTIONGOTO状态ab#SB0s3s4121acc2s6s753s3s484r3r35r16s6s797r38r2r29r2假定输入串为abab,请给出LR分析过程(即按照步骤给出状态,符号,输入串的变化过程)。解答:步骤状态符号输入串00#abab#103#abab#2034#abab#3038#aBab#402#Bab#5026#Bab#60267#Bab#70269#BaB#8025#BB#

41、901#S#acc51给出活动记录空间结构。并给出各部分的存储对象。解答:52将下面程序段翻译成四元式序列。while( A<CB<D )if ( A=1) C=C+1 ; else while ( A<D ) A=A+2; 解: (1) (j,a,0,5)  (2) (j,3) (3) (j,b,0,5) (4) (j,15) (5) (,×,1,T1) (6) (:,T1,×) (7) (j,a,0,9) (8) (j,12) (9) (,a,1,T2) 

42、;(10) (:,T2,a) (11) (j,1) (12) (,b,1, T3) (13) (:,T3,b) (14) (j,1) (15)  评分细则:控制结构4分,其它3分。 53有一语法制导翻译如下所示:S bAb print(“1”) A (B print(“2”) A a print(“3”) B Aa) print(“4”) 若对输入序列b(aa)a)a)b 进行自底向上分析,请写出输出序列。解答:3424242154画出IF a>0 THEN x:=x+1 ELSE x:=4*( x- 1)的

43、翻译方案图。55下面是一个C语言程序:main()long i;long a04;long j;i = 4; j = 8;printf(“%d, %dn”, sizeof(a), a00);虽然出现long a04这样的声明,在X86/Linux机器上该程序还是能通过编译并生成目标代码。请回答下面两个问题:(1)sizeof(a)的值是多少,请说明理由。(2)a00的值是多少,请说明理由。解答:(1)按照数组size的计算公式,sizeof(a)的值一定是0。(2)a00的值是4。虽然a的size是0,但它仍然有起始地址,并且a00的地址等于a的起始地址。由于X86/Linux机器上,活动记录

44、栈向低地址方向增长,另外由于低地址放低位字节,因此a00的地址和i的地址一致,其值和i的值一样,等于4。56将下面的条件语句表示成三地址码序列: if ( a>b ) x=a+b*c ; else x=b-a; 解答:四元式:(1) ( j>, a, b, (3)(2) ( j, , , (7) )(3) ( *, b, c, T1)(4) ( +, a, T1, T2)(5) ( :=, T2, , x)(6) ( j, , , (9)(7) ( -, b, a, T3)(8) ( :=, T3, , x)(9) ( )57考虑下面的三地址语句序列:b := 1b := 2if

45、w <= x goto L2e := bgoto L2L1:goto L3L2:c := 3b := 4c := 6L3:if y <= z goto L4goto L5L4:g := g + 1h := 8goto L1L5:h := 9(1)在该代码中用水平的横线将代码分成基本块,并给每个基本块一个序号。(2)画出该代码的控制流图,每个基本块就用(1)的序号表示。(3)若有循环的话,列出构成每个循环的结点。解答:58一个C语言程序如下:func(i1,i2,i3)long i1,i2,i3;long j1,j2,j3; printf("Addresses of i1,

46、i2,i3 = %o,%o,%on",&i1,&i2,&i3);printf("Addresses of j1,j2,j3 = %o,%o,%on",&j1,&j2,&j3);main()long i1,i2,i3;func(i1,i2,i3);该程序在SUN工作站上的运行结果如下:Addresses of i1,i2,i3 = 35777773634,35777773640,35777773644Addresses of j1,j2,j3 = 35777773524,35777773520,35777773514从

47、上面的结果可以看出,func 函数的3个形式参数的地址依次升高,而3个局部变量的地址依次降低。试说明为什么会有这个区别。解答: 由于实参表达式是反序进入活动记录,而局部变量是顺序在活动记录中分配。编译计算时,每个类型的大小都是静态确定的59一个C语言程序如下:void fun(struct int x; double r; val) main()struct int x; double r; val;fun(val);该程序在X86/Linux机器上的用cc命令编译时,报告的错误信息如下:1: warning: structure defined inside parms1: warning:

48、 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 请问,报告最后一行的错误的原因是什么?如何修改程序,使得编译时不再出现这个错误信息。解答:C语言对所有的类型都采用结构等价,唯有结构类型例外,采用名字等价。这里的类型不相容是因为两个val不是名字等价

49、的。要消除这个错误,包括所有的警告,程序修改如下:struct sint x;double r;void fun(struct s val) main()struct s val;fun(val);60一个C语言程序如下:main()func();printf("Return from funcn");func()char s4;strcpy(s,"12345678");printf("%sn",s);该程序在PC机linux操作系统上的运行结果如下:12345678Segmentation fault (core dumped)试分

50、析为什么会出现这样的运行错误。解答: 活动记录中存放返址的单元被串拷贝破坏【参数反序压栈,局部变量顺序分配】61一个C语言函数如下:func(i)long i;long j;j=i-1;func(j);该函数在PC机linux操作系统上编译生成的汇编代码如下:.file"stack.c"gcc2_compiled.:_gnu_compiled_c:.text.align 2.globl _func.type_func,function_func:pushl %ebpmovl %esp,%ebpsubl $4,%espmovl 8(%ebp),%edxdecl %edxmov

51、l %edx, -4(%ebp)movl -4(%ebp),%eaxpushl %eaxcall _funcaddl $4,%espL1:leaveretLfe1:.size_func,Lfe1-_func试画出该函数的一个活动记录的内容,包括活动记录的每个单元存放什么东西、执行movl 8(%ebp),%edx指令时栈顶指针所指的的位置、与活动记录有关的另一个指针所指的位置和地址增长方向。解答:62一个C语言的函数如下:func(c,l)char c;long l; func(c,l);在X86/Linux机器上编译生成的汇编代码如下:.file"parameter.c"

52、.version"01.01"gcc2_compiled.:.text.align 4.globl func.type func,functionfunc:pushl %ebp 将老的基地址指针压栈movl %esp,%ebp 将当前栈顶指针作为基地址指针subl $4,%esp 分配空间movl 8(%ebp),%eaxmovb %al,-1(%ebp)movl 12(%ebp),%eaxpushl %eaxmovsbl -1(%ebp),%eaxpushl %eaxcall funcaddl $8,%esp.L1:leave 和下一条指令一起完成恢复老的基地址指针,将栈顶ret 指针恢复到调用前参数压栈后的位置,并返回调用者.Lfe1:.size func,.Lfe1-func.ident"GCC: (GNU) egcs-2.91.66 19990314/Linux (egcs-1.1.2 release)"(a) 请指出对应源程序第5行的函数调用func(c,l)的汇编指令是哪几条。(b)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论