static link 有什么用?
What is the static link used for?
(在出现任何误解之前,我不是谈论库的链接。)
在我的教材(关于MIPS汇编)中,是这样说的:
Procedure/Function frame (aka activation record)
- Used by some compilers to manage stack storage
- In addition to Stack Pointer, use Frame Pointer register $fp
to keep track of all pertinent information on the stack pertaining
to a procedure/function invocation.
Caller side:
- Caller pushes arguments on the stack
(or passes them via $a0 - $a3 if not more than 4 arguments)
- Caller reserves space on the stack for return values
(or they are returned via $v0 - $v1)
- Caller passes static link (address on the stack of the nearest
occurrence of the next lexically enclosing procedure/function)
via $v0
(goes on about callee side etc...)
我很难理解 MIPS 中的动态链接(帧指针等),因为
我不知道为什么需要那个。最终我found out根本不需要它们,它只是在调试时派上用场。
我对这些静态链接的感觉很相似,谁能给我解释一下它们的用途(最好有例子)?
这是关于范围的。有些语言允许函数嵌套在函数中;在那些中,静态 link 是 link 直到包含该语言的函数的堆栈帧。它被称为静态 link 是因为它 link 在完成时是已知的(尽管不是确切的位置,因为它会在父函数建立其框架的堆栈中的任何位置)。
与动态的link进行对比对比,它始终只指向上面的栈帧。这是动态的,因为(通常)可能调用了许多函数中的任何一个,因此在编译时不知道哪个函数拥有指向的框架的实例。
想象一个函数 F,具有子函数 Fa、Fb、Fc。 F调用Fa,Fa调用Fb,Fb调用Fc。 Fa、Fb、Fc都可以根据语言的语义访问F的本地存储。
那么Fa的动态和静态links会指向一个与F关联的栈帧
Fb的动态link会指向Fa的框架;它的静态 link 将指向 F。
Fc的动态link会指向Fb的框架;它的静态 link 将指向 F。
在可以在函数内部声明函数的语言中需要静态 link、词法封闭范围或静态父级。
例如,在下面的伪代码中
int foo(int s, int t) {
int x;
...
int bar(int a) {
return a + x;
}
}
在bar
中,变量x
相对于静态link被访问。
用栈帧布局
------------------------
arg 1: s
arg 2: t
return address
local variable: x
...
-------------------------
假设所有的值都是 32 位,在 bar
中访问 x
的地址将是 static_link + 12
(在出现任何误解之前,我不是谈论库的链接。)
在我的教材(关于MIPS汇编)中,是这样说的:
Procedure/Function frame (aka activation record)
- Used by some compilers to manage stack storage
- In addition to Stack Pointer, use Frame Pointer register $fp to keep track of all pertinent information on the stack pertaining to a procedure/function invocation.
Caller side:
- Caller pushes arguments on the stack (or passes them via $a0 - $a3 if not more than 4 arguments)
- Caller reserves space on the stack for return values (or they are returned via $v0 - $v1)
- Caller passes static link (address on the stack of the nearest occurrence of the next lexically enclosing procedure/function) via $v0
(goes on about callee side etc...)
我很难理解 MIPS 中的动态链接(帧指针等),因为 我不知道为什么需要那个。最终我found out根本不需要它们,它只是在调试时派上用场。
我对这些静态链接的感觉很相似,谁能给我解释一下它们的用途(最好有例子)?
这是关于范围的。有些语言允许函数嵌套在函数中;在那些中,静态 link 是 link 直到包含该语言的函数的堆栈帧。它被称为静态 link 是因为它 link 在完成时是已知的(尽管不是确切的位置,因为它会在父函数建立其框架的堆栈中的任何位置)。
与动态的link进行对比对比,它始终只指向上面的栈帧。这是动态的,因为(通常)可能调用了许多函数中的任何一个,因此在编译时不知道哪个函数拥有指向的框架的实例。
想象一个函数 F,具有子函数 Fa、Fb、Fc。 F调用Fa,Fa调用Fb,Fb调用Fc。 Fa、Fb、Fc都可以根据语言的语义访问F的本地存储。
那么Fa的动态和静态links会指向一个与F关联的栈帧
Fb的动态link会指向Fa的框架;它的静态 link 将指向 F。
Fc的动态link会指向Fb的框架;它的静态 link 将指向 F。
在可以在函数内部声明函数的语言中需要静态 link、词法封闭范围或静态父级。 例如,在下面的伪代码中
int foo(int s, int t) {
int x;
...
int bar(int a) {
return a + x;
}
}
在bar
中,变量x
相对于静态link被访问。
用栈帧布局
------------------------
arg 1: s
arg 2: t
return address
local variable: x
...
-------------------------
假设所有的值都是 32 位,在 bar
中访问 x
的地址将是 static_link + 12