4编译原理,陈意云 ,课后答案4

上传人:第*** 文档编号:49693877 上传时间:2018-08-01 格式:PPT 页数:43 大小:164KB
返回 下载 相关 举报
4编译原理,陈意云 ,课后答案4_第1页
第1页 / 共43页
4编译原理,陈意云 ,课后答案4_第2页
第2页 / 共43页
4编译原理,陈意云 ,课后答案4_第3页
第3页 / 共43页
4编译原理,陈意云 ,课后答案4_第4页
第4页 / 共43页
4编译原理,陈意云 ,课后答案4_第5页
第5页 / 共43页
点击查看更多>>
资源描述

《4编译原理,陈意云 ,课后答案4》由会员分享,可在线阅读,更多相关《4编译原理,陈意云 ,课后答案4(43页珍藏版)》请在金锄头文库上搜索。

1、编译原理习题课(4)栾 俊 *6.1 使用Pascal的作用域规则,确定下面程序中用于名字a ,b的每个出现的声明。程序输出整数1,2,3,4program a (input output);procedure b (u, v, x, y : integer);var a : record a, b : integer end;b : record b, a : integer end;beginwith a do begin a := u; b := v end;with b do begin a := x; b := y end;writeln (a.a, a.b, b.a, b.b)e

2、nd;beginb(1, 2, 3, 4)end.D6.1 (续) with aarecord a:=uaa.a b:=vba.b with bbrecord a:=xab.a b:=ybb.bD6.2 考虑下面的C程序main()char * cp1, * cp2;cp1 = “12345”;cp2 = “abcdefghij”;strcpy(cp1, cp2);printf(“cp1 = %s n cp2 = %s n”, cp1, cp2); 该程序经以前的某些C编译器编译后,运行结果为:cp1 = abcdefghij cp2 = ghij 试分析为什么cp2被修改D6.2 (续) C

3、语言中,字符串会添加0作为串的结束符,因此,串 ”12345”存储为”123450”,而串”123450abc0”打印出 来的只有12345 常量区连续分配 因而本题中”12345”和”abcdefghij”存储为 1 2 3 4 5 0 a b c d e f g h i j 0cp1 cp2 拷贝后结果为 a b c d e f g h i j 0 f g h i j 0cp1 cp2 现代编译器编译通过,执行时会出错。(GCC: 段错误 / VC 非法访问)D6.3一个C程序如下: typedef struct _achar c1;long I;char c2;double f; a;t

4、ypedef struct _bchar c1; char c2;long l; double f; b; main()printf(“Size of double, long, char = %d,%d,%dn”, sizeof(double), sizeof(long), sizeof(char);printf(“Size of a, b = %d,%dn”, sizeof(a), sizeof(b); 该程序在SPARC/Solaris工作站上运行结果如下: Size of double, long, char = 8,4,1 Size of a, b = 24,16 试分析为什么D6.

5、3 (续)数据对齐:为了寻址方便 A: charOXXX longOOOO charOXXX XXXX doubleOOOO OOOO B: charO charOXX longOOOO doubleOOOO OOOO 可以用gcc S命令查看编译后的 汇编码 VC下可以在debug模式下,菜单 栏View-Debug Windows中 Dissassenbly查看编译后的汇编 码 GCC: (GNU) 3.2.2 (Red Hat Linux 3.2.2-5)结果为20,16 D6.3 (续)#include static struct _a char c1; long i; char c2

6、; double f; a = A, 1, B, 1.0; VC6下,Debug模式Memory窗口查看GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)|A |1 |B |1.0 |D6.4 下面给出一个C程序及其在X86/Linux下的编译 结果,根据所生成的汇编程序来解释程序中4个 变量的存储分配、作用域、生成期和置初始值 方式的区别 static long aa = 10; short bb = 20; func()static long cc = 30;short dd = 40; 生成的汇编代码:D6.4 (续).file “stat

7、ic.c“.version “01.01”gcc2_compiled:.data.align 4.type aa,object.size aa,4 aa:.long 10 .globl bb.align 2.type bb,object.size bb,2 bb:.value 20.align 4.type cc.2,object.size cc.2,4cc.2:.long 30.text.align 4 .globl func.type func,function func:pushl %ebpmovl %esp, %ebpsubl $4, %espmovw $40, -2(%ebp) .L

8、1:leaveret .Lfe1:.size func,.Lfe1-func.ident “GCC: (GNU) egcs-2.91.66 19990314/Linux(egcs-1.1.2 release)”D6.4 (续).file “static.c“.version “01.01”gcc2_compiled:.data.align 4.type aa,object.size aa,4 aa: -aa分配在静态数据区 ,作用域为本文件,生存期为整个 程序.long 10 aa静态置初值 .globl bb -bb分配在静态数据区, 作用域为全局,可以被其他文件引 用,生存期为整个程序.a

9、lign 2.type bb,object.size bb,2 bb:.value 20 bb静态置初值.align 4.type cc.2,object.size cc.2,4cc.2: -cc分配在静态数据区,作用域为本文件 ,生存期为整个程序。源程序中在函数内部, 为防止重名,需要重命名为cc.2.long 30 cc静态置初值.text.align 4 .globl func.type func,function func:pushl %ebpmovl %esp, %ebpsubl $4, %espmovw $40, -2(%ebp) -dd分配在栈上,生存 期为func调用期,动态置

10、初值 .L1:leaveret .Lfe1:.size func,.Lfe1-func.ident “GCC: (GNU) egcs-2.91.66 19990314/Linux(egcs-1.1.2 release)”D6.5 假定使用:(a)值调用;(b)引用调用;(c)值-结果调用;(d)换名 调用。下面程序的结果分别是什么? program main(input, output);var a, b : integer;procedure p(x, y, z : integer);beginy := y + 1;z := z + x;end;begina := 2;b := 3;p(a

11、+ b, a, a);print a;end.D6.5 (续)值调用 x := 5; y := 2; z := 2; y := y + 1; z := z + x;对形参的调用不改变实参的值 ,结果a为2 引用调用 t := a + b; a = a + 1; a = a + t;结果a为8 值-结果调用 t:=a+b; x:=t;y:=a;z:=a y:=y+1;z:=z+x; t:=x;a:=y;a:=z;结果为7 换名调用 a := a+1; a := a+(a+b);结果为9D6.6一个C程序如下: func(i1, i2, i3) long i1, i2, i3; long j1,

12、j2, j3;printf(“Address of i1 i2 i3 = %o,%o,%on”, printf(“Address of j1 j2 j3 = %o,%o,%on”, main()long i1, i2, i3;func(i1, i2, i3); 该程序在X86/Linux上运行结果为: Address of i1, i2, i3 = 27777775460,27777775464,27777775470 Address of j1, j2, j3 = 27777775444,27777775440,27777775434 从结果看func的3个形参地址逐渐升高,而3个局部变量地

13、址逐渐降 低。试说明为什么D6.6 (续) C语言中,实参从右向左进栈,所以 func(i1, i2, i3)按i3,i2,i1的顺序进栈 而j1,j2,j3按声明的顺序分配D6.7 下面的C程序中,printf的调用仅含格式控 制串,运行时输出3个参数,分析之 main()printf(“%d %d %dn”); D6.7 (续) C语言不做实参和形参个数类型是否一致 的检查 printf函数根据第一个参数格式控制列表 ,到栈中取参数 本题中虽然只传了格式控制列表,但是 printf函数分析格式控制列表,认为程序员 还传了3个整型数,因此继续去栈中取3个 参数,并输出之。 所以得到了三个不可

14、预知值得整数。D6.8下面给出一个C程序及其在X86/Linux下的编译结果。从结果看,func的四个局部变 量i1,j1,f1,e1的地址间隔和他们的类型一致,而形参i,j,f,e的地址间隔和他 们的类型不一致,试分析原因 func(i, j, f, e) short i, j; float f, e; short i1, j1; float f1, e1;printf(“Address of i, j, f,e = %o,%o,%o,%on”, printf(“Address of i1,j1,f1,e1 = %o,%o,%o,%on”, printf(“Address of short,int,long,float,double = %d,%d,%d,%d,%dn”, sizeof(short), sizeof(int), sizeof(long), sizeof(float), sizeof(double); main()

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 解决方案

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号