mov-Anweisungen & Register - Verwirrung !
Lese ich "Computer Systems: A Programmer 'Perspektive", in Kapitel 3 erläutert mov
Anleitung und Erklärung geben, in einem Buch die mich verwirrt.
geben Sie eine Funktion (Seite 142 1 s edition)
int exchange( int *xp, int y)
{
int x = *xp;
*xp = y;
return x;
}
Assembler-code der Funktion, den Körper
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 ist, wie ich dies verstehen:
movl 8(%ebp), %eax //Get xp
CPU bewegt +8 Byte in den stack(von frame-pointer %ebp
), nimmt der Wert gespeichert, der an dieser Stelle, und speichert diesen Wert in das register %eax
(zu Schwerpunkt - speichert den Wert, nicht die Adresse)
Hab ich Recht ?
Danke !
Du musst angemeldet sein, um einen Kommentar abzugeben.
Yeah, es klingt wie Sie haben es richtig. IMHO, die AT&T
8(%ebp)
syntax ist weniger intuitiv als die Intel[ebp+8]
das ist klar. Die Klammern zeigen, dass Sie mit dem Wert an der Adresse in das register und die Nummer ist die offset-Adresse, die Sie eigentlich wollen.%ebp
speichert Zeiger, die wir verwenden Klammern um seinen Namen, um anzugeben, dass wir den gespeicherten Wert +8bytes Weg von%ebp
. In diesem Fall8(%ebp)
enthält Zeiger*xp
. Später, in Zeilemovl (%eax), %ecx
wir sind dereferenzierenxp
gleichen Art und Weise wie wir in der ersten Zeile der Assembler-codeJa, das ist mit AT&T-syntax, die ist von der form:
Intel assembly ist in umgekehrter Reihenfolge.
Sind Sie auch zu Recht über die
8(%ebp)
bewegen 8 bytes vom frame-pointer. Der Grund, es bewegt sich 8 bytes, speziell, weil die Parameter auf dem Stapel in umgekehrter Reihenfolge ("rechts" auf "Links", wenn man bei einem normalen Funktionsaufruf). Soy
geschoben wurde, zuerst, dannxp
und schließlich die Rückkehr-Adresse des aufrufenden Funktion (das ist, warum Sie sich bewegen 8 Byte statt 4).Müssen Sie verstehen, was ist ein stack-frame. Erfahren Sie, was genau
push
undpop
Anweisungen tun.Vor diesem code, es war ein