Frage
Ich versuche, eine Schleife in masm32 unter Windows Vista laufen zu machen, aber ich habe es auf diese Weise, und obwohl es eigentlich die Schleife beendet, es stürzt ab und ich sehe keinen offensichtlichen Grund, warum ... irgendwelche Ideen?
.386
.model flat, stdcall
option casemap :none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\masm32.inc
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\masm32.lib
.data
ProgramText db "Looping!", 0
.data?
loop_stopper dd ?
.code
start:
mov loop_stopper,2
loop_start:
invoke StdOut, addr ProgramText
cmp loop_stopper, 0
dec loop_stopper
jg loop_start
end start
Bearbeiten
Haben
invoke StdOut, offset ProgramText
noch abstürzt ...
Lösung
Sie müssen eine „Exit“, um Ihre Anwendung zu beenden. Auch mein persönlicher Stil ist alles in einem Unterprogramm zu setzen, aber das ist nur meine Meinung.
so etwas wie:
.code
start:
call main
inkey
exit
main proc
mov loop_stopper,2
loop_start:
invoke StdOut, addr ProgramText
cmp loop_stopper, 0
dec loop_stopper
jg loop_start
ret
main endp
end start
Andere Tipps
scheint mir die Reihenfolge der Befehle falsch ist. Sie tun einen Vergleich, dann eine Abnahme, dann ein bedingter Sprung. Ihre Flag-Werte aus dem Vergleich könnten möglicherweise durch die Abnahme geändert werden.
loop_start:
invoke StdOut, addr ProgramText
cmp loop_stopper, 0
dec loop_stopper
jg loop_start
ret
Wenn ich Assembler-Programmierung tat, tat ich es so:. Dekrementieren die Zähler, dann Schleife, wenn nicht Null
loop_start:
invoke StdOut, addr ProgramText
dec loop_stopper
jnz loop_start
ret
Natürlich abhängig von dem Prozessor, können Sie das Loop-Variable in einem Register setzen, die Ihnen einen einzigen Befehl zu verringern und Schleife ermöglicht. (Zum Beispiel der ‚DJNZ‘ Z80-Befehl. Ich kann nicht so weit zurück erinnern, welche registrieren war es eigentlich, wenn auch die ‚B‘ Register scheint eine Glocke zu läuten).
Wie auch einige andere vorgeschlagen haben, scheinen Sie nicht Ihren Speicherplatz zu bereinigen. Die meisten Programme sind eigentlich ‚FORDERT‘, um Ihren Code. Daher müssen Sie Code und Stapelzeiger erhalten, so dass Sie ein anmutiges „RETURN“ an den anrufenden Teil des Betriebssystemes zu tun. Wenn Sie das nicht getan haben, Ihr ‚RETURN‘ können Sie nehmen, wohin die Spitze des Stapels geschieht zu zeigen, in der Regel mit katastrophalen Folgen.
ClubPetey ist richtig. MASM keine Epiloge für Ihren Code erzeugen. So ist der Prozessor setzt die Ausführung dessen, was es findet hinter der letzten schriftlichen Anweisung. Exit explizit fragt das Betriebssystem das Programm beenden ausgeführt wird.