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

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  ASM (Moderador: Eternal Idol)
| | | |-+  Error en practica
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Error en practica  (Leído 4,548 veces)
Erik#


Desconectado Desconectado

Mensajes: 1.138


Gundam


Ver Perfil
Error en practica
« 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 :(


« Última modificación: 8 Julio 2009, 14:04 pm por Eternal Idol » 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: Error en practica
« Respuesta #1 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.


« Última modificación: 8 Julio 2009, 14:06 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: Error en practica
« Respuesta #2 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'  
« Última modificación: 8 Julio 2009, 14:19 pm por Erik# » 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: Error en practica
« Respuesta #3 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.
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: Error en practica
« Respuesta #4 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'
« Última modificación: 8 Julio 2009, 14:47 pm por Erik# » 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: Error en practica
« Respuesta #5 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
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: Error en practica
« Respuesta #6 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?
« Última modificación: 8 Julio 2009, 15:04 pm por Erik# » 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: Error en practica
« Respuesta #7 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'
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: Error en practica
« Respuesta #8 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
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
consulta con ejercicio de practica « 1 2 »
Programación C/C++
urvreak 14 6,196 Último mensaje 20 Enero 2011, 22:39 pm
por urvreak
PRACTICA MONOPOLY
Dudas Generales
shawwilliam 1 1,845 Último mensaje 17 Mayo 2013, 17:22 pm
por shawwilliam
Práctica Revista 7 HxC
Programación Visual Basic
apoeti 2 1,708 Último mensaje 26 Junio 2013, 23:08 pm
por apoeti
Live USB; en la práctica...
GNU/Linux
B€T€B€ 7 4,356 Último mensaje 14 Enero 2014, 01:38 am
por B€T€B€
Práctica de hacking
Hacking
Varlch 5 4,377 Último mensaje 5 Diciembre 2014, 01:25 am
por Varlch
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines