2010-12-09 12 views
1

Ich lerne gerade über den Stapel (x86). Ich weiß, es ist ein Datenstapel, der nach dem LIFO-Prinzip arbeitet. Ich kenne die grundlegenden Operationen in Bezug auf den Stapel sind Push (um einen Wert an der Spitze des Stapels hinzuzufügen) und Pop (um einen Wert zu entfernen). ESP ist der Hinweis darauf, wo wir uns jetzt auf dem Stack befinden. Nun, für das, was ich nicht verstehe:Grundlegende Verwendung Stapel

Beispiel:

Push 4 
    Push ebx 
    Push eax 

Die obigen Anweisungen werden einen Stapel erzeugen, wie folgt:

8 eax <-- ESP 
4 ebx 
0 4 

Mit dem ESP zeigt auf dem letzten Mehrwert eax .

Wenn wir nun diese Anweisungen mit der Pop-Operation erweitern möchten wir etwas bekommen wie:

Push 4 
Push ebx 
Pop ebx 
Push eax 

Die Anweisungen oben führen sollen (wenn ich richtig bin) in Stapeln folgenden (zum ersten drei Befehlen):

4 (ebx) 
0 4 <-- ESP 

Ebx wird vom Stack entfernt und das ESP wurde für 4 Bit nach unten bewegt. Nun den Stapel nach all Anweisungen ausführen:

4 eax <-- ESP 
0 4 

ich alles hoffen, bis hier richtig ist, wenn nicht Kommentare sind mehr als willkommen ;-) jetzt für den Befehl mov edx, [ebx, + 04], beginnend mit dem ersten Stapel in diesem Post. Ist das Ergebnis dieser folgenden:

16 eax 
8 edx <-- ESP 
4 ebx 
0 4 

Es befindet sich auf ebx + 4 Bits en Schreib edx dort startet den vorherigen Wert (EAX) nach oben bewegt wird, oder wird es eax mit edx ersetzen?

Eine zweite Frage ist (mehr allgemein), wie Arrays auf dem Stack initiiert, adressiert und entfernt werden.

Ich entschuldige mich für diese lange Frage, aber ich möchte die (Grundlagen der) Stapel verstehen. Vielen Dank.

+0

Der Vermutungsteil ist korrekt. Die Frage ist jedoch nicht klar. Meinst du "mov edx, [esp + 4]"? – ruslik

+0

Nur um klarzustellen: 'ebx' ist keine Adresse, es ist ein Register. 'push ebx' platziert seinen Inhalt auf den Stapel und nicht auf das Register. '[ebx + 4]' ist nur eine Speicheradresse, die nichts mit Stack zu tun hat. Außerdem ist der Stapel im Speicher (und es ist kontinuierlich!), So dass Sie nicht etwas in der Mitte einfügen können. Es ist ein Array, keine Liste. – ruslik

Antwort

0

Ich hoffe, dass alles hier oben zu korrekt ist, wenn nicht mehr als Kommentare sind willkommen ;-) Jetzt für den Befehl mov edx, [ebx, + 04], von dem in diesem ersten Stapel starten Post. Ist das Ergebnis dieses folgenden:

16 eax 
8 edx <-- ESP 
4 ebx 
0 4 

Es befindet sich auf ebx + 4 Bits en Schreib edx dort startet die vorherige Wert (EAX) nach oben bewegt wird, oder wird es eax mit edx ersetzen?

mov edx, [ebx + 4] den Wert bei [ebx + 4] bewegen (dies ist ein Zeiger Ehrerbietung, und haben nichts mit Ihrem aktuellen Stapel, es sei denn ebx zeigt auf den Stapel zu tun (fortgeschritten: Es wahrscheinlich auf den Stapel zeigen, aber Referenzierung es wird den Stapel in keiner Weise ändern)) in edx. Dies erscheint anders als Ihr Verständnis in mehr als einer Hinsicht.

Denken Sie daran, dass die mov Befehlsparameter als mov DEST, SRC verwendet werden, und nicht umgekehrt.

