【问题标题】:What is the ARP (Active Recording Pointer)?什么是 ARP(活动记录指针)?
【发布时间】: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


【解决方案1】:

ARP 代表激活记录指针。在 x86 中,它是 EBP 寄存器。

ARP 用于跟踪最近的功能激活记录在哪里。每当进行新的函数调用时,都会将 ARP 的旧值添加到新的激活记录中,然后更新 ARP 以指向它。每当一个函数返回时,ARP 的旧值就会从它当前指向的激活记录中恢复,因此它现在指向父函数。

在例子中,f的激活记录中的OLD ARP指向main的激活记录。这让 ARP 在 f 完成后恢复指向 main。

【讨论】:

  • 将这个不寻常的(对于 x86 的)术语翻译成更标准的“帧指针”(EBP)和“堆栈帧”是很有用的.同样重要的是,在现代调用约定/ABI 中,使用 RBP/EBP 作为帧指针是可选的。
猜你喜欢
  • 2015-07-31
  • 2010-11-27
  • 2011-05-19
  • 1970-01-01
  • 1970-01-01
  • 2012-07-15
  • 2013-03-07
  • 1970-01-01
相关资源
最近更新 更多