elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  ASM (Moderador: Eternal Idol)
| | | |-+  Como puedo hacer While o For en FASM
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Como puedo hacer While o For en FASM  (Leído 6,479 veces)
Erik#


Desconectado Desconectado

Mensajes: 1.138


Gundam


Ver Perfil
Como puedo hacer While o For en FASM
« en: 27 Agosto 2009, 13:28 pm »

¿Como puedo hacer while o for en FASM?


En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.937


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Como puedo hacer While o For en FASM
« Respuesta #1 en: 27 Agosto 2009, 14:00 pm »

Esto es assembly puro, ejecuta el codigo del bucle (inc eax) un numero X de veces (de acuerdo al valor de ECX):

Código
  1. mov ecx, 5
  2. xor eax, eax
  3. bucle:
  4. inc eax
  5. loop bucle

http://pdos.csail.mit.edu/6.828/2006/readings/i386/LOOP.htm

Tambien podes hacerlo con cmp's y jmp's.

Código
  1. mov ecx, 5
  2. xor eax, eax
  3. bucle:
  4. inc eax
  5. dec ecx
  6. cmp ecx, 0
  7. jne bucle

Tambien podrias hacer lo contrario, iniciando el contador a 0, incrementandolo en cada pasada y comprobando si es igual (o mayor como en el ejemplo siguiente) al limite:

Código
  1. xor ecx, ecx
  2. xor eax, eax
  3. bucle:
  4. inc eax
  5. add ecx, 2
  6. cmp ecx, 9
  7. jna bucle

Este bucle se ejecutara mientras el resultado devuelto por func sea diferente de 0:
Código
  1. bucle:
  2. call func
  3. cmp eax, 0
  4. jne bucle

Podes hacer uso de JCC tambien.


« Última modificación: 27 Agosto 2009, 14:15 pm por Eternal Idol » En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
Erik#


Desconectado Desconectado

Mensajes: 1.138


Gundam


Ver Perfil
Re: Como puedo hacer While o For en FASM
« Respuesta #2 en: 27 Agosto 2009, 14:17 pm »

El primer código cuando eax sea igual a 5 se para?
En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.937


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Como puedo hacer While o For en FASM
« Respuesta #3 en: 27 Agosto 2009, 14:19 pm »

El primer código cuando eax sea igual a 5 se para?

No, la mejor manera de que lo comprendas es depurandolo pero como dije al principio y dice tambien en el enlace que deje sobre loop:
... ejecuta el codigo del bucle (inc eax) un numero X de veces (de acuerdo al valor de ECX).

La C de ECX viene de COUNT, por eso la instruccion loop del microprocesador usa ese registro, el inc eax es unicamente el codigo del bucle en si mismo, es lo que hace, ahi podias poner cualquier cosa.
« Última modificación: 27 Agosto 2009, 14:21 pm por Eternal Idol » En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
Erik#


Desconectado Desconectado

Mensajes: 1.138


Gundam


Ver Perfil
Re: Como puedo hacer While o For en FASM
« Respuesta #4 en: 27 Agosto 2009, 14:38 pm »

Gracias idol, he probado hacer algo así:

Código
  1. format pe gui
  2. entry start
  3. include 'win32ax.inc'
  4. .data
  5. nUM dd ?
  6. nSum db 2 dup(0)
  7. .code
  8. start:
  9. mov ecx, 5
  10. xor eax, eax
  11. bucle:
  12. inc eax
  13. invoke wsprintfA, nSum,'%d',eax
  14. add esp,12
  15. invoke MessageBoxA, 0,nSum,nSum,0
  16. loop bucle
  17. ret
  18. section '.idata' import data readable
  19. library  user32,'user32.dll'
  20. import user32,MessageBoxA,'MessageBoxA',wsprintfA,'wsprintfA'

Pero se me queda parado en el 2
En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.937


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Como puedo hacer While o For en FASM
« Respuesta #5 en: 27 Agosto 2009, 14:42 pm »

Cualquier funcion que llames puede afectar a los registros que no se preservan, muy especialmente eax que ademas es el valor de retorno de una funcion:

Código
  1. bucle:
  2. push ecx
  3. inc eax
  4. push eax
  5. invoke wsprintfA, nSum,'%d',eax
  6. add esp,12
  7. invoke MessageBoxA, 0,nSum,nSum,0
  8. pop eax
  9. pop ecx
  10. loop bucle
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
Erik#


Desconectado Desconectado

Mensajes: 1.138


Gundam


Ver Perfil
Re: Como puedo hacer While o For en FASM
« Respuesta #6 en: 27 Agosto 2009, 14:47 pm »

¿Por que push eax,ecx y pop eax,ecx? El POP y el PUSH es algo que he leido en muchos manuales, wikipedia... y no logro acabar de entenderlo :S.

¿Para que sirven realmente pop y push? no quiero una definición wikipedia, porque

PUSH mete un DWORD en la pila
POP al contrario que PUSH saca un DWORD de la pila.

(Frases extraidas del taller de e0n)
En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.937


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Como puedo hacer While o For en FASM
« Respuesta #7 en: 27 Agosto 2009, 14:56 pm »

Sirven para eso mismo ... en este codigo sirven para guardar el valor que tengan en la pila (push), ejecutar las funciones que cambian el valor de esos registros y posteriormente restaurarlos (pop). DEPURA tu codigo y despues el codigo que funciona y vas a verlo mucho mas claramente.

PD. El orden que mencionaste no es correcto, primero se empuja ecx, despues eax y por eso mismo primero se saca eax y despues ecx.
« Última modificación: 27 Agosto 2009, 15:00 pm por Eternal Idol » En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
Erik#


Desconectado Desconectado

Mensajes: 1.138


Gundam


Ver Perfil
Re: Como puedo hacer While o For en FASM
« Respuesta #8 en: 27 Agosto 2009, 15:01 pm »

Sirven para eso mismo ... en este codigo sirven para guardar el valor que tengan en la pila (push), ejecutar las funciones que cambian el valor de esos registros y posteriormente restaurarlos (pop). DEPURA tu codigo y despues el codigo que funciona y vas a verlo mucho mas claramente.

Y cuando debo usar push (a parte de cuando invoque una función...) y cuando pop?
En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.937


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Como puedo hacer While o For en FASM
« Respuesta #9 en: 27 Agosto 2009, 15:02 pm »

Y cuando debo usar push (a parte de cuando invoque una función...) y cuando pop?

Cuando quieras empujar y sacar algo de la pila  :D Cuando uses una convencion de llamada que pase los parametros en la pila como C y stdcall por ejemplo.
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines