第章运行时存储空间的组织和管理编译原理中国科.pptVIP

  • 1
  • 0
  • 约3.74万字
  • 约 150页
  • 2022-09-02 发布于重庆
  • 举报

第章运行时存储空间的组织和管理编译原理中国科.ppt

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 例 题 2 func(i) func: long i; pushl %ebp 老的基地址指针压栈 { movl %esp,%ebp修改基地址指针 long j; subl $4,%esp 为j分配空间 j= i -1; movl 8(%ebp),%edx 取i到寄存器 func(j); decl %edx i – 1 } movl %edx,-4(%ebp) i – 1 ? j movl -4(%ebp),%eax pushl %eax 把实参j的值压栈 call func 函数调用 addl $4,%esp 恢复栈顶指针 L1: leave 即 mov ebp, esp; pop ebp ret 即 pop eip(下条指令地址) 返回序列之一 返回序列之二 . . . . . . ebp esp 第一百二十七页,共一百五十页。 例 题 3 下面的程序运行时输出3个整数。试从运行环 境和printf的实现来分析,为什么此程序会有3 个整数输出? main() { printf(“%d, %d, %d\n”); } 第一百二十八页,共一百五十页。 例 题 4 main() { char *cp1, *cp2; ? cp1 = 12345; cp2 = abcdefghij; strcpy(cp1,cp2); printf(cp1 = %s\ncp2 = %s\n, cp1, cp2); } 在某些系统上的运行结果是: cp1 = abcdefghij cp2 = ghij 为什么cp2所指的串被修改了? 第一百二十九页,共一百五十页。 例 题 4 因为常量串“12345”和“abcdefghij”连续分配在常数区 执行前: 1 2 3 4 5 \0 a b c d e f g h i j \0 ? ? cp1 cp2 第一百三十页,共一百五十页。 例 题 4 因为常量串“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 第一百三十一页,共一百五十页。 例 题 4 因为常量串“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 现在的编译器大都把程序中的串常量单独存放在只读 数据段中,因此运行时会报错 第一百三十二页,共一百五十页。 例 题 5 func(i,j,f,e) short i,j; float f,e; { short i1,j1; float f1,e1; printf(i,j,f,e); pr

文档评论(0)

1亿VIP精品文档

相关文档