Test Foro de elhacker.net SMF 2.1

Programación => Programación General => 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 (asm) [Seleccionar]
format pe console
entry start
include 'win32ax.inc'
.data
   nt db ?
.code
start:
xor eax,eax
add eax,6
add eax,9
add eax,3
add eax,9
add eax,5
add eax,6
mov [nt],eax
xor eax,eax
xor ebx,ebx
mov eax,6
div [nt]
push nt
call[printf]
push 0
call [getchar]
ret
section '.idata' import data readable
library msvcrt,'MSVCRT.dll'
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 (asm) [Seleccionar]
xor edx, edx
mov eax,[nt]
mov ecx, 6
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 (asm) [Seleccionar]
formato db "Total %d Media %d", 13, 10, 0

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


Mas facil:
Código (asm) [Seleccionar]
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 (asm) [Seleccionar]
format pe console
entry start
include 'win32ax.inc'
.data
    formato db "Media %d", 13, 10, 0
.code
start:
xor eax,eax
xor edx,edx
add eax,6
add eax,9
add eax,3
add eax,9
add eax,5
add eax,6
mov ecx, 6
div ecx
push eax
push formato
call [printf]
push 0
call [getchar]
ret
section '.idata' import data readable
library msvcrt,'MSVCRT.dll'
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 (asm) [Seleccionar]
add esp, 0Ch

Y acabar con ExitProcess:

Código (asm) [Seleccionar]
format pe console
entry start
include 'win32ax.inc'
.data
   formato db "Media %d", 13, 10, 0
.code
start:
xor eax,eax
xor edx,edx
add eax,6
add eax,9
add eax,3
add eax,9
add eax,5
add eax,6
mov ecx, 6
div ecx
push eax
push formato
call [printf]
add esp, 0Ch
push 0
call [getchar]
push 0
call [exp]
section '.idata' import data readable
library msvcrt,'MSVCRT.dll',k32,'kernel32.dll'
import msvcrt,printf,'printf',getchar,'_fgetchar'
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
Cita de: 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

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 (asm) [Seleccionar]
format pe console
entry start
include 'win32ax.inc'
.data
    formato db "Media %d", 13, 10, 0
.code
start:
xor eax,eax
xor edx,edx
add eax,6
add eax,9
add eax,3
add eax,9
add eax,5
add eax,6
mov ecx, 6
div ecx
push eax
push formato
call [printf]
add esp, 8
call [getchar]
ret
section '.idata' import data readable
library msvcrt,'MSVCRT.dll'
import msvcrt,printf,'printf',getchar,'_fgetchar'
Título: Re: Error en practica
Publicado por: Erik# en 8 Julio 2009, 15:15 PM
Cita de: 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 (asm) [Seleccionar]
format pe console
entry start
include 'win32ax.inc'
.data
    formato db "Media %d", 13, 10, 0
.code
start:
xor eax,eax
xor edx,edx
add eax,6
add eax,9
add eax,3
add eax,9
add eax,5
add eax,6
mov ecx, 6
div ecx
push eax
push formato
call [printf]
add esp, 8
call [getchar]
ret
section '.idata' import data readable
library msvcrt,'MSVCRT.dll'
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