Foro de elhacker.net

Programación => ASM => Mensaje iniciado por: AlxSpy en 25 Junio 2011, 20:39 pm



Título: [DUDA]uso del mov en flat assembler
Publicado por: AlxSpy en 25 Junio 2011, 20:39 pm
hola hice mi primer code en FASM:

Código:
include 'c:\fasm\include\win32ax.inc'
.data
lpTextOk db 'notepad encontrado',0
lpTextError db 'no se encontró notepad',0
lpCaption db 'Mi Primer programa',0

lpClassName db 'notepad',0
lpWindowName db 0

NuevoTitulo db 'Modificando un caption',0

lpString db 'hello world',0
nCount dd 11
hWin dd ?
hdc dd ?

.code
start:
push 0               ;linea 19  original: push lpWindowName (no encuentra el notepad)
push lpClassName
call [FindWindowA]
mov [hWin],eax       ;linea 22  original: mov hwin,eax
cmp [hWin],0
jne encontrado
jmp noencontrado
.end start

encontrado:
push 64
push lpCaption
push lpTextOk
push 0
call [MessageBoxA]
push NuevoTitulo
push [hWin]
call [SetWindowTextA]
push [hWin]
call [GetDC]
mov [hdc],eax        ;linea 39  original: mov hdc,eax
push [nCount]
push lpString
push 25
push 25
push [hdc]
call [TextOutA]
push 1
push [hWin]
call [FlashWindow]
push 333
call [Sleep]
push 0
push [hWin]
call [FlashWindow]
push 333
call [Sleep]
push 1
push [hWin]
call [FlashWindow]
jmp salida
ret

noencontrado:
push 16
push lpCaption
push lpTextError
push 0
call [MessageBoxA]
jmp salida
ret

salida:
push 0
call [ExitProcess]
ret

la teoria del "mov destino,origen" dice que mueve info del origen al destino, y en FASM al poner la variable entre "[]" [variable] se refiere al valor que contiene supongo que al poner variable sin nada entonces se refiere a su direccion en memoria, en la linea 19 del codigo al principio puse "mov hWin,eax" lo entiendo de esta manera: "lo que valga eax muevelo a la direccion de hWin", pero me daba error (al igual que la linea 39), asi que le puse [hWin] y funciona , el uso del mov y de pasar las variables entre "[]" y sin nada no me queda muy claro ¿alguien me podria dar una mejor explicacion de esto?


Título: Re: [DUDA]uso del mov en flat assembler
Publicado por: _Enko en 25 Junio 2011, 21:56 pm
La manera correcta es
mov [hWin], eax

de otra manera no ensambla, no es una operacion valida.

Para que entiendas mejor:

hWin es una label, una etiqueta, equivale a una direccion de memoria.
por ejemplo:
label1 dd 5 ; label1 = 0x4000
label2 dd 4; label2 = 04004 (label1 + 4, porque dd=DWORD=4 en 32 bit)


En si, con esto no hay problema, porque el ensamblador te dirá que hay un error. Pero que pasa si el mov es al reves.
mov eax, [label1] ; eax = 5

si te confundes, y colocas
mov eax, label1; eax=0x4000

ambas intrucciones son validas.

así que acordate:

VARIABLE es direccion de memoria
[VARIABLE] es el contenido de esa direccion de memoria.

Y ojo, a veces, el contenido tambien puede ser una direccion de memoria, variables PUNTERO.

por ejemplo:
Código:
mov eax, label1 ;eax = 0x4000
mov [label2], eax
;label2 = 0x4004
;[label2] = 0x4000 el contenido de label2 apunta a label1
;para llegar al valor al que apunta label2 puedes hacer
mov eax, [label2]; eax = 0x4000
mov eax, [eax]; eax = [contenido 0x4000] = 5

Mucho cuidado con eso, son los errores mas comunes a la hora de pasar parametros a una funcion.


si ves codigo de masm....

FASM [VARIABLE] = MASM VARIABLE
FASM VARIABLE = MASM ADDR VARIABLE , o MASM OFFSET VARIABLE.




Saludos.


Título: Re: [DUDA]uso del mov en flat assembler
Publicado por: AlxSpy en 26 Junio 2011, 23:08 pm
bastante claro gracias.