Nicht ganz. Ich sehe mich bestätigt, dass ich den Stack vollgemüllt habe. Aber leider habe ich keine Ahnung, wie ich das gerade biegen könnte.
Ich muss ja, meiner Meinung nach, den Stack clearen. Aber wie mache ich das?
Eine Änderung von
zu
führt zu einem Fehler. Ich liege doch damit richtig, dass ich den Stack "sauber" halten muss, oder? Oder missverstehe ich das?
edit:
Achso, es müsste
heißen, nicht
Zumindest funktioniert das. Ich hoffe das ist korrekt.
Ich dachte imull speichert es in dem ersten Register.
edit2:
Also während ich bei add und sub stets mit dem höchsten Offset arbeiten kann (also in dem Beispiel 12 -> 12(%esp)) muss ich bei imull darauf achten, mit dem vorherigen, also 8(%esp) zu arbeiten. Kann man das so sagen?
In meiner Assembler Klasse würde dann das ganze folgendermaßen aussehen:
Code: Alles auswählen
void add() {
::add(_buf, ESP, EAX, _stackSize);
::add(_buf, 4, ESP); // restore Stack Pointer - pop ginge auch
}
void sub() {
::sub(_buf, EAX, ESP, _stackSize);
::pop(_buf, EAX);
}
void mul() {
::mul(_buf, ESP, EAX, _stackSize - 4); // -4 statt wie oben einfach _stackSize
::add(_buf, 4, ESP); // restore Stack Pointer - pop ginge auch
}
Die globalen Operationen add, sub, pop und mul leiten einfach die Assembler Entsprechung mit dem jeweiligen Registern in ein std::ostream.
_stackSize wiederum ist der höchste Wert/Offset. Jedesmal wenn wir eine Variable speichern, steigt er um 4, damit wir am Ende vor dem eigentlichen Programm den Speicher mit subl $_stacksize anfordern können (und hinterher natürlich genauso wieder freigeben).