Programación General > ASM (Ensamblador)
Pequeñas Dudas En Programa Basico
(1/1)
krnl64:
Hola a todos.
Estoy empezando en esto del masm32 y codeando un simple programa que te escribe una palabra en la consola y espera a que pulses una tecla para terminar,me han surgido algunas dudas que no consigo resolver.
Les pongo mi code y les cuento:
--- Código: Text --- .386 .model flat, stdcalloption casemap:none include kernel32.incinclude windows.inc includelib kernel32.lib .data ;variables necesarias msg db 'hola',0 buff db ? hout dd ? hin dd ?; handles de e/s tit db 'Consola Demo',0 .code start: call con call pinta push hin call CloseHandle ; Cierro los handles abiertos push hout call CloseHandle call FreeConsole ; Cierro la consola ; Salgo de forma controladapush NULL call ExitProcess con proc ;call AllocConsole; solicito poder crear una consola; Esto sobra porque el programa es de consola push STD_OUTPUT_HANDLE call GetStdHandle; obtendre el handle de la consolamov hout,eax ; copio a hout el handle obtenido push STD_INPUT_HANDLEcall GetStdHandlemov hin,eax ; handle de entrada lea eax,titpush eaxcall SetConsoleTitle ;titulo de la consola ret con endp pinta proc push NULL; nulolea eax,buff; buffer de escriturapush eax; meto el buffer en la pilapush 4;longitud del mensajelea eax,msgpush eax; meto la cadena en la pilapush hout;meto en la pila el handlecall WriteConsole ;llamo a la funcion push NULL push NULL push NULL; los parametros son nulos porque no voy a push NULL; almacenar el dato leido, excepto el handle quepush hin ; es necesariocall ReadConsole ret pinta endp end start
Empiezo a ejecutar y obtengo los handles de E/S de la consola.
Me escribe la palabra hola (esto menos mal que lo hace bien) y espera a que pulse enter, pero en este procedimiento el handle de salida desaparece y en LastError pone ERROR_INVALID_ACCESS.
Cuando regresa a la rutina principal al cerrar los handles, me cierra el handle de entrada pero el de salida no, porque no existe.
FreeConsole y ExitProcess funcionan bien.
Pueden decirme el por qué de estos fallos ? porque estoy buscando info y no consigo averiguarlos.
Creo que el handle de salida de la consola desaparece "solo" porque cumple su funcion y no se va a usar más, pero no estoy muy seguro.
Espero que me puedan aclarar esas dudillas.
Gracias
Eternal Idol:
Para lo primero ya lo resolviste en tu edicion, tampoco hace falta el FreeConsole por cierto.
En la documentacoin de ReadConsole no dice que lpBuffer (el segundo parametro) o lpNumberOfCharsRead (el cuarto parametro) sean opcionales ... es logico que de una excepcion de acceso invalido de memoria si esta escribiendo en 0.
krnl64:
No le puse NULL porque fuese opcional sino porque pensaba que no necesitaría ni buffer ni variable ninguna porque no quería guardar la entrada de datos.
Le puse ambos parametros y funciona.
Lo que no termino de entender es de que el handle de salida de datos desaparece (De hay el fallo al hacer CloseHandle hout).
En la msdn no dice que se cierre solo.
Eternal Idol:
--- Cita de: "krnl64" --- No le puse NULL porque fuese opcional sino porque pensaba que no necesitaría ni buffer ni variable ninguna porque no quería guardar la entrada de datos.
Le puse ambos parametros y funciona.
Lo que no termino de entender es de que el handle de salida de datos desaparece (De hay el fallo al hacer CloseHandle hout).
En la msdn no dice que se cierre solo.
--- Fin de la cita ---
Bueno, a menos que diga que un parametro es opcional si este es un puntero tenes que pasar uno valido.
En cuanto al CloseHandle, es la misma logica que con el FreeConsole. ¿Vos abriste ese HANDLE? Entonces tampoco lo cerras.
krnl64:
Es verdad !! Yo solo recupero el handle pero no lo abro.
Normal que no tenga que cerrarlo.
Gracias por las respuestas !!
Saludos
Navegación
Ir a la versión completa