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 ...

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top