Sumar eax i ebx

Iniciado por E.P.I., 21 Marzo 2010, 01:57 AM

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

E.P.I.

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.
La verdad nos hará libres

MCKSys Argentina

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!
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


E.P.I.

¡Gracias! Pero el problema es que quiero aprender FASM  :-\ y supongo que incluyendo MASM... hay alguna solución con sólo FASM?
La verdad nos hará libres

[Zero]

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

"El Hombre, en su orgullo, creó a Dios a su imagen y semejanza.”
Nietzsche

E.P.I.

Gracias... voy a probarlo con HeapAlloc.
La verdad nos hará libres

RAID-MAM

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

[Zero]

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




"El Hombre, en su orgullo, creó a Dios a su imagen y semejanza.”
Nietzsche

RAID-MAM

y el pobre EBP no los restauras ?  :laugh:

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

[Zero]

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

"El Hombre, en su orgullo, creó a Dios a su imagen y semejanza.”
Nietzsche