最初的问题是: 当执行到达以下骨架程序中的位置1时,显示包含所有激活记录实例的堆栈,包括静态链和动态链。假设Bigsub处于1级。
但我认为答案是错误的,因为静态链接应该指向静态父级ARI的底部,而不是顶部,只是动态链接应该指向顶部。
例如,B和C的静态链接应指向A的底部,而不是A的顶部,A的静态链接应指向BIGSUB的底部,不是吗? 谢谢。
答案 0 :(得分:0)
激活记录的布局取决于实现。查看使用记录的伪代码应该让您知道示例是否正确。哪个记录的 top / bottom 取决于实现(我将使用 top ,如下所示,尽管它是底部给我)。
在示例中,指向记录的另一端(“顶部”)是不必要的,因为这些地址始终位于STACK[DYNAMIC_LINK_ADDRESS]+1
。
V
示例中的例程没有定义参数或局部变量,这使得很难想象如何使用激活记录。
如果每个例程定义了X
和Y
变量,那么堆栈可能看起来像下面的伪表,动态链接和静态链接都指向可以在其中找到参数和变量的位置。使用正偏移进行堆叠(当变量为局部变量或非局部变量时使用相同的偏移量; A.X
在A的激活记录上为+02
。
N-17: DL -> 12
N-16: SL -> 07
N-15: B.X
N-14: B.Y
N-13: RET C
N-12: DL -> 07
N-11: SL -> 07
N-10: C.X
N-09: C.Y
N-08: RET A
N-07: DL -> 02
N-06: SL -> 02
N-05: A.X
N-04: A.Y
N-03: RET BITSUB
N-02: BIGSUB.X
N-01: BIGSUB.Y