Was macht 0x4 in "movl $ 0x2d, 0x4 (% esp)"?

8

Ich untersuche den Assembly-Code, der von GCC generiert wurde. Aber ich verstehe nicht:

%Vor%

Wofür steht 0x4 im zweiten Operanden? Offsetadresse? Und was die Verwendung von Register EAX?

    
martin 05.03.2010, 12:35
quelle

5 Antworten

13

movl %espx2d, 0x4(%esp) bedeutet, dass der aktuelle Wert des Stack-Zeigers ( 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:

%Vor%

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.

    
paxdiablo 05.03.2010, 12:44
quelle
3

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 )

    
kennytm 05.03.2010 12:40
quelle
1

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

    
Eli Bendersky 05.03.2010 12:37
quelle
1

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.

    
t0mm13b 05.03.2010 12:39
quelle
1

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.

    
JUST MY correct OPINION 05.03.2010 12:43
quelle

Tags und Links