Foro de elhacker.net

Programación => ASM => Mensaje iniciado por: rmdma() en 16 Febrero 2012, 11:14 am



Título: cast en asm
Publicado por: rmdma() en 16 Febrero 2012, 11:14 am
como puedo hacer para conertir un DWORD en un BYTE ?


Código
  1. include 'win32ax.inc'
  2.  
  3. .data
  4.        resultado dd ?
  5.        titulo    db 'Suma',0
  6.  
  7. .code
  8.        start:
  9.  
  10.            mov eax,2 ;
  11.            mov ebx,5 ;
  12.            mov [resultado], eax
  13.            add ebx,[resultado]
  14.  
  15.            push 0
  16.            push titulo
  17.            push resultado
  18.            push 0
  19.            call [MessageBoxA]
  20.  
  21.            push 0
  22.            call [ExitProcess]
  23.  
  24.  
  25. .end start    
  26.  
  27.  


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


Título: Re: cast en asm
Publicado por: Eternal Idol en 16 Febrero 2012, 12:50 pm
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
  1. res_ascii db 16 dup(0)
  2.  
  3. .code
  4.        start:
  5.  
  6.    mov [res_ascii], '7'
  7.    mov [res_ascii+1], '1'
  8.    mov [res_ascii+2], '2'
  9.    mov [res_ascii+3], 0
  10.  
  11.            push 0
  12.            push titulo
  13.            push res_ascii
  14.            push 0
  15.            call [MessageBoxA]


Título: Re: cast en asm
Publicado por: _Enko en 16 Febrero 2012, 18:01 pm
Hola, me parece que tienes un  error aqui:
Citar
 add ebx,[resultado]
es al reves.
Código:
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
  1. .data
  2.        resultado dd  0
  3.        szInt db '%i',0
  4.        str_resultado db 24 dup ?
  5.  
  6.  
  7. .code
  8.        start:
  9.            mov [resultado], 7
  10.            ;
  11.            push [resultado]
  12.            push szInt
  13.            push str_resultado
  14.            call [wsprintf]
  15.            add esp, 12 ;wsprintf es cdecl, 3 parametros = 3 * 4bytes = 12.
  16.            ;
  17.            ;listo, ahora str_resultado es un puntero a una cadena.
  18.  

Saludos.