Ich und ein paar Freunde fummeln an einem sehr seltsamen Thema. Wir haben einen Crash in unserer Anwendung innerhalb eines kleinen Assembler-Teils (der den Prozess beschleunigt) entdeckt. Der Fehler verursacht wurde, indem er mit dem Stackpointer Hantieren und nicht am Ende zurückzusetzen, sah es wie folgt aus:Verständnis ASM. Warum funktioniert das in Windows?
push ebp
mov ebp, esp
; do stuff here including sub and add on esp
pop ebp
Wenn es richtig sollte es wie folgt geschrieben werden:
push ebp
mov ebp, esp
; do stuff here including sub and add on esp
mov esp,ebp
pop ebp
Nun, was unser Mindbreak ist: Warum funktioniert das in Windows? Wir haben den Fehler gefunden, als wir die Anwendung auf Linux portiert haben, wo wir auf den Absturz gestoßen sind. Weder bei Windows noch bei Android (mit dem NDK) traten Probleme auf und wir hätten diesen Fehler nie gefunden. Gibt es eine Stackpointer-Wiederherstellung? Gibt es einen Schutz gegen Missbrauch des Stackpointers?
Änderungen sind auf 'esp' aus balancieren soll? Wenn 'add's und' pop' die "sub's" und 'push's ausbalancieren, dann' esp == ebp' schon, dann sollten Sie das 'mov esp, ebp' weglassen (weil es nicht benötigt wird). Wenn es abstürzt, dann balancieren sie offensichtlich nicht aus. Verwenden Sie den gleichen Assembler unter Windows und Linux? Verschiedene Assembler werden die gleiche Quelle für unterschiedlichen Code zusammenstellen. (z.B. in NASM, 'mov reg, symbol 'ist' mov reg, imm32', aber in MASM ist es eine Last.) Die ABIs sind auch für 32 Bit leicht unterschiedlich. –
Ist dieser Assembler in einer separaten Datei oder inline? –
@PeterCordes: Nein, sie balancieren nicht aus. Unter Linux ist mein Stackpointer komplett abgehört – Nidhoegger