ensamblador plano | |
---|---|
| |
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 ) |
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.
La compilación de un programa en fasm consta de tres etapas: preprocesamiento, análisis y ensamblaje.
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.
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.
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.
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.
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.
La compilación del código fuente se lleva a cabo en varias etapas aisladas entre sí.
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.
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.
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 dataO así:
incluir ' win32ax.inc ' .code main: invocar MessageBox , NULL , ' Hello , World ! ' , ' Cuadro de mensaje Fasm : ' , MB_OK invocar ExitProcess , 0 .end mainUna 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 = $-mensajeUsando la directiva format, puede especificar los siguientes formatos de archivo de salida:
Sistemas operativos escritos en FASM:
Compiladores que usan FASM como ensamblador de back-end:
IDE basado en FASM:
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.
lenguaje ensamblador | |
---|---|
IDE | |
traductores | |
Formatos de sintaxis |