正在加载图片...
378 翁译原理及实践 China-pub.com 下载 80rt(x,0,10): 1■0; whi1e(<10) output(x【i】): 1=1+1: A.4C-语言的Tiny Machine.运行时环境 下面的描述采用了8.7节给出的Tiny Machine知识和第7章基于栈的运行时环境的知识。因 为C一(与TINY不同)有递归过程,运行时环境必须是基于栈的。环境的组成部分有在dMem顶 部的全局区和在它下面的栈,朝下向0增长。因为C一不包含指针或动态分配,因此就不需要 堆(heap)。在C一中每个活动记录(或栈结构)的组成如下 印指向这里 local vars 这里,fp是当前结构指针(current frame pointer),为便于访问保存在一个寄存器中。ofp(I旧 结构指针)是正文第7章中讨论的控制链(controlimk)。在FO(结构偏移)右端的常数是每个存储 的指示值的偏移量。值initFO是在一个活动记录中存储区开始的参数和变量的偏移量。因为 Tiny Machine不包含栈指针,对活动记录中所有字段的引用都使用带负结构偏移的fp。 例如,如果有下列C一函数声明: int f(int x,int y) int a: 那么x、y和z必须在当前结构中分配,£程序体代码产生的结构起始偏移量是-5(x、y和z各占 一个地址,活动记录的簿记信息占两个地址)。×、y和z的偏移分别是-2、-3和-4。 在存储器中全局引用可以用绝对地址找到。然而,像TNY一样,我们更愿意从一个寄有 器的偏移量引用这些变量。通过保存一个固定的寄存器实现这一点,称作即,它总是指向最大 的地址。因为TM模拟器在执行开始之前把这个地址存储到地址0,启动时g即可以从地址0装入, 下面是初始化运行时环境的标准开始序列: 0:LD gp,0(ac)+load gp with maxaddress e) copy gp to fp 0(ac) t clear location o 函数调用也要求在一个调用序列中使用函数体的开始代码地址。我们也希望使用p℃的当前 值执行相对转移来调用函数而不是直接转移(这将使代码潜在地可重定位)。程序code,h/ sort (x,0,10); i = 0; while (i < 10) { output(x[i]); i = i + 1; } A.4 C-语言的Tiny Machine运行时环境 下面的描述采用了8 . 7节给出的Tiny Machine知识和第7章基于栈的运行时环境的知识。因 为C-(与T I N Y不同)有递归过程,运行时环境必须是基于栈的。环境的组成部分有在 d M e m顶 部的全局区和在它下面的栈,朝下向 0增长。因为C-不包含指针或动态分配,因此就不需要 堆( h e a p )。在C-中每个活动记录(或栈结构)的组成如下 这里,f p是当前结构指针(current frame pointer),为便于访问保存在一个寄存器中。o f p (旧 结构指针)是正文第7章中讨论的控制链(control link)。在F O (结构偏移)右端的常数是每个存储 的指示值的偏移量。值 i n i t F O是在一个活动记录中存储区开始的参数和变量的偏移量。因为 Tiny Machine不包含栈指针,对活动记录中所有字段的引用都使用带负结构偏移的 f p。 例如,如果有下列C-函数声明: int f(int x, int y) { int z; . . . } 那么x、y和z必须在当前结构中分配,f程序体代码产生的结构起始偏移量是- 5 (x、y和z各占 一个地址,活动记录的簿记信息占两个地址 )。x、y和z的偏移分别是-2、-3和-4。 在存储器中全局引用可以用绝对地址找到。然而,像 T I N Y一样,我们更愿意从一个寄存 器的偏移量引用这些变量。通过保存一个固定的寄存器实现这一点,称作 g p,它总是指向最大 的地址。因为T M模拟器在执行开始之前把这个地址存储到地址 0,启动时g p可以从地址0装入, 下面是初始化运行时环境的标准开始序列: 0: LD gp, 0 ( a c ) * load gp with maxaddress 1: LDA fp, 0 ( g p ) * copy gp to fp 2: ST ac, 0 ( a c ) * clear location 0 函数调用也要求在一个调用序列中使用函数体的开始代码地址。我们也希望使用 p c的当前 值执行相对转移来调用函数而不是直接转移 (这将使代码潜在地可重定位 )。程序c o d e . h / 3 7 8 编译原理及实践 下载 fp 指向这里
<<向上翻页向下翻页>>
©2008-现在 cucdc.com 高等教育资讯网 版权所有