Что такое ARP (указатель активной записи)?

В курсах по компиляции я вижу: ARP (указатель активной записи?? или указатель записи активации??) и: OLD ARP. Я понимаю, что он используется для получения параметров в стеке или для получения локальных переменных. Но я не понимаю больше об этом (это как регистр EBP?). И я тоже не понимаю полезности старого 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 //---------------------------|

0 ответов

ARP означает указатель записи активации. В x86 это регистр EBP.

ARP используется для отслеживания последней записи об активации функции. При каждом вызове новой функции старое значение ARP добавляется к новой записи активации, а затем ARP обновляется, чтобы указать на нее. Каждый раз, когда функция возвращается, старое значение ARP восстанавливается из записи активации, на которую он в данный момент указывает, так что теперь оно указывает на родительскую функцию.

В этом примере OLD ARP в записи активации f указывает на запись активации main. Это позволяет восстановить ARP, чтобы он указывал на main после завершения работы f.

Другие вопросы по тегам