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?
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?
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
.
+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
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
)
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
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.
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 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.
1 Stimmen
Das bedeutet, dass memory[ESP_REG + 4] = 0x2d;