【发布时间】:2017-11-06 10:38:59
【问题描述】:
在编译课程中我看到:ARP(活动记录指针??或激活记录指针??)和:OLD ARP。我了解它是用来获取堆栈中的参数,或者获取局部变量。但我对此不太了解(它像 EBP 寄存器吗?)。而且我也不了解 OLD ARP 的实用性。
下面是一个例子:
void main(void){
f(0);
}
void f(int n){
int m;
int [2] tab;
m=n;
}
和 f 函数的栈:
|///////////|
|-----------|
| n:0 |
|-----------|
| @retour |
|-----------|
| OLD ARP | // <---- ARP
|-----------|
| m |
|-----------|
| tab | // pointing on the case : "tab[0]"
|-----------|
| tab[0] |
|-----------|
| tab[1] |
|-----------|
|///////////|
从 C 生成的伪代码:
main:
PUSH 0
CALL f
RET
f:
PUSH ARP //--------------------------|
ARP=SP |
SP = SP - nb_temp*w // with w = word | PRELUDE
//ALLOC array //---------------------|
[ARP-w]=[ARP+2w]
SP=ARP //----------------------------|
POP ARP | POSTLUDE
RET 1*w //---------------------------|
【问题讨论】:
-
听起来你在谈论保存的帧指针......我从来没有听说过它被称为ARP......可能是因为ARP几乎只用于网络并且什么都没有与此有关。
-
wammder,课程是什么,有网站或书籍吗? ARP 在书 books.google.com/…" (Cooper, Engineering a Compiler, 2004, 155860698X) 中用作“激活记录指针”。
-
这是一个朋友给我的纸质课程,但他不记得了。谢谢你的链接。
-
我认为 激活记录 是 IBM 术语。我听说使用它的唯一人是我们在 IBM 工作的老数据库教授。今天,更常用的术语是堆栈帧。
标签: assembly compilation stack pseudocode activation-record