(在出现任何误解之前,我不是在谈论图书馆的联系。)
在我的教科书(关于 MIPS 汇编)中,说明了以下内容:
过程/函数框架(又名激活记录)
- 一些编译器使用它来管理堆栈存储
- 除了堆栈指针之外,还使用帧指针寄存器 $fp 来跟踪堆栈上与过程/函数调用有关的所有相关信息。
来电方:
- 调用者将参数压入堆栈(如果不超过 4 个参数,则通过 $a0 - $a3 传递它们)
- 调用者在堆栈上为返回值保留空间(或者它们通过 $v0 - $v1 返回)
- 调用者通过 $v0传递静态链接(堆栈上最近出现的下一个词法封闭过程/函数的地址)
(继续关于被叫方等......)
我很难理解 MIPS 中的动态链接(帧指针等),因为我不知道为什么需要它。最终我发现根本不需要它们,它只是在调试时派上用场。
我对这些静态链接的感觉很相似,有人可以向我解释它们的用途吗(最好是一个例子)?
在可以在函数内声明函数的语言中,需要静态链接、词法封闭作用域或静态父级。例如,在下面的伪代码中
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