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.
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!
¡Gracias! Pero el problema es que quiero aprender FASM :-\ y supongo que incluyendo MASM... hay alguna solución con sólo FASM?
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
Gracias... voy a probarlo con HeapAlloc.
Cita de: Hacker_Zero en 21 Marzo 2010, 11:50 AM
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
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.
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
y el pobre EBP no los restauras ? :laugh:
No lo digo por el codigo si no por si copia el pedazito de codigo ;-)
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