什么是静态链接用于?

时间:2015-01-03 17:03:01

标签: assembly mips

(在出现任何误解之前,我谈论图书馆的联系。)

在我的教科书(关于MIPS组装)中,陈述如下:

  

程序/功能框架(又名激活记录)

     
      
  • 某些编译器用于管理堆栈存储
  •   
  • 除了堆栈指针外,还可以使用帧指针寄存器$ fp   跟踪有关堆栈的所有相关信息   过程/函数调用。
  •   
     

来电方:

     
      
  • 调用者在堆栈上推送参数   (如果不超过4个参数,则通过$ a0 - $ a3传递它们)
  •   
  • 调用者在堆栈上保留空间以获取返回值   (或通过$ v0 - $ v1返回)
  •   
  • 来电者传递静态链接(最近的堆栈上的地址)   发生下一个词汇封闭程序/功能)   通过$ v0
  •   
     

(继续关于被叫方等......)

我很难理解MIPS(帧指针等)中的动态链接,因为 我无法找出为什么需要那个。最终我found out根本不需要它们,它只是在调试时派上用场。

我对这些静态链接感觉相似,有人可以向我解释它们的用途(最好用一个例子)吗?

2 个答案:

答案 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'。