Error en practica

Iniciado por Erik#, 8 Julio 2009, 12:39 PM

0 Miembros y 1 Visitante están viendo este tema.

Erik#

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 :(

Eternal Idol

#1
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.
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#

#2
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'   

Eternal Idol

De nada; fijate que la pila sigue estando mal, el programa da una excepcion en lugar de terminar correctamente.
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#

#4
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'

Eternal Idol

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
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#

#6
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?

Eternal Idol

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'
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#

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