非局部数据的访问(无嵌套过程) 没有嵌套过程时的数据访问 C语言中,每个函数能访问的变量 函数的局部变量:相对地址已知,且存放在当前活动记录内, t0p_$p指针加上相对地址即可访问 全局变量:在静态区,地址在编译时刻可知 很容易将C语言的函数作为参数进行传递 参数中只需包括函数代码的开始地址 在函数中访问非局部变量的模式很简单,不需要考虑过程是如 何激活的 16
非局部数据的访问 (无嵌套过程) • 没有嵌套过程时的数据访问 – C语言中,每个函数能访问的变量 • 函数的局部变量:相对地址已知,且存放在当前活动记录内, top_sp指针加上相对地址即可访问 • 全局变量:在静态区,地址在编译时刻可知 – 很容易将C语言的函数作为参数进行传递 • 参数中只需包括函数代码的开始地址 • 在函数中访问非局部变量的模式很简单,不需要考虑过程是如 何激活的 16 南大编译许畅
非局部数据的访问(有嵌套过程) PASCAL中,如果过程A的声明中包含了过程B的 声明,那么B可以使用在A中声明的变量 当B的代码运行时,如果它使用的是A中的变量, 必须通过访问链访问 当A调用C,C又调用B时: void A(){ int x,yi A的活动记录 void B(){ C的活动记录 int b; B的活动记录 x =b +yi } void c(){B();} 当A直接调用B时: C(); A的活动记录 B(); B的活动记录 } 17
非局部数据的访问 (有嵌套过程) • PASCAL中,如果过程A的声明中包含了过程B的 声明,那么B可以使用在A中声明的变量 • 当B的代码运行时,如果它使用的是A中的变量, 必须通过访问链访问 17 void A() { int x, y; void B() { int b; x = b + y; } void C() { B(); } C(); B(); } A的活动记录 C的活动记录 B的活动记录 当A调用C,C又调用B时: 当A直接调用B时: A的活动记录 B的活动记录 南大编译许畅