Czytam mój podręcznik i ma kod dla funkcji zamiany:Pointer Deferencing w x86 Kod Zgromadzenie
w C:
int exchange(int *xp, int y) {
int x = *xp;
*xp = y;
return x;
}
W x86 Zgromadzenia z adnotacjami:
// xp is at %ebp + 8, y at %ebp + 12
movl 8(%ebp), %edx // get xp
movl (%edx), %eax // get x at xp
movl 12(%ebp), %ecx // get y
movl %ecx, (%edx) // store y at xp
Tak więc od mojego zrozumienia, jeśli int * xp wskazał na I na adres A, to pierwsza linia kodu złożenia przechowuje A na% edx. Następnie dostaje dereferencji w drugiej linii i przechowywane w% eax.
Jeśli to prawda, zastanawiam się, dlaczego "8 (% ebp) wiersza 1" nie dereferencji wskaźnika, przechowywanie int I w% edx zamiast adresu A? Czy to nie nawiasy w montażu?
Czy to oznacza, że gdy wskaźniki są naciskane na stos, adres wskaźnika jest wciskany zamiast wartości, którą ma, więc 8 (% ebp) technicznie posiada & PD?
Chciałam tylko wyjaśnić, czy moje zrozumienie było prawidłowe.
Ebp to adres ramki stosu, w której znajdują się wszystkie argumenty. Ebp + 8 to adres wartości xp (czyli adres int). Technicznie, tak - ebp + 8 == & xp. – user3125367
* oznacza to, że gdy wskaźniki są wypychane na stos, adres wskaźnika jest wciskany zamiast wartości, którą trzyma * - I nie, wartość wskaźnika jest przesuwana na stos. – user3125367