2010-03-17 14 views
10

So bin ich etwas verwirrt über das Zeichnen eines Stack-Frame für meine Assembler-Code. Ich habe das Gefühl, dass ich falsch angefangen habe.Zeichnen eines Stack-Frame für x86-Assembly

Hier ist, was ich bis jetzt bekommen habe, aber wie Sie sehen können, bin ich in Schritt 5 verwirrt, weil ich denke, dass mein ursprüngliches Layout falsch ist.

enter image description here enter image description here

Können Sie mir sagen, wo ich schief gelaufen?

Antwort

25

Ich denke, ich würde mit einem Diagramm beginnen, das einige (semi-) willkürliche Menge an leerem Raum an der "Spitze" des Stapels zeigt und wahrscheinlich EBP und ESP nach links zeigt, mit Pfeilen, um zu zeigen, wo Sie zeigen auf. Ich habe durchgezogene Pfeile für "Punkte zu" verwendet und für die Datenbewegung gestrichelt (im Nachhinein könnte es besser sein, das umzukehren).

alt text

+0

Wow, das ist cool Diagramm. Welches Programm hast du benutzt, um es zu zeichnen? Ich werde morgen nachsehen - wie mein Gehirn heute Nacht gebraten wird. – drozzy

+3

Mit einem Wort, Vizio. –

+0

Ich gehe davon aus, dass die Diagramme von links nach rechts von oben nach unten ausgerichtet sind. Dann bin ich nicht sicher, wie im dritten Diagramm - Sie haben sowohl EBP und ESP zunächst auf die gleiche Adresse zeigen. Ich meine, im vorherigen Diagramm waren sie anders. – drozzy

2

Der Abstand zwischen dem aktuellen ebp (sobald es von ESP erfasst wird) und y ist in der Tat 8 Bytes in diesem Fall, wie Sie die Rückgabe EIP und den Wert des vorherigen ebp auf dem Stapel haben. Ihr Diagramm ist korrekt von dem, was ich sagen kann, obwohl die linken Adressen verwirrender sind :)

0

Sie haben Recht mit Ihrem Diagramm. Der Compiler verwendet einige Optimierungstricks: der erste Aufruf ist "ganz normal", tatsächlich wird der "f" -Parameter oben auf dem Stapel platziert. Der zweite Aufruf wird nach dem Aufräumen des lokalen Kontextes (Befehl "Verlassen") verschoben und der Parameter der "h" -Funktion wird "recycled", um "2" zu enthalten. Dann wird der zweite "Aufruf" zu "f" zu einem einfachen "jmp", da es die letzte Zeile in der aufrufenden Funktion "h" ist (der Kontext von "h" wurde bereits von "leave" weggeworfen).

Tschüss!

1

Das Diagramm zeigt Parameter unterhalb der Rücksprungadresse, die tatsächlich falsch ist.

Unter der Annahme, dass der Stack zu niedrigeren Adressen wächst, müssen, wenn Parameter auf den Stack gesetzt werden müssen, diese im Vergleich zur Rückgabeadresse an höheren Adressen liegen.