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

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top