静态链接有什么用?

Eve*_*len 5 assembly mips

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

在我的教科书(关于 MIPS 汇编)中,说明了以下内容:

过程/函数框架(又名激活记录)

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

来电方:

  • 调用者将参数压入堆栈(如果不超过 4 个参数,则通过 $a0 - $a3 传递它们)
  • 调用者在堆栈上为返回值保留空间(或者它们通过 $v0 - $v1 返回)
  • 调用者通过 $v0传递静态链接(堆栈上最近出现的下一个词法封闭过程/函数的地址)

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

我很难理解 MIPS 中的动态链接(帧指针等),因为我不知道为什么需要它。最终我发现根本不需要它们,它只是在调试时派上用场。

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

drR*_*rtz 5

在可以在函数内声明函数的语言中,需要静态链接、词法封闭作用域或静态父级。例如,在下面的伪代码中

int foo(int s, int t) {
    int x;
    ... 
    int bar(int a) {
        return a + x;
    }
}
Run Code Online (Sandbox Code Playgroud)

in bar,该变量x是相对于静态链接访问的。

使用堆栈框架布局

------------------------
arg 1: s
arg 2: t
return address
local variable: x
... 
-------------------------
Run Code Online (Sandbox Code Playgroud)

假设所有的值都是 32 位,则访问xin的地址 bar将是static_link + 12