4编译原理,陈意云 ,课后答案4[1]
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
static long aa = 10;
short bb = 20;
func(){
static long cc = 30;
short dd = 40;
} 生成的汇编代码:
10.10.2020
9
4编译原理,陈意云 ,课后答案4
.file "static.c“ .version “01.01” gcc2_compiled:
• VC6下,Debug模式Memory窗口查看
|A
|1
|B
|1.0
|
• GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)
10.10.2020
8
4编译原理,陈意云 ,课后答案4
• 下面给出一个C程序及其在X86/Linux下的编译结 果,根据所生成的汇编程序来解释程序中4个变量 的存储分配、作用域、生成期和置初始值方式的 区别
10.10.2020
2
4编译原理,陈意云 ,课后答案4
• 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
10.10.2020
3
4编译原理,陈意云 ,课后答案4
• 考虑下面的C程序 main(){ char * cp1, * cp2; cp1 = “12345”; cp2 = “abcdefghij”; strcpy(cp1, cp2); printf(“cp1 = %s \n cp2 = %s \n”, cp1, cp2); }
.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
10.10.2020
5
4编译原理,陈意云 ,课后答案4
• 一个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 试分析为什么
该程序经以前的某些C编译器编译后,运行结果为: cp1 = abcdefghij cp2 = ghij
试分析为什么cp2被修改
10.10.2020
4
4编译原理,陈意云 ,课后答案4
• C语言中,字符串会添加‘\0’作为串的结束符,因此, 串”12345”存储为”12345\0”,而串”12345\0abc\0”打 印出来的只有12345
.Lfe1: .size func,.Lfe1-func .ident "GCC: (GNU) egcs-2.91.66
19990314/Linux(egcs-1.1.2 release)”
• 常量区连续分配
• 因而本题中”12345”和”abcdefghij”存储为 1 2 3 4 5 \0 a b c d e f g h i j \0
cp1
wenku.baidu.com
cp2
拷贝后结果为
a b c d e f g h i j \0 f g h i j \0
cp1
cp2
• 现代编译器编译通过,执行时会出错。(GCC: 段错误 / VC 非法访问)
10.10.2020
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
4编译原理,陈意云 ,课后答案4
10.10.2020
4编译原理,陈意云 ,课后答案4
• 使用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.
• GCC: (GNU) 3.2.2 (Red Hat Linux 3.2.2-5)结果为20,16
10.10.2020
7
4编译原理,陈意云 ,课后答案4
• #include <stdio.h> static struct _a{ char c1; long i; char c2; double f; } a = {'A', 1, 'B', 1.0};
10.10.2020
6
4编译原理,陈意云 ,课后答案4
• 数据对齐:为了寻址方便
• 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查看编译后的汇编码
short bb = 20;
func(){
static long cc = 30;
short dd = 40;
} 生成的汇编代码:
10.10.2020
9
4编译原理,陈意云 ,课后答案4
.file "static.c“ .version “01.01” gcc2_compiled:
• VC6下,Debug模式Memory窗口查看
|A
|1
|B
|1.0
|
• GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)
10.10.2020
8
4编译原理,陈意云 ,课后答案4
• 下面给出一个C程序及其在X86/Linux下的编译结 果,根据所生成的汇编程序来解释程序中4个变量 的存储分配、作用域、生成期和置初始值方式的 区别
10.10.2020
2
4编译原理,陈意云 ,课后答案4
• 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
10.10.2020
3
4编译原理,陈意云 ,课后答案4
• 考虑下面的C程序 main(){ char * cp1, * cp2; cp1 = “12345”; cp2 = “abcdefghij”; strcpy(cp1, cp2); printf(“cp1 = %s \n cp2 = %s \n”, cp1, cp2); }
.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
10.10.2020
5
4编译原理,陈意云 ,课后答案4
• 一个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 试分析为什么
该程序经以前的某些C编译器编译后,运行结果为: cp1 = abcdefghij cp2 = ghij
试分析为什么cp2被修改
10.10.2020
4
4编译原理,陈意云 ,课后答案4
• C语言中,字符串会添加‘\0’作为串的结束符,因此, 串”12345”存储为”12345\0”,而串”12345\0abc\0”打 印出来的只有12345
.Lfe1: .size func,.Lfe1-func .ident "GCC: (GNU) egcs-2.91.66
19990314/Linux(egcs-1.1.2 release)”
• 常量区连续分配
• 因而本题中”12345”和”abcdefghij”存储为 1 2 3 4 5 \0 a b c d e f g h i j \0
cp1
wenku.baidu.com
cp2
拷贝后结果为
a b c d e f g h i j \0 f g h i j \0
cp1
cp2
• 现代编译器编译通过,执行时会出错。(GCC: 段错误 / VC 非法访问)
10.10.2020
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
4编译原理,陈意云 ,课后答案4
10.10.2020
4编译原理,陈意云 ,课后答案4
• 使用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.
• GCC: (GNU) 3.2.2 (Red Hat Linux 3.2.2-5)结果为20,16
10.10.2020
7
4编译原理,陈意云 ,课后答案4
• #include <stdio.h> static struct _a{ char c1; long i; char c2; double f; } a = {'A', 1, 'B', 1.0};
10.10.2020
6
4编译原理,陈意云 ,课后答案4
• 数据对齐:为了寻址方便
• 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查看编译后的汇编码