Rápido

La versión actual de la página aún no ha sido revisada por colaboradores experimentados y puede diferir significativamente de la versión revisada el 10 de septiembre de 2022; las comprobaciones requieren 10 ediciones .

ensamblador plano

Captura de pantalla de FASM con código de los ejemplos proporcionados
Tipo de compilador
Desarrollador Tomasz Gryshtar
Escrito en lenguaje ensamblador
Sistema operativo Sistema operativo similar a Unix , Microsoft Windows , MS-DOS , DOS , Linux , OpenBSD , MenuetOS y KolibriOS
Primera edición 1999
ultima versión 1.73.30 [1] (21 de febrero de 2022 ) ( 2022-02-21 )
Formatos de archivo generados Formato ejecutable y enlazable , COFF y ejecutable portátil
Licencia Licencia BSD de 2 cláusulas [2]
Sitio web flatassembler.net

fasm ( abreviatura de f lat as se m bler) es un ensamblador gratuito de varias pasadas escrito por Tomasz Grysztar . fasm es independiente [1] , se compiló originalmente con TASM y se ha podido compilar a partir de fuentes nativas desde el 4 de mayo de 1999 en la versión 0.90. fasm es pequeño en tamaño y tiene una velocidad de compilación muy altasintaxis de macros rica y de gran capacidad que le permite automatizar muchas tareas rutinarias [3] [4] . Se admiten tanto los formatos de objetos como los formatos de archivos ejecutables. Esto elimina la necesidad de un enlazador en la mayoría de los casos . En otros casos, debe usar enlazadores de terceros, ya que uno no se distribuye con fasm.

Además del conjunto de instrucciones básico del procesador y coprocesador[ ¿Qué? ] , fasm es compatible con MMX , SSE , SSE2 , SSE3 , SSSE3 , SSE4.1 , SSE4.2 , SSE4a , AVX , AVX-2 , AVX-512 , 3DNow! , extensiones adicionales AES , CLMUL , FMA , FMA4 , XOP y EM64T y AMD64 (incluidos AMD SVM e Intel SMX).

Todas las variaciones de fasm pueden crear directamente archivos de salida en los siguientes formatos predefinidos en ensamblador: archivos de objeto (estándar para la mayoría de los ensambladores): formato ejecutable y vinculable (ELF) o formato de archivo de objeto común (COFF) (clásico o en la especificación de Microsoft), archivos ejecutables (no requiere enlazadores adicionales): MZ , ELF o Portable Executable (PE) (controladores WDM incluidos, con la capacidad de configurar el código auxiliar MZ DOS). Para generar archivos en un formato diferente a los preestablecidos, existe un formato de archivo binario que le da al programador control total sobre cada byte del archivo de salida, sin embargo, el programador tendrá que describir toda la estructura, el contenido y las relaciones de dicho archivo. archivo directamente.

Las arquitecturas de destino nativas son las arquitecturas IA32 y x86-64 . Existe un complemento fasmarm no oficial que tiene arquitecturas de destino nativas ARM y ARM64 . La implementación de arquitecturas de destino distintas de la nativa es similar a una implementación similar en cualquier otro ensamblador: se utilizan macros y directivas de definición de datos para estos fines.

Compilación

La compilación de un programa en fasm consta de tres etapas: preprocesamiento, análisis y ensamblaje.

Preprocesamiento

La primera etapa (preprocesamiento ) se realiza en 1 paso, primero se tokeniza el texto fuente, luego se reconocen y procesan todas las directivas del procesador, se expanden todas las macros y todas las constantes simbólicas. Dado que no hay pases adicionales para esta etapa, cualquier elemento de idioma procesado en esta etapa debe declararse primero antes de que pueda usarse.

Análisis

La segunda etapa, en esta etapa, se lleva a cabo una clasificación adicional de tokens (porque incluso los tipos de tokens y los requisitos para ellos en las etapas de preprocesamiento y ensamblaje son ligeramente diferentes), para algunos tokens se crean estructuras de propiedades adicionales, que serán más tarde se utilizará durante el montaje.

Asamblea

