movl
bedeutet, dass der aktuelle Wert des Stack-Zeigers ( %esp
x2d, 0x4(%esp)0x4
) genommen wird, 4 ( 0x2d
) hinzugefügt wird und dann der lange (32-Bit) Wert eax
an diesem Ort gespeichert wird.
Das Register bp
ist eines der allgemeinen 32-Bit-Register. x86-Architektur gibt die folgenden 32-Bit-Register an:
und die Namen und Zwecke von einigen von damals zurück zu den Tagen des Intel 8080.
Diese Seite gibt einen guten Überblick über die Register des Intel-Typs. Auf die ersten vier von denen in der obigen Liste kann auch als ein 16-Bit- oder zwei 8-Bit-Werte zugegriffen werden. Zum Beispiel:
%Vor%Die Pointer- und Indexregister erlauben nicht die Verwendung von 8-Bit-Teilen, aber Sie können zum Beispiel die 16-Bit %code% haben.
0x4(%esp)
bedeutet *(%esp + 4)
wobei *
die Dereferenzierung bedeutet.
Die Anweisung bedeutet, dass der unmittelbare Wert 0x2d in eine lokale Variable gespeichert wird, die den 4. Offset auf dem Stapel belegt.
(Der Code, den Sie gezeigt haben, ist in der AT & amp; T-Syntax. In der Intel-Syntax wäre es mov [esp, 4], 2dh
)
0x4
im zweiten Operanden ist ein Offset vom Wert des Registers im Parens. EAX
ist ein Allzweckregister, das für die Assemblercodierung (Berechnungen, temporäre Werte usw.) verwendet wird. Es heißt formal "Accumulator register", aber das ist eher historisch als relevant.
Sie können diese Seite über die x86-Architektur lesen. Am wichtigsten für Ihre Frage sind die Abschnitte zu Adressierungsmodi und Allzweckregister
GCC-Assembly-Operanden folgen einem Byte (b), einem Wort (w), einem langen (l) und so weiter wie:
%Vor%Registern wird ein Prozentzeichen (%) vorangestellt.
Konstanten haben ein vorangestelltes Dollarzeichen ($).
Im obigen Beispiel in Ihrer Frage bedeutet das den 4. Offset vom Stapelzeiger (esp).
Hoffe, das hilft, Freundliche Grüße, Tom.
Sie greifen auf vier Bytes zu, die von dem Stapelzeiger entfernt wurden. In GCC zeigt dies einen Parameter an (ich denke - positiver Offset ist Parameter und negativ sind lokale Variablen, wenn ich mich richtig erinnere). Sie schreiben mit anderen Worten den Wert 0x2D in einen Parameter. Wenn Sie mehr Kontext geben, könnte ich Ihnen wahrscheinlich sagen, was in der ganzen Prozedur vor sich ging.