为避免混淆,我们不是简单地说子程序中某特定语句的执行, 而是说:在子程序的激活R中S的执行。 这样,为了跟踪程序执行点,我们需要两片数据,用于存放 两个系统定义的指针变量。 当前指令指针 CIP指向当前正在被硬件或软件解释器执行的指令。 当前环境指针 因为同一子程序的所有激活使用同一代码段,只知道当 前指令是不够的,还需要指向激活记录(代表了子程序 的引用环境)的指针(因此称为环境指针) CEP—当前环境指针
为避免混淆,我们不是简单地说子程序中某特定语句的执行, 而是说:在子程序的激活R中S的执行。 这样,为了跟踪程序执行点,我们需要两片数据,用于存放 两个系统定义的指针变量。 •当前指令指针 CIP指向当前正在被硬件或软件解释器执行的指令。 •当前环境指针 因为同一子程序的所有激活使用同一代码段,只知道当 前指令是不够 的,还需要指向激活记录(代表了子程序 的引用环境)的指针(因此称为环境指针)。 CEP——当前环境指针
CEP和CIP的配合,控制了程序的执行路线。 为了保证从子程序的正确返回,CIP和CEP需合适地存放。 通常在调用时将CIP和CEP存放在被调用子程序的激活记 录中 在激活记录中包含一个系统定义的数据对象—返回 点(存放两个指针值)。 当遇到cal调用时,将旧的(jp,ep)存放到激活记录中返 回点,将新的(ip,ep)赋给CIP、CEP,从而完成控制的 转移 遇到返回语句时,取旧的(ip,ep),重设置CIP,CEP, 返回控制权。 图71,给出了一个主程序,两个子程序执行的例子
CEP和CIP的配合,控制了程序的执行路线。 为了保证从子程序的正确返回,CIP和CEP需合适地存放。 通常在调用时将CIP和CEP存放在被调用子程序的激活记 录中。 在激活记录中包含一个系统定义的数据对象——返回 点(存放两个指针值)。 当遇到call调用时,将旧的(ip, ep)存放到激活记录中返 回点,将新的(ip, ep)赋给CIP、CEP,从而完成控制的 转移。 遇到返回语句时,取旧的(ip, ep),重设置CIP,CEP, 返回控制权。 图7.1,给出了一个主程序,两个子程序执行的例子
Main program Subprogram A Subprogram B code CALL A 子程序B开始执行时的执行状态 CALL B eturn segment Constants CALL B Return CALL A Constants R1 R2 R3 11 Return point R1 R2 (ip, ep) Local Local Loca Dynamic variables variables variables activation etc CIP: 15<- System defined pointer variables CEP
子程序B开始执行时的执行状态
这个实现子程序调用返回的模型通常足以作为以后讨论 的几个子程序控制结构变体的基础。 子程序的拷贝规则观点的重要性质是:在程序执行中任 点,最多只有某子程序的一个激活是被使用的。子程 序可以多次调用,但在其下一次激活开始时,每个激活 必须完成且终止。 基于这个性质,可导出一个更简单的子程序实现模型, 只要我们愿意用存储来增加执行速度 作法: 为每个子程序静态地分配用以存放单个激活记录的空 间,作为代码数的扩展,而不是运行时创建 很多 Fortran和 COBOL实现采用这种方式
这个实现子程序调用返回的模型通常足以作为以后讨论 的几个子程序控制结构变体的基础。 子程序的拷贝规则观点的重要性质是:在程序执行中任 一点,最多只有某子程序的一个激活是被使用的。子程 序可以多次调用,但在其下一次激活开始时,每个激活 必须完成且终止。 基于这个性质,可导出一个更简单的子程序实现模型, 只要我们愿意用存储来增加执行速度。 •作法: 为每个子程序静态地分配用以存放单个激活记录的空 间,作为代码数的扩展,而不是运行时创建。 很多Fortran和COBOL实现采用这种方式
这样执行不需动态分配空间,而是重复地使用同一个 激活记录,只是在调用发生时对其进行初始化而已 这种模型也带来其他简化,CEP不再需要,因为当前 激活记录总是CIP指定的代码数的扩展。 对调用一返回的更一般实现,底层硬件很少能提供帮助 然而,对简化的实现,硬件常提供- return-Jump指令,允 许子程序调用被单条硬件指令所实现。这样CIP直接表示 为硬件的地址寄存器。 返回跳指令将地址寄存器中内容存放到内存或寄存器中, 并为其赋新值 图72是一个例子
这样执行不需动态分配空间,而是重复地使用同一个 激活记录,只是在调用发生时对其进行初始化而已。 这种模型也带来其他简化,CEP不再需要,因为当前 激活记录总是CIP指定的代码数的扩展。 对调用—返回的更一般实现,底层硬件很少能提供帮助。 然而,对简化的实现,硬件常提供一return-jump指令,允 许子程序调用被单条硬件指令所实现。这样CIP直接表示 为硬件的地址寄存器。 返回跳指令将地址寄存器中内容存放到内存或寄存器中, 并为其赋新值。 图7.2是一个例子