Hola mundo en FASM

Iniciado por Erik#, 6 Julio 2009, 13:10 PM

0 Miembros y 2 Visitantes están viendo este tema.

Erik#

No se si hay un hola mundo en fasm, pero es el que programo yo actualmente, y os quiero poner un hola mundo tanto con MessageBox como con printf.
+==============MESSAGEBOXA=============+

Código (asm) [Seleccionar]
include 'win32ax.inc'
.data
    holatit db 'Hola Mundo',0
    hola db 'Hola Mundo, un saludo',0
.code
start:
push 0
push hola
push holatit
push 0
call [MessageBoxA]
push 0
call [ExitProcess]
.end start


Primero declaramos la libreria con la que programaremos, en fasm es win32ax, puedes cambiar la dirección de la ruta según donde la tengas tu.
Despues abrimos el sector de código .data donde declararemos variables..
Declaramos dos variables del tipo string (db) y llenamos su contenido con comillas simples y ponemos un 0 al final.
Después abrimos el sector code donde escribiremos nuestro código y metemos start: para indicar el del comienzo del código, seguidamente usaremos la función MessageBoxA de win32.
Si os dais cuenta la sintaxis seria en otro lenguaje: MessageBox(0,hola,holatit,0);
El primer 0 corresponde al ultimo de por ejemplo en C, el holatit corresponde al titulo, el hola corresponde al mensaje a mostrar, y el ultimo 0 corresponde al primer 0 de la función en C(ejemplo).
Después invocaremos la función ExitProcess para acabar el code sin que nos salte errores.
Indicamos un 0 y después hacemos la llamada a ExitProcess.
La función call sirve para llamar a funciones o tambien se puede usar invoke.

+==============PRINTF===============+

Para usar printf invocaremos de diferentes librerias X función, se puede hacer al principio incluyendola o en el sector idata que a mi me parece más comodo, usaremos este ultimo.

Código (asm) [Seleccionar]
format pe console
entry start
include 'win32ax.inc'
.code
start:
invoke printf,'Hola Mundo'
invoke getchar
invoke ExitProcess,0
section '.idata' import data readable
library msvcrt,'msvcrt.dll',kernel32,'kernel32.dll'
import msvcrt,printf,'printf',getchar,'_fgetchar'
import kernel32,ExitProcess,'ExitProcess'


Primero comenzamos declarando que tipo de programa sera, podemos indicar GUI, console...
Después indicamos el entry start para comenzar el código de consola.
Seguidamente declaramos la libreria win32ax.
Ahora introducimos el sector de code para indicar que utilizaremos ya a programar código visible.
Ahora invocamos la función printf que posteriormente la declararemos y imprimimos Hola Mundo.
Ahora usamos la función getchar para pausar el proyecto y que podamos ver lo del printf.
Ahora utilizamos la función ExitProcess, para que no nos salte error.
Ahora utilizaremos section '.idata' import data readable para declarar dll y funciones.
Primero indicamos el nombre que les daremos para usar a las dll msvcrt y kernel32.
Ahora desde msvcrt importamos la función printf y le damos el nombre de printf y despues la función _fgetchar y le damos el nombre de getchar.
Y por utltimo desde la dll kernel32 importamos la función ExitProcess.

ny0x

nada mas ten cuidado con las apis que utilicen la convencion cdecl porque necesitas equilibrar la pila despues de llamar la funcion. yo no acostumbro a usar invoke asi que no me acuerdo si te equilibra la pila. Solo tenlo en cuenta o puedes tener errores.

Karcrack

Cita de: x0ʎu en  6 Julio 2009, 18:03 PM
nada mas ten cuidado con las apis que utilicen la convencion cdecl porque necesitas equilibrar la pila despues de llamar la funcion. yo no acostumbro a usar invoke asi que no me acuerdo si te equilibra la pila. Solo tenlo en cuenta o puedes tener errores.
Con FASM si no me equivoco puedes llamarlas poniendo 'cinvoke' :D

Eternal Idol

Es correcto lo que dice Karcrack, el codigo que use invoke con funciones cuya convencion de llamada sea C y tengan parametros jodera la pila.

"invoke in FASM is implemented as an external macro; as such, it cannot determine if the function being invoked is being called via import or directly, or if it's stdcall or c type (the PROTO directive is not used in FASM).
In other words, the invoke keyword in MASM, must be replaced in FASM with the appropriate macro:

● invoke (For stdcall function via import).
● cinvoke (For c function via import).
● stdcall (For direct call stdcall function).
● ccall (For direct call c function). "

http://www.winasm.net/what-is-fasm.html
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