(在出现任何误解之前,我不谈论图书馆的联系。)
在我的教科书(关于MIPS组装)中,陈述如下:
程序/功能框架(又名激活记录)
- 某些编译器用于管理堆栈存储
- 除了堆栈指针外,还可以使用帧指针寄存器$ fp 跟踪有关堆栈的所有相关信息 过程/函数调用。
来电方:
- 调用者在堆栈上推送参数 (如果不超过4个参数,则通过$ a0 - $ a3传递它们)
- 调用者在堆栈上保留空间以获取返回值 (或通过$ v0 - $ v1返回)
- 来电者传递静态链接(最近的堆栈上的地址) 发生下一个词汇封闭程序/功能) 通过$ v0
(继续关于被叫方等......)
我很难理解MIPS(帧指针等)中的动态链接,因为 我无法找出为什么需要那个。最终我found out根本不需要它们,它只是在调试时派上用场。
我对这些静态链接感觉相似,有人可以向我解释它们的用途(最好用一个例子)吗?
答案 0 :(得分:3)
在可以在函数内声明函数的语言中需要静态链接,词法封闭范围或静态父级。 例如,在以下伪代码中
int foo(int s, int t) {
int x;
...
int bar(int a) {
return a + x;
}
}
在bar
中,相对于静态链接访问变量x
。
使用堆栈框架布局
------------------------
arg 1: s
arg 2: t
return address
local variable: x
...
-------------------------
假设所有人都有32位值,x
中访问bar
的地址为static_link + 12
答案 1 :(得分:0)
这是关于范围的。有些语言允许函数嵌套在函数中;在那些静态链接是一个链接到包含该语言的函数的堆栈帧。它被称为静态链接,因为它将链接的内容在完整性中已知(尽管不完全在哪里,因为它将在堆栈的任何位置,父函数建立其框架)。
与动态链接进行比较和对比,动态链接始终指向上面的堆栈帧。这是动态的,因为(通常)许多函数中的任何一个都可能调用了,因此在编译时不知道哪个函数拥有指向的帧的实例。
想象一个函数F,子函数Fa,Fb,Fc。 F调用Fa,Fa调用Fb,Fb调用Fc。 Fa,Fb和Fc都可以根据语言的语义访问F的本地存储。
然后Fa的动态和静态链接将指向与F相关联的堆栈帧。
Fb的动态链接将指向Fa的框架;它的静态链接将指向F'。
Fc的动态链接将指向Fb的帧;它的静态链接将指向F'。