Что такое 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.