cast en asm

Iniciado por rmdma(), 16 Febrero 2012, 11:14 AM

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

rmdma()

como puedo hacer para conertir un DWORD en un BYTE ?


Código ("fasm") [Seleccionar]

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

Eternal Idol

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:

Código (asm) [Seleccionar]
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]
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

_Enko

#2
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.

Código (asm) [Seleccionar]

.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.