10 Stimmen

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

Ich untersuche den von GCC generierten Assembler-Code. Aber ich verstehe das nicht:

movl $0x2d, 0x4(%esp)

Was bedeutet im zweiten Operanden 0x4 für eine Offset-Adresse steht? Und was ist die Verwendung des Registers EAX?

1 Stimmen

Das bedeutet, dass memory[ESP_REG + 4] = 0x2d;

15voto

paxdiablo Punkte 809679

movl $0x2d, 0x4(%esp) bedeutet, dass der aktuelle Wert des Stapelzeigers ( %esp ), 4 hinzufügen ( 0x4 ) und speichert dann den langen (32-Bit) Wert 0x2d an diesen Ort.

Le site eax Register ist eines der allgemeinen 32-Bit-Register. Die x86-Architektur sieht die folgenden 32-Bit-Register vor:

eax  Accumulator Register
ebx  Base Register
ecx  Counter Register
edx  Data Register
esi  Source Index
edi  Destination Index
ebp  Base Pointer
esp  Stack Pointer

und die Namen und Verwendungszwecke einiger davon gehen auf die Tage des Intel 8080 zurück.

Diese Seite gibt einen guten Überblick über die Intel-Typ-Register. Auf die ersten vier in der obigen Liste kann auch als 16-Bit- oder als zwei 8-Bit-Werte zugegriffen werden. Zum Beispiel:

3322222222221111111111
10987654321098765432109876543210
<-             eax            ->
                <-     ax     ->
                <- ah -><- al ->

Die Zeiger- und Indexregister lassen die Verwendung von 8-Bit-Teilen nicht zu, aber Sie können z. B. die 16-Bit bp .

0 Stimmen

+1 - Es handelt sich um die AT&T-Notation und nicht um die Intel-Notation, die von gcc ausgegeben wird, d.h. Source und Dest sind in der Intel-Notation vertauscht

0 Stimmen

Und die Intel-Notation erfordert keine Feldlänge für den Operator, d. h. mov, nicht movl. Aber, sehr informative Antwort - +1.

4voto

kennytm Punkte 488916

0x4(%esp) bedeutet *(%esp + 4) donde * bedeutet Dereferenzierung.

Die Anweisung bedeutet, dass der unmittelbare Wert 0x2d in eine lokale Variable gespeichert wird, die den vierten Offset auf dem Stack belegt.

(Der Code, den Sie gezeigt haben, ist in AT&T-Syntax. In Intel-Syntax würde er lauten mov [esp, 4], 2dh )

1voto

Eli Bendersky Punkte 246100

0x4 im zweiten Operanden ist ein Offset vom Wert des Registers in den Parens. EAX ist ein Allzweckregister, das für die Assembler-Kodierung (Berechnungen, Speicherung temporärer Werte usw.) verwendet wird. Formal heißt es "Akkumulatorregister", aber das ist eher historisch als relevant.

Sie können lesen このページ über die x86-Architektur. Am relevantesten für Ihre Frage sind die Abschnitte über Adressierungsarten y Register für allgemeine Zwecke

1voto

t0mm13b Punkte 33393

GCC-Assembler-Operanden folgen einem Byte (b), Wort (w), Long (l) und so weiter wie :

movb
movw
movl

Den Registern ist ein Prozentzeichen (%) vorangestellt.

Konstanten wird ein Dollarzeichen ($) vorangestellt.

In dem obigen Beispiel in Ihrer Frage bedeutet das den 4. Offset vom Stapelzeiger (esp).

Ich hoffe, das hilft, Mit freundlichen Grüßen, Tom.

1voto

Sie greifen auf etwas zu, das vier Bytes von der Stelle entfernt ist, an der sich der Stapelzeiger befindet. Im GCC ist dies ein Parameter (ich glaube, ein positiver Offset ist ein Parameter und ein negativer eine lokale Variable, wenn ich mich richtig erinnere). Mit anderen Worten: Sie schreiben den Wert 0x2D in einen Parameter. Wenn Sie mehr Kontext angeben würden, könnte ich Ihnen wahrscheinlich sagen, was in der ganzen Prozedur vor sich geht.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X