Ich lese "Computer Systems: A Programmer Perspective", erklärt Kapitel 3 mov
Anweisung und Erklärung geben in einem Buch verwirrt mich.mov Anweisungen & Register - Verwirrung!
geben eine Funktion (Seite 142 1 Ausgabe)
int exchange(int *xp, int y)
{
int x = *xp;
*xp = y;
return x;
}
Assembly Code Körpers Funktion
movl 8(%ebp), %eax //Get xp
movl 12(%ebp), %edx //Get y
movl (%eax), %ecx //Get x at *xp
movl %edx, (%eax) //Store y at *xp
movl %ecx, %eax //Set x as return value
Was mich verwirrt, ist, was gespeichert werden soll, und wo
Hier wie ich das verstehe:
movl 8(%ebp), %eax //Get xp
CPU bewegt sich +8 Bytes den Stack hinauf (vom Frame-Pointer %ebp
), nimmt den an dieser Stelle gespeicherten Wert und speichert diesen Wert im Register %eax
(zur Betonung - speichert den Wert, nicht die Adresse)
Ich habe Recht? Danke!
SEHR wahr ...... – ruslik
Mit anderen Worten, weil '% ebp' den Zeiger speichert, verwenden wir Klammern um seinen Namen, um anzugeben, dass wir den gespeicherten Wert +8 Bytes von'% ebp' erhalten. In diesem Fall enthält '8 (% ebp)' den Zeiger '* xp'. Später, in der Zeile 'movl (% eax),% ecx', werden' xp' auf die gleiche Weise dereferenziert wie in der ersten Zeile des Assembler-Codes. – newprint
Jetzt wird alles gestreckt. Parenthesis war die Quelle der Verwirrung! Vielen Dank ! – newprint