ich mein Lehrbuch zu lesen und es hat Code für eine Swap-Funktion:Pointer Deferencing in x86-Assembler-Code
In C:
int exchange(int *xp, int y) {
int x = *xp;
*xp = y;
return x;
}
In x86 Assembly mit Anmerkungen:
// 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
Wenn also int * xp auf ein int I an der Adresse A zeigt, speichert die erste Zeile des Assemblercodes A at% edx. Dann wird es in der zweiten Zeile dereferenziert und bei% eax gespeichert.
Wenn das wahr ist, frage ich mich, warum Linie 1 "8 (% ebp)" den Zeiger nicht dereferenziert und das int I in% edx statt der Adresse A speichert? Sind das nicht die Klammern in der Montage?
Oder bedeutet das, dass, wenn Zeiger auf den Stapel geschoben werden, die Adresse des Zeigers geschoben wird, anstatt den Wert, den es enthält, also 8 (% ebp) technisch & XP?
Ich wollte nur klären, ob mein Verständnis korrekt war.
Ebp ist eine Adresse des Stapelrahmens, in der alle Argumente sind. Ebp + 8 ist eine Adresse des Wertes von xp (das ist die Adresse von int). Technisch ja - ebp + 8 == & xp. – user3125367
* bedeutet das, dass, wenn Zeiger auf den Stapel geschoben werden, die Adresse des Zeigers angestoßen wird und nicht der Wert, den es enthält * - Und nein, ein Zeigerwert wird auf den Stapel geschoben. – user3125367