Test Foro de elhacker.net SMF 2.1

Programación => Programación General => ASM => Mensaje iniciado por: E.P.I. en 21 Marzo 2010, 01:57 AM

Título: Sumar eax i ebx
Publicado por: E.P.I. en 21 Marzo 2010, 01:57 AM
Hola,

acabo de empezar a aprender ASM, hace 20 minutos, y estoy con un ejercicio de E0N... que el registro EAX tenga el valor 2 i el registro EBX el valor 5 y, que se sumen, y el valor quede en EAX... después POR MI CUENTA quiero mostrar el resultado con un MessageBoxA(), pero crashea, cuando acaba de ensamblar:

Código (asm) [Seleccionar]
include 'win32ax.inc'

.code

start:
        mov eax,2
        mov ebx,5
        add eax,ebx

invoke MessageBoxA,0,eax,"suma",0
invoke ExitProcess,0

.end start


¿Alguna solución?

Muchas gracias.
Título: Re: Sumar eax i ebx
Publicado por: MCKSys Argentina en 21 Marzo 2010, 04:02 AM
Hola!

Craseha porque debes pasarle un puntero a una cadena a MessageBox, y tu le estas pasando (como puntero) el valor 7. Osea, le estás diciendo a la función, que la cadena que quieres mostrar, se encuentra en la posición de memoria 7.

Una forma de lograr lo que quieres hacer, sería:


include 'win32ax.inc'
;incluimos la libreria de MASM
include \masm32\include\masm32.inc
includelib \masm32\lib\masm32.lib

;definimos una sección de datos donde guardaremos el resultado de la suma, pero convertido en cadena de caracteres
;esta sección contendrá los datos NO inicializados
.data?
miCadena db 0Ah dup (?)

;sección de datos inicializados
.data
tituloMensaje db "suma",0

.code

start:
        mov eax,2
        mov ebx,5
        add eax,ebx
        ;dwtoa convierte un DWORD en una cadena value to an ascii
        ;declaracion: dwtoa proc public uses esi edi dwValue:DWORD, lpBuffer:DWORD
        invoke dwtoa, eax, addr miCadena
        invoke MessageBoxA,0,addr miCadena,addr tituloMensaje,0
        invoke ExitProcess,0

.end start


Saludos!
Título: Re: Sumar eax i ebx
Publicado por: E.P.I. en 21 Marzo 2010, 10:35 AM
¡Gracias! Pero el problema es que quiero aprender FASM  :-\ y supongo que incluyendo MASM... hay alguna solución con sólo FASM?
Título: Re: Sumar eax i ebx
Publicado por: [Zero] en 21 Marzo 2010, 11:50 AM
Código (asm) [Seleccionar]
include 'win32ax.inc'

.code

start:
        mov eax,2
        mov ebx,5
        add eax,ebx

        ;Guardo eax en la pila
        push eax

        ;Reservo memoria y guardo en puntero a esa memoria en ebx
        invoke GlobalAlloc,GPTR,1024
        mov ebx,eax

        ;Recupero eax de la pila
        pop eax

        ;Guardo en ebx un puntero que apunta hacia eax convertido en cadena
        invoke wsprintfA,ebx,"%d",eax

        invoke MessageBoxA,0,ebx,"suma",0
        invoke ExitProcess,0

.end start


Saludos
Título: Re: Sumar eax i ebx
Publicado por: E.P.I. en 21 Marzo 2010, 13:03 PM
Gracias... voy a probarlo con HeapAlloc.
Título: Re: Sumar eax i ebx
Publicado por: RAID-MAM en 22 Marzo 2010, 03:21 AM
Cita de: Hacker_Zero en 21 Marzo 2010, 11:50 AM
Código (asm) [Seleccionar]
include 'win32ax.inc'

.code

start:
       mov eax,2
       mov ebx,5
       add eax,ebx

       ;Guardo eax en la pila
       push eax

       ;Reservo memoria y guardo en puntero a esa memoria en ebx
       invoke GlobalAlloc,GPTR,1024
       mov ebx,eax

       ;Recupero eax de la pila
       pop eax

       ;Guardo en ebx un puntero que apunta hacia eax convertido en cadena
       invoke wsprintfA,ebx,"%d",eax

       invoke MessageBoxA,0,ebx,"suma",0
       invoke ExitProcess,0

.end start


Saludos

y la pila te la metes por el orto ? :P :xD

Restaura la pila luego del wsprintf con cinvoke en ves de invoke .

Mucha memoria para un numero que cabe en 2 bytes y luego no usas GLobalFree :S
Título: Re: Sumar eax i ebx
Publicado por: [Zero] en 22 Marzo 2010, 06:39 AM
Cita de: SecMAM en 22 Marzo 2010, 03:21 AM
y la pila te la metes por el orto ? :P :xD

Restaura la pila luego del wsprintf con cinvoke en ves de invoke .

Mucha memoria para un numero que cabe en 2 bytes y luego no usas GLobalFree :S

No tiene sentido liberar memoria si nanosegundos despues haces un ExitProcess  :¬¬ :¬¬ :¬¬ .

Lo de la pila tienes razón:

Citar
Note  It is important to note that wsprintf uses the C calling convention (_cdecl), rather than the standard call (_stdcall) calling convention. As a result, it is the responsibility of the calling process to pop arguments off the stack, and arguments are pushed on the stack from right to left. In C-language modules, the C compiler performs this task.

Código (asm) [Seleccionar]

include 'win32ax.inc'

.code

start:
       ;Reservo memoria y guardo en puntero a esa memoria en ebp
       ;¬¬'
       sub esp,2
       mov ebp,esp

       mov eax,2
       mov ebx,5
       add eax,ebx

       ;Guardo en ebx un puntero que apunta hacia eax convertido en cadena
       invoke wsprintfA,ebp,"%d",eax
       ;¬¬'
       add esp,0x0C

       invoke MessageBoxA,0,ebp,"suma",0
       add esp,2
       ret
.end start


Saludos



Título: Re: Sumar eax i ebx
Publicado por: RAID-MAM en 25 Marzo 2010, 01:14 AM
y el pobre EBP no los restauras ?  :laugh:

No lo digo por el codigo si no por si copia el pedazito de codigo  ;-)
Título: Re: Sumar eax i ebx
Publicado por: [Zero] en 26 Marzo 2010, 22:45 PM
Cita de: SecMAM en 25 Marzo 2010, 01:14 AM
y el pobre EBP no los restauras ?  :laugh:

No lo digo por el codigo si no por si copia el pedazito de codigo  ;-)

NO!, me gusta ebp sin restaurar  >:(  :xD