Pregunta
Estoy tratando de hacer un bucle en masm32 se ejecuta en Windows Vista, sin embargo lo hice de esta manera ya pesar de que en realidad termina el bucle, se bloquea y no veo ninguna razón obvia por ... alguna idea?
.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
Editar
¿Se
invoke StdOut, offset ProgramText
todavía se bloquea ...
Solución
Es necesario tener una "salida" para poner fin a su aplicación. Además, mi estilo personal es poner todo dentro de una subrutina, pero eso es sólo yo.
algo como:
.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
Otros consejos
Me parece que el orden de las instrucciones es erróneo. Usted hace una comparación, a continuación, un decremento, a continuación, un salto condicional. Sus valores de la bandera de de la comparación, posiblemente, podrían ser alterados por el decremento.
loop_start:
invoke StdOut, addr ProgramText
cmp loop_stopper, 0
dec loop_stopper
jg loop_start
ret
Cuando estaba haciendo de programación en ensamblador, lo hice de esta manera:. Disminuir el contador, entonces bucle si no es cero
loop_start:
invoke StdOut, addr ProgramText
dec loop_stopper
jnz loop_start
ret
Por supuesto, dependiendo del procesador, que pueden ser causa del bucle variable en un registro que le permite para disminuir y bucle que utiliza una sola instrucción. (Por ejemplo el Z80 'djnz' instrucción. No puedo recordar de nuevo tan lejos que registran lo que realmente era, a pesar de la 'B' registro parece sonar una campana).
Además, como algunos han sugerido, no se presenta para ser la limpieza de su espacio de memoria. La mayoría de los programas son en realidad 'llama' a su código. Por lo tanto necesita conservar códigos y punteros de pila de modo que lo hace un "retorno" gracia a la parte llamante del sistema operativo. Si no lo ha hecho, su 'VUELTA' te puede llevar a donde la parte superior de la pila pasa a estar apuntando, por lo general con consecuencias desastrosas.
ClubPetey es correcto. MASM no genera un epiloge para su código. Por lo que el procesador continúa la ejecución de lo que se encuentra detrás de la última instrucción escrita. pide explícitamente la salida del sistema operativo para detener la ejecución del programa.