Ni fasm ni masm compilan
Ensamblan.
Los codigos ensamblados entre masm y fasm son sumamente similares si es el mismo codigo, y es el mismo programador.
Lo que ocurre, es que se notan los estilos que usa un programador ya que la ejecutable es un reflejo del codigo fuente (mas en fasm, por eso se llama flat assembler)
fasm no es el que usa los jmps, los use yo en esta ocacion por pereza.
Normalmente se coloca las variables/constanes/cadenas en la sección .data
Y en este crackme use jmps porque no queria subir en el codigo fuente para volver a bajar a donde estaba antes....
Entonces, hice lo que borland con pascal/delphi viene haciendo hace años
jmp saltercadena
cadena db 'hola mundo',0
saltearcadena:
push 0
push cadena
push cadena
push 0
call [MessageBoxA]
La unica gran diferencia entre masm y fasm, es como manejan las importaciones.
en masm, normalmente tenes :
CALL <JMP.&KERNEL32.GetModuleHandleA>
mientras que en fasm
CALL [<&kernel32.GetModuleHandleA>]
masm ahora 1 byte por cada llamada. Aunque en fasm se puede hacer de cualquiera de las dos maneras.