Foro de elhacker.net

Programación => ASM => Mensaje iniciado por: Erik# en 8 Julio 2009, 12:39 pm



Título: Error en practica
Publicado por: Erik# en 8 Julio 2009, 12:39 pm
Hola, bueno soy yo de nuevo el noob de siempre xD.
Os muestro esto:

Código
  1. format pe console
  2. entry start
  3. include 'win32ax.inc'
  4. .data
  5.    nt db ?
  6. .code
  7. start:
  8. xor eax,eax
  9. add eax,6
  10. add eax,9
  11. add eax,3
  12. add eax,9
  13. add eax,5
  14. add eax,6
  15. mov [nt],eax
  16. xor eax,eax
  17. xor ebx,ebx
  18. mov eax,6
  19. div [nt]
  20. push nt
  21. call[printf]
  22. push 0
  23. call [getchar]
  24. ret
  25. section '.idata' import data readable
  26. library msvcrt,'MSVCRT.dll'
  27. import msvcrt,printf,'printf',getchar,'_fgetchar'

Estoy intentando hacer que entre 6 resultados de examenes los divida y me de la media, pero me salta error al intentar masar del eax al nt (nota total).

¿Que puede ocurrir?

EI: juntando mensajes.

En cambio, si pongo directamente 34 no me salta error, me muestra el codigo ascii (&) pero igualmente no me salta error :(


Título: Re: Error en practica
Publicado por: Eternal Idol en 8 Julio 2009, 13:51 pm
nt es db (un byte) y eax es un registro de 32 bits, tenes que declarar nt como dd.

Y la division:
Código
  1. xor edx, edx
  2. mov eax,[nt]
  3. mov ecx, 6
  4. div ecx

¿Sabes usar printf? El primer parametro tiene que ser un puntero a una cadena, no un entero.

Por ejemplo en .data:
Código
  1. formato db "Total %d Media %d", 13, 10, 0

Y se llama asi en este caso:
Código
  1. push eax ;ese el resultado de la division
  2. push [nt]
  3. push formato
  4. call [printf]
  5. add esp, 0Ch ;hay que arreglar la pila, 3 parametros x 4 bytes cada uno = 12 = 0Ch

Mas facil:
Código
  1. cinvoke printf, formato, [nt], eax

PD. No te olvides de usar cinvoke o arreglar la pila cuando llames a funciones con convencion de llamada C.


Título: Re: Error en practica
Publicado por: Erik# en 8 Julio 2009, 14:13 pm
Muchísimas gracias idol, eres un crack.

EDIT: Entonces el uso de variables es inecesario

EDIT2: Código final:

Código
  1. format pe console
  2. entry start
  3. include 'win32ax.inc'
  4. .data
  5.    formato db "Media %d", 13, 10, 0
  6. .code
  7. start:
  8. xor eax,eax
  9. xor edx,edx
  10. add eax,6
  11. add eax,9
  12. add eax,3
  13. add eax,9
  14. add eax,5
  15. add eax,6
  16. mov ecx, 6
  17. div ecx
  18. push eax
  19. push formato
  20. call [printf]
  21. push 0
  22. call [getchar]
  23. ret
  24. section '.idata' import data readable
  25. library msvcrt,'MSVCRT.dll'
  26. import msvcrt,printf,'printf',getchar,'_fgetchar'  


Título: Re: Error en practica
Publicado por: Eternal Idol en 8 Julio 2009, 14:27 pm
De nada; fijate que la pila sigue estando mal, el programa da una excepcion en lugar de terminar correctamente.


Título: Re: Error en practica
Publicado por: Erik# en 8 Julio 2009, 14:42 pm
Perdon me olvide de arreglar la pila con:

Código
  1. add esp, 0Ch

Y acabar con ExitProcess:

Código
  1. format pe console
  2. entry start
  3. include 'win32ax.inc'
  4. .data
  5.    formato db "Media %d", 13, 10, 0
  6. .code
  7. start:
  8. xor eax,eax
  9. xor edx,edx
  10. add eax,6
  11. add eax,9
  12. add eax,3
  13. add eax,9
  14. add eax,5
  15. add eax,6
  16. mov ecx, 6
  17. div ecx
  18. push eax
  19. push formato
  20. call [printf]
  21. add esp, 0Ch
  22. push 0
  23. call [getchar]
  24. push 0
  25. call [exp]
  26. section '.idata' import data readable
  27. library msvcrt,'MSVCRT.dll',k32,'kernel32.dll'
  28. import msvcrt,printf,'printf',getchar,'_fgetchar'
  29. import k32,exp,'ExitProcess'


Título: Re: Error en practica
Publicado por: Eternal Idol en 8 Julio 2009, 14:59 pm
ExitProcess no es necesario, a menos que no arregles la pila correctamente como en este caso, si empujas dos parametros entonces tenes que usar add esp, 08h. Y en getchar no hace falta empujar nada, no tiene parametros  ;D


Título: Re: Error en practica
Publicado por: Erik# en 8 Julio 2009, 15:01 pm
ExitProcess no es necesario, a menos que no arregles la pila correctamente como en este caso, si empujas dos parametros entonces tenes que usar add esp, 08h. Y en getchar no hace falta empujar nada, no tiene parametros  ;D

Me sigue saltando error si no le pongo exitprocess.

EDIT: Aun continuaba con el push 0 del exitprocess por eso me saltaba el error.

¿Por que se usa add esp,08h?


Título: Re: Error en practica
Publicado por: Eternal Idol en 8 Julio 2009, 15:12 pm
Para equilibrar la pila, empujaste dos DWORDs eax y formato.

Asi tiene que funcionar bien:
Código
  1. format pe console
  2. entry start
  3. include 'win32ax.inc'
  4. .data
  5.    formato db "Media %d", 13, 10, 0
  6. .code
  7. start:
  8. xor eax,eax
  9. xor edx,edx
  10. add eax,6
  11. add eax,9
  12. add eax,3
  13. add eax,9
  14. add eax,5
  15. add eax,6
  16. mov ecx, 6
  17. div ecx
  18. push eax
  19. push formato
  20. call [printf]
  21. add esp, 8
  22. call [getchar]
  23. ret
  24. section '.idata' import data readable
  25. library msvcrt,'MSVCRT.dll'
  26. import msvcrt,printf,'printf',getchar,'_fgetchar'


Título: Re: Error en practica
Publicado por: Erik# en 8 Julio 2009, 15:15 pm
Para equilibrar la pila, empujaste dos DWORDs eax y formato.

Asi tiene que funcionar bien:
Código
  1. format pe console
  2. entry start
  3. include 'win32ax.inc'
  4. .data
  5.    formato db "Media %d", 13, 10, 0
  6. .code
  7. start:
  8. xor eax,eax
  9. xor edx,edx
  10. add eax,6
  11. add eax,9
  12. add eax,3
  13. add eax,9
  14. add eax,5
  15. add eax,6
  16. mov ecx, 6
  17. div ecx
  18. push eax
  19. push formato
  20. call [printf]
  21. add esp, 8
  22. call [getchar]
  23. ret
  24. section '.idata' import data readable
  25. library msvcrt,'MSVCRT.dll'
  26. import msvcrt,printf,'printf',getchar,'_fgetchar'

Si y claroooo, cada dword esta formado por 4 bytes por eso empujamos con add 8 :) que bien eternal, muchas gracias :P