4编译原理,陈意云 ,课后答案4学习课件.ppt
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• GCC: (GNU) 3.2.2 (Red Hat Linux 3.2.2-5)结果为20,16
精品
6.3 (续)
• #include <stdio.h> static struct _a{ char c1; long i; char c2; double f; } a = {'A', 1, 'B', 1.0};
cc.2: .long 30 .text .align 4
.globl func .type func,@function
func: pushl %ebp movl %esp, %ebp subl $4, %esp movw $40, -2(%ebp)
.L1: leave ret
.Lfe1: .size func,.Lfe1-func .ident "GCC: (GNU) egcs-2.91.66
• 常量区连续分配
• 因而本题中”12345”和”abcdefghij”存储为 1 2 3 4 5 \0 a b c d e f g h i j \0
cp1
cp2
拷贝后结果为
a b c d e f g h i j \0 f g h i j \0
cp1
cp2
• 现代编译器编译通过,执行时会出错。(GCC: 段错误 / VC 非法访问)
19990314/Linux(egcs-1.1.2 release)”
精品
6.4 (续)
.file "static.c“
.version “01.01”
gcc2_compiled:
.data
.align 4
.type aa,@object
.size aa,4
aa:
--aa分配在静态数据区,作
用域为本文件,生存期为整个程序
精品
6.1 (续)
• with a a:=u b:=v with b a:=x b:=y
a—record a—a.a b—a.b b—record a—b.a b—b.b
精品
6.2
• 考虑下面的C程序 main(){ char * cp1, * cp2; cp1 = “12345”; cp2 = “abcdefghij”; strcpy(cp1, cp2); printf(“cp1 = %s \n cp2 = %s \n”, cp1, cp2); }
精品
6.3
• 一个C程序如下: typedef struct _a{ char c1; long I; char c2; double f; } a; typedef struct _b{ char c1; char c2; long l; double f; } b; main(){ printf(“Size of double, long, char = %d,%d,%d\n”, sizeof(double), sizeof(long), sizeof(char)); printf(“Size of a, b = %d,%d\n”, sizeof(a), sizeof(b)); } 该程序在SPARC/Solaris工作站上运行结果如下: Size of double, long, char = 8,4,1 Size of a, b = 24,16 试分析为什么
精品
6.4 (续)
.file "static.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,4
• VC6下,Debug模式Memory窗口查看
|A
|1
|B
|1.0
|
• GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)
精品
6.4
• 下面给出一个C程序及其在X86/Linux下的编译结 果,根据所生成的汇编程序来解释程序中4个变量 的存储分配、作用域、生成期和置初始值方式的 区别 static long aa = 10; short bb = 20; func(){ static long cc = 30; short dd = 40; } 生成的汇编代码:
该程序经以前的某些C编译器编译后,运行结果为: cp1 = abcdefghij cp2 = ghij
试分析为什么cp2被修改
精品
来自百度文库
6.2 (续)
• C语言中,字符串会添加‘\0’作为串的结束符,因此, 串”12345”存储为”12345\0”,而串”12345\0abc\0”打 印出来的只有12345
编译原理习题课(4)
栾俊 luanj@mail.ustc.edu.cn
7/24/2019
精品
6.1
• 使用Pascal的作用域规则,确定下面程序中用于名字a,b 的每个出现的声明。程序输出整数1,2,3,4
program a (input output); procedure b (u, v, x, y : integer); var a : record a, b : integer end; b : record b, a : integer end; begin with 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) end; begin b(1, 2, 3, 4) end.
精品
6.3 (续)
• 数据对齐:为了寻址方便
• A: char long char
OXXX OOOO OXXX XXXX
double
OOOO OOOO
• B: char char long double
O OXX OOOO OOOO OOOO
• 可以用gcc –S命令查看编译后的汇 编码 VC下可以在debug模式下,菜单栏 View->Debug Windows中 Dissassenbly查看编译后的汇编码