En la etapa de ensamblaje, se determinan las direcciones de las etiquetas , se procesan las directivas condicionales, se abren los bucles y se genera el programa real. fasm es un ensamblador de varias pasadas, lo que le permite realizar algunas optimizaciones (por ejemplo, generar un salto corto a una etiqueta en lugar de uno largo). Durante una pasada, es posible que el compilador no siempre evalúe la expresión en las directivas condicionales. En este caso, hace alguna elección e intenta compilar más. Debido a que las direcciones de etiqueta calculadas en el paso N se utilizan en el paso N+1, este proceso generalmente converge.

Historia

El proyecto fue iniciado en 1999 por Tomasz Grysztar ( polaco: Tomasz Grysztar ), quien era estudiante en ese momento. Su código fuente fue escrito completamente en lenguaje ensamblador TASM . A partir de la versión 0.90 (4 de mayo de 1999), el ensamblador fasm se volvió autosuficiente (su código fuente fue adaptado al dialecto nativo y ensamblado por el ensamblador fasm). En marzo de 2000, se publicó fasm en Internet.

Inicialmente, fasm solo se ejecutaba en modo real plano de 16 bits . Luego se agregó soporte de 32 bits, y además de eso, soporte DPMI . El código fuente se ha reescrito para que pueda trasladarse fácilmente a cualquier sistema operativo x86 que admita direccionamiento de 32 bits. Fue portado a Windows, luego a Linux.

Principios

Fasm tiende a utilizar el conjunto más pequeño posible de directivas de preprocesador, es decir, en un conjunto predefinido de directivas, no está permitido introducir nuevas directivas, cuya funcionalidad se puede lograr mediante un conjunto de directivas existente. Las excepciones son directivas históricamente intercambiables.

Fasm es un ensamblador multipaso con predicción optimista, es decir en el primer paso, el ensamblador asume que todas las instrucciones toman su forma más pequeña posible. El paso múltiple también permite que las expresiones se usen indefinidamente antes de que se declaren.

Fasm no incluye declaraciones de procedimientos no utilizados en el archivo de salida (implementado a través de macros).

El contenido del archivo de salida depende únicamente del contenido del código fuente y no depende del entorno del sistema operativo ni de los parámetros pasados ​​en la línea de comandos. Para aquellos a quienes este principio les resultó inconveniente para win32, se desarrolló el envoltorio FA , que le permite conectar otro archivo al archivo no directamente en el código, sino a través de la línea de comando.

El código fuente de fasm puede integrarse directamente en un archivo ejecutable, saltándose las etapas de creación de archivos de objetos intermedios y vinculándolos.

Proceso de compilación

La compilación del código fuente se lleva a cabo en varias etapas aisladas entre sí.

Convertir la salida al formato solicitado

Los bloques de datos de salida se enmarcan con las cabeceras necesarias para el formato, se procesan las relaciones entre datos y cabeceras, se calculan checksums, tamaños de bloque... Se genera un archivo de salida.

Formato de instrucción

Se utiliza la sintaxis de Intel para escribir instrucciones.

La única diferencia significativa con el formato adoptado en otros ensambladores ( MASM , TASM en modo de compatibilidad con MASM) es que el valor de una celda de memoria siempre se escribe como [label_name], pero simplemente label_namesignifica la dirección (es decir, el número de serie) de la celda. Esto le permite prescindir de la palabra clave offset. También en fasm, al redefinir el tamaño de un operando, byte ptrsimplemente se escribe en lugar de byte, en lugar de word ptr - , etc. No está wordpermitido usar varios corchetes en un operando; por lo tanto, [bx][si]debe escribir en su lugar [bx+si]. Estos cambios de sintaxis dieron como resultado un código más unificado y más fácil de leer.

Ejemplo de programa

Un programa de ejemplo de Windows ¡Hola, mundo! ”, que imprime este mensaje con una función MessageBoxy termina con:

formato pe gui 4 .0 inicio de entrada incluye ' win32a.inc ' inicio: invocar MessageBox , NULL , mensaje , mensaje , MB_OK invocar ExitProcess , 0 mensaje db ' ¡Hola , mundo ! ' , 0 biblioteca de importación de datos kernel32 , ' kernel32.dll ' , \ user32 , ' user32.dll ' include ' api / kernel32.inc ' include ' api / user32.inc ' end data