Zweitens diese mov Betrieb bewegt sich nur um den Wert an [ebx + 4] in edx, und als solche verändert nicht den Stapelzeiger (ESP hier) in keiner Weise. Der Stapel bleibt unverändert gegenüber dem ersten Stapel, auf den Sie hier verweisen. Der Übersichtlichkeit halber bleibt der Stack wie folgt:

Und keiner der Werte auf dem Stapel wurde in irgendeiner Weise geändert.

Auch ich nehme an, Sie sind auf einer 32-Bit-Architektur. In diesem Fall sind Register wie eax und dergleichen 32 Bits (4 Bytes). Bitte beachten Sie, dass dies 4 BYTES und nicht BITS sind.

Ihre "zweite Frage" gehört in einer eigenen separaten Frage hier, mit weiteren Informationen. Viel Glück!

1

Sie Beispiele und Annahmen sind nahezu genau. Das Problem ist, dass der Stapel nach unten wächst. Also, wo Sie Adresse 0 und 4 und 8 haben, machen Sie diese stattdessen 0xF8, 0xF4, 0xF0, usw. Wenn Sie bei den Beschreibungen für die Anweisungen in einem Referenzhandbuch sehen Sie so etwas:

PUSH: Verringert SP durch die Größe des Operanden (zwei oder vier, Bytewerte sind Vorzeichen erweitert) und überträgt ein Wort von der Quelle zum Stapel oben (SS: SP).

so, wenn die sp (esp) an 0xFC zeigen, wenn Sie beginnen, und Sie

 
push 4 
push ebx 
push eax 

Dann wird der Stapel wie folgt aussehen:

 
0xFC 4 
0xF8 (ebx) 
0xF4 (eax) <-- esp 

So [esp + 4] zugreifen könnte macht jetzt mehr Sinn, wenn es den Wert (ebx) abruft, und [esp + 8] ist das unmittelbare 4, das gepusht wurde.

Wenn Sie also einige C-Programme mit lokalen Variablen oder Arrays zu Assembler zerlegen oder kompilieren, werden Sie sehen, dass sie beim Eingeben der Funktion eine Nummer an den Stapelzeiger abziehen, genug, um alle lokalen Variablen abzudecken, dann [ esp + something] ist, wie sie auf diesen Speicher zugreifen, also Initialisierung oder Nullstellung oder was auch immer ist eine einfache Sache von ESP-basierte Adressierung in den Stapel.

0

mov edx, [ebx+04] erhält die Daten an Adresse es: ebx + 04 und legt es in edx. Meinst du vielleicht mov [ebx+04], edx? In diesem Fall wird alles unter der Adresse es:ebx+4 überschrieben. es zeigt auf den Stapel Segment Unter der Annahme, und EBX gleich esp dann wird der Stapel etwas wie folgt aussehen:

12 edx <-- [ebx+4] 
8 edx <-- esp = ebx 
4 ebx 
0 4 
+0

Segment-Register haben keine Bedeutung für die meisten 32-Bit-Betriebssysteme, sie verwenden ein flaches Modell (außer für FS, das in Win32 verwendet wird, um auf einen speziellen Speicherbereich zu zeigen) – ruslik

+0

Wirklich? Ich wusste es nicht .. danke :) – BlackBear

0

Die Frage ist sehr falsch.
push ebx setzt den Wert von ebx10 Register auf dem Stapel, und nicht das Register selbst. Indem Sie den Wert ebx10 auf dem Stack speichern, können Sie ihn nicht als Basis für die Adressierung verwenden. Außerdem gibt es keine Anweisung (oder Möglichkeit) etwas in der Mitte des Speichers "einzufügen". Es ist ein Array und keine dynamische Liste.

Wie ich im Kommentar gesagt habe, denke ich, dass Sie die Grundlagen der Montage nicht verstehen.Lesen Sie über Speichermodell, Register, über grundlegende Anweisungen, schreiben Sie einige Programme.