Hola, bueno soy yo de nuevo el noob de siempre xD.
Os muestro esto:
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 :(
nt es db (un byte) y eax es un registro de 32 bits, tenes que declarar nt como dd.
Y la division:
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:
formato db "Total %d Media %d", 13, 10, 0
Y se llama asi en este caso:
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:
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.
Muchísimas gracias idol, eres un crack.
EDIT: Entonces el uso de variables es inecesario
EDIT2: Código final:
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'
De nada; fijate que la pila sigue estando mal, el programa da una excepcion en lugar de terminar correctamente.
Perdon me olvide de arreglar la pila con:
add esp, 0Ch
Y acabar con ExitProcess:
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'
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
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?
Para equilibrar la pila, empujaste dos DWORDs eax y formato.
Asi tiene que funcionar bien:
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'
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:
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