como puedo hacer para conertir un DWORD en un BYTE ?
include 'win32ax.inc'
.data
resultado dd ?
titulo db 'Suma',0
.code
start:
mov eax,2 ;
mov ebx,5 ;
mov [resultado], eax
add ebx,[resultado]
push 0
push titulo
push resultado
push 0
call [MessageBoxA]
push 0
call [ExitProcess]
.end start
lo que quiero es convertir la variable resultado en un BYTE para poder pasarsela como parametro a messageboxa, aer es sin mas estoy aprendiendo asm
MessageBox no recibe como parametro un byte sino un puntero a byte, es decir una direccion de memoria donde haya una cadena de caracteres terminada en 0. En este ejemplo especifico lo que tenes que hacer no es pasar un byte con el 7 (que lo harias muy facilmente moviendo resultado a eax, en al tenes el primer byte aunque los parametros son todos DWORDs en pila, ojo) sino la cadena que incluye un '7' (como caracter, codigo ASCII 55) y un 0 terminador.
Para que te des una idea:
res_ascii db 16 dup(0)
.code
start:
mov [res_ascii], '7'
mov [res_ascii+1], '1'
mov [res_ascii+2], '2'
mov [res_ascii+3], 0
push 0
push titulo
push res_ascii
push 0
call [MessageBoxA]
Hola, me parece que tienes un error aqui:
Citar
add ebx,[resultado]
es al reves.
add [resultado], ebx
Luego, resultado es un dword. MessageBox puede imprimir cadenas. Para eso tendrias que convertir de DWORD a STRING de alguna u otra manera.
Una opcion facil, es usar la api de windows, la funcion wsprintf.
http://msdn.microsoft.com/en-us/library/windows/desktop/ms647550(v=vs.85).aspx
(se parece al printf de c)
Acordate que esta funcion no es STDCALL, despues de hacer el call, tienes que limpiar la pila de los parametros que hiciste push.
.data
resultado dd 0
szInt db '%i',0
str_resultado db 24 dup ?
.code
start:
mov [resultado], 7
;
push [resultado]
push szInt
push str_resultado
call [wsprintf]
add esp, 12 ;wsprintf es cdecl, 3 parametros = 3 * 4bytes = 12.
;
;listo, ahora str_resultado es un puntero a una cadena.
Saludos.