O así:

incluir ' win32ax.inc ' .code main: invocar MessageBox , NULL , ' Hello , World ! ' , ' Cuadro de mensaje Fasm : ' , MB_OK invocar ExitProcess , 0 .end main

Una versión más complicada, con aclaración de secciones en el archivo PE :

formato pe gui inicio de entrada incluye ' win32a.inc ' sección ' .data ' datos legibles y escribibles mensaje db ' ¡Hola , mundo ! ' , 0 sección ' .code ' código ejecutable legible inicio: invocar MessageBox , NULL , mensaje , mensaje , MB_OK invocar ExitProcess , 0 sección ' .idata ' datos de importación legible biblioteca de escritura kernel32 , ' kernel32.dll ' , \ user32 , ' user32.dll ' import kernel32 , \ ExitProcess , ' ExitProcess ' import user32 , \ MessageBox , ' MessageBoxA '

Un ejemplo de un programa de consola simple en formato .COM :

org 100h _ mov ah , 9 h mov dx , hola int 21 h mov ah , 8 h int 21 h int 20 h hola db 13 , 10 , " ¡ Hola , mundo ! $ "

Un ejemplo de un programa simple en formato ELF .

formato ELF ejecutable 3 entrada inicio segmento ejecutable legible inicio: mov eax , 4 mov ebx , 1 mov ecx , msg mov edx , msg_size int 0x80 mov eax , 1x o ebx , ebx int 0x80 _ segmento legible escribible msg db ' ¡Hola mundo ! ' , 0xA tamaño_mensaje = $-mensaje

Formato de archivo de salida

Usando la directiva format, puede especificar los siguientes formatos de archivo de salida:

  • MZ - Archivos ejecutables de DOS .
  • PE - Archivos ejecutables de Windows (consola, aplicaciones gráficas y bibliotecas dinámicas).
    • PE64 - archivos ejecutables de versiones de Windows de 64 bits.
  • COFF, MS COFF, MS64 COFF son archivos de objetos.
  • ELF, ELF64 son archivos ejecutables en sistemas tipo Unix .
  • ARM — desarrollo de entusiastas [5] .
  • Binary - archivos de estructura arbitraria. Especificar un desplazamiento de 100h( ) genera un org 100harchivo ejecutable en formato .COM . También format binarypuede compilar archivos de datos con [6] .

Sistemas operativos

Aplicación

Sistemas operativos escritos en FASM:

  • DexOS por Ville Turijanmaa
  • MenuetOS: sistemas operativos gráficos de 32 y 64 bits de Ville Turijanmaa
  • KolibriOS - una bifurcación de MenuetOS

Compiladores que usan FASM como ensamblador de back-end:

IDE basado en FASM:

  • Fresh es un proyecto apoyado por la comunidad fundado por John Found

Compatibilidad con fasm en software de terceros

El archivo de soporte de sintaxis fasm viene con el paquete base de Vim .

El uso de fasm es compatible con muchos IDE especializados como RadASM , WinAsm Studio , Fresh (especialmente diseñado para fasm), etc.

Notas

  1. 1 2 Descarga del ensamblador plano  . flatassembler.net . Consultado el 26 de agosto de 2019. Archivado desde el original el 31 de agosto de 2019.
  2. https://github.com/tgrysztar/fasm/blob/752cc50465e38a98a2b6ed1161983988e4d5f61a/LICENSE.TXT
  3. Tomasz Grysztar. Manual del programador de ensamblador plano  (inglés)  (enlace descendente) . Consultado el 27 de mayo de 2012. Archivado desde el original el 31 de mayo de 2012.
  4. Randall Hyde. ¿Qué ensamblador es el mejor?  (Inglés)  (enlace inaccesible) . Consultado el 27 de mayo de 2012. Archivado desde el original el 31 de mayo de 2012.
  5. BRAZO  FASM . flatassembler.net .
  6. ↑ Hilo oficial del foro sobre la creación de imágenes con macros fasm  . Consultado el 26 de agosto de 2019. Archivado desde el original el 4 de agosto de 2020.

Enlaces