Autor
|
Tema: Sumar eax i ebx (Leído 1,952 veces)
|
E.P.I.
Desconectado
Mensajes: 346
elprogramadorinformatico [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: 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.
|
|
|
|
|
En línea
|
La verdad nos hará libres
|
|
|
MCKSys Argentina
Desconectado
Mensajes: 1.141
Diviérte crackeando, que para eso estamos!
|
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!
|
|
|
|
|
En línea
|
--------------------- MCKSys Argentina
"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."
|
|
|
E.P.I.
Desconectado
Mensajes: 346
elprogramadorinformatico [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?
|
|
|
|
|
En línea
|
La verdad nos hará libres
|
|
|
[Zero]
Wiki
Desconectado
Mensajes: 1.050
CALL DWORD PTR DS:[0]
|
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
|
|
|
|
|
En línea
|
“El Hombre, en su orgullo, creó a Dios a su imagen y semejanza.” Nietzsche
|
|
|
E.P.I.
Desconectado
Mensajes: 346
elprogramadorinformatico [E.P.I.]
|
Gracias... voy a probarlo con HeapAlloc.
|
|
|
|
|
En línea
|
La verdad nos hará libres
|
|
|
RAID-MAM
Desconectado
Mensajes: 58
|
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 ? 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
|
|
|
|
|
En línea
|
|
|
|
[Zero]
Wiki
Desconectado
Mensajes: 1.050
CALL DWORD PTR DS:[0]
|
y la pila te la metes por el orto ? 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: 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.
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
|
|
|
|
« Última modificación: 22 Marzo 2010, 06:41 por Hacker_Zero »
|
En línea
|
“El Hombre, en su orgullo, creó a Dios a su imagen y semejanza.” Nietzsche
|
|
|
|
|
[Zero]
Wiki
Desconectado
Mensajes: 1.050
CALL DWORD PTR DS:[0]
|
y el pobre EBP no los restauras ?  No lo digo por el codigo si no por si copia el pedazito de codigo  NO!, me gusta ebp sin restaurar 
|
|
|
|
|
En línea
|
“El Hombre, en su orgullo, creó a Dios a su imagen y semejanza.” Nietzsche
|
|
|
|
|