The Swash escribió:Bueno amigos, he leido un poco de ASM y la verdad ayuda demaciado, practicando me propuse hacer un bucle simple usando MessageBoxA y no resulto tan facil pero al fin lo hice y creo haber sacado mis conclusiones.
Código: Seleccionar todo
include 'Tu ruta de win32ax.inc'
.data
msg db 'Provando un bucle',0
title db 'Test',0
.code
start:
xor ecx,ecx; ECX = 0
add ecx,5d; ECX = 5
Bucle: invoke MessageBoxA,0,msg,title,0 ; Call MessageBox
pop ecx ; Sacamos ultimo parametro de la pila
pop ecx ; Sacamos penultimo dato de la pila
pop ecx ; ''
pop ecx ; ''
Dec ecx ; Decrementamos ECX en 1
JNZ Bucle ; Si ECX <> 0 Saltamos al bucle
Push 0 ; Ingresamos parametro de la API ExitProcess a la pila
Call [ExitProcess]; Llamamos a la API
.end start
Compilado en FASM.
Mi conclusion segun este pequeño codigo es que cuando usamos registros y a la vez Apis, los registros almacenan valorer de parametros de estas apis, por eso sin sacar los parametros de la pila el bucle no era el correcto.
Comentarios, sugerencias, criticas o correcciones son Bienvenidas
Salu2!
The Swash, este código está mal.
el programa no sale porque se haya cumplido el bucle y llegue al ExitProcess, sino porque revienta la pila y lo cierra Windows.
No puedes hacer esos "pop ecx" después de la llamada a MessageBox porque con ellos sacas valores de la pila que son necesarios para el buen funcionamiento del programa.
El bucle no te funciona bien porque la API MessageBox usa ecx, con lo que pierde su valor de 5, lo que tendrías que hacer es guardar ese valor y luego recuperarlo.
Por cierto, si vacias ecx y luego le sumas 5, ¿no será más lógico poner 5 en ecx directamente? así que el código te quedaría algo así:
Código: Seleccionar todo
.code
start:
mov ecx,5d; ECX = 5
Bucle:
push ecx; Guardamos el valor de ecx
invoke MessageBoxA,0,msg,title,0 ; Call MessageBox
pop ecx ; Recuperamos el valor de ecx
Dec ecx ; Decrementamos ECX en 1
JNZ Bucle ; Si ECX <> 0 Saltamos al bucle
invoke ExitProcess, 0
.end start
En este caso hay un "pop ecx" porque previamente he hecho un "push ecx" (envío un valor a la pila y lo recupero) y no pierdo la posición de la pila.
Lo mejor que puedes hacer es abrir el ejecutable que generas con algún debugger como el OllyDbg y ver, instrucción a instrucción que es lo que hace.
Saludos.