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