Question

Je suis en train de faire une boucle dans masm32 sous Windows Vista, mais je l'ai fait de cette façon et même si elle se termine en fait la boucle, il se bloque et je ne vois aucune raison évidente ... des idées?

.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

Modifier

Avez-

invoke StdOut, offset ProgramText

... crashes encore

Était-ce utile?

La solution

Vous devez avoir une « sortie » pour mettre fin à votre application. En outre, mon style personnel est de mettre tout à l'intérieur d'un sous-programme, mais qui est juste moi.

quelque chose comme:
.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

Autres conseils

Il me semble que l'ordre de vos instructions est erroné. Vous faites une comparaison, puis un décrément, puis un saut conditionnel. Vos valeurs de drapeau de la comparaison pourraient éventuellement être modifiés par le décrément.

  loop_start:

  invoke StdOut, addr ProgramText
  cmp loop_stopper, 0 
  dec loop_stopper
  jg loop_start

  ret

Quand je faisais la programmation de montage, je l'ai fait de cette façon. Décrémenter le compteur, puis en boucle si non nul

 loop_start:

  invoke StdOut, addr ProgramText

  dec loop_stopper
  jnz loop_start

  ret

Bien sûr, en fonction du processeur, vous pourriez mettre la boucle variable dans un registre qui vous permet de décrémenter et boucle à l'aide d'une seule instruction. (Par exemple l'instruction Z80 « de djnz ». Je ne me souviens pas de retour jusque-là qui était en fait l'enregistrer, si le registre « B » semble sonner une cloche).

En outre, comme d'autres ont suggéré, vous ne semblez pas nettoyer votre espace mémoire. La plupart des programmes sont en fait « appels » à votre code. Par conséquent, vous devez conserver les pointeurs de code et la pile de sorte que vous faites une gracieuse « retour » à la partie appelant du système d'exploitation. Si vous ne l'avez pas fait, votre « retour » peut vous emmener là où le haut de la pile arrive à pointer, généralement avec des conséquences désastreuses.

ClubPetey est juste. MASM ne produit pas un epiloge pour votre code. Ainsi, le processeur continue l'exécution de ce qu'il trouve derrière la dernière instruction écrite. sortie demande explicitement le système d'exploitation pour arrêter l'exécution du programme.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top