High Level Assembly ( HLA ) es un lenguaje ensamblador de alto nivel desarrollado por Randall Hyde . Permite el uso de construcciones de lenguaje de nivel superior para ayudar tanto a los desarrolladores de ensamblajes principiantes como a los avanzados. Es totalmente compatible con tipos de datos avanzados y programación orientada a objetos . Utiliza una sintaxis basada libremente en varios lenguajes de programación de alto nivel (HLL), como Pascal , Ada , Modula-2 y C ++ , para permitir la creación de programas en lenguaje ensamblador legibles y para que los programadores de HLL aprendan HLA lo más rápido posible. .
Desarrollador (es) | Randall Hyde |
---|---|
Lanzamiento estable | 2.16 / 6 de julio de 2011 |
Repositorio | sourceforge |
Escrito en | Lenguaje ensamblador |
Sistema operativo | Windows , Linux , FreeBSD , macOS |
Plataforma | IA-32 |
Disponible en | inglés |
Tipo | Ensamblador |
Licencia | Dominio publico |
Sitio web | plantation-productions |
Orígenes y objetivos
HLA se concibió originalmente como una herramienta para enseñar programación en lenguaje ensamblador a nivel universitario. El objetivo es aprovechar el conocimiento de programación existente de los estudiantes cuando aprenden lenguaje ensamblador para que se pongan al día lo más rápido posible. La mayoría de los estudiantes que toman un curso de programación en lenguaje ensamblador ya han sido introducidos a estructuras de flujo de control de alto nivel , como IF, WHILE, FOR, etc. HLA les permite a los estudiantes aplicar inmediatamente ese conocimiento de programación a la codificación en lenguaje ensamblador al principio de su curso, lo que les permite dominar otros temas de requisitos previos en ensamblaje antes de aprender a codificar formas de bajo nivel de estas estructuras de control. El libro El arte de la programación en lenguaje ensamblador de Randall Hyde utiliza HLA para este propósito. [1]
Ensamblador de alto o bajo nivel
El ensamblador HLA v2.x admite las mismas instrucciones de máquina de bajo nivel que un ensamblador normal de bajo nivel. La diferencia es que los ensambladores de alto nivel, como HLA, Microsoft Macro Assembler (MASM) o Turbo Assembler (TASM), en la familia de procesadores Intel x86 , también admiten declaraciones de tipo lenguaje de alto nivel, como IF, WHILE , etc., y directivas de declaración de datos más sofisticadas, como estructuras : registros , uniones e incluso clases .
A diferencia de la mayoría de las otras herramientas de ensamblador, el compilador HLA incluye una biblioteca estándar con miles de funciones, procedimientos y macros que se pueden usar para crear aplicaciones completas con la facilidad de un lenguaje de alto nivel. Si bien las bibliotecas en lenguaje ensamblador no son nuevas, un lenguaje que incluye una gran biblioteca estandarizada hace que sea mucho más probable que los programadores utilicen dicho código de biblioteca en lugar de simplemente escribir sus propias funciones de biblioteca.
HLA admite las mismas instrucciones de máquina de bajo nivel que otros ensambladores x86. Además, las estructuras de control de alto nivel de HLA se basan en las que se encuentran en MASM y TASM, cuyas características similares a HLL son anteriores a la llegada de HLA por varios años. En HLA, el código ensamblador de bajo nivel se puede escribir tan fácilmente como con cualquier otro ensamblador simplemente ignorando las construcciones de control HLL. A diferencia de los HLL como Pascal y C (++), HLA no requiere declaraciones ASM en línea. En HLA, las características similares a HLL parecen proporcionar una ayuda de aprendizaje para los programadores de ensamblaje principiantes al suavizar la curva de aprendizaje, con el supuesto de que dejarán de usar esas declaraciones una vez que dominen el conjunto de instrucciones de bajo nivel. En la práctica, muchos programadores experimentados continúan usando declaraciones similares a HLL en HLA, MASM y TASM, mucho después de dominar el conjunto de instrucciones de bajo nivel, pero esto generalmente se hace para mejorar la legibilidad.
También es posible escribir programas de alto nivel usando HLA, evitando gran parte del tedio de la programación en lenguaje ensamblador de bajo nivel. Algunos programadores en lenguaje ensamblador rechazan HLA de plano, porque les permite hacer esto. Sin embargo, la compatibilidad con la programación tanto de alto nivel como de bajo nivel le da a cualquier lenguaje un rango ampliado de aplicabilidad. Si uno debe hacer solo codificación de bajo nivel, eso es posible. Si hay que escribir un código más legible, una opción es utilizar declaraciones de nivel superior.
Características distintivas
Dos características de HLA lo distinguen de otros ensambladores x86: su potente sistema de macros (lenguaje en tiempo de compilación) y la biblioteca estándar de HLA.
Sistema de macros
El lenguaje en tiempo de compilación de HLA permite extender el lenguaje con facilidad, incluso para crear pequeños lenguajes específicos de dominio para ayudar a resolver fácilmente problemas de programación comunes. La macro stdout.put
descrita brevemente anteriormente es un buen ejemplo de una macro sofisticada que puede simplificar la programación. Considere la siguiente invocación de esa macro:
stdout.put( "I=", i, " s=", s, " u=", u, " r=", r:10:2, nl );
La macro stdout.put procesa cada uno de los argumentos para determinar el tipo de argumento y luego llama a un procedimiento apropiado en la biblioteca estándar HLA para manejar la salida de cada uno de estos operandos.
La mayoría de los ensambladores proporcionan algún tipo de capacidad macro: la ventaja que ofrece HLA sobre otros ensambladores es que puede procesar argumentos macro, como r:10:2
usar las funciones extensivas de cadena en tiempo de compilación de HLA, y las instalaciones macro de HLA pueden inferir los tipos de variables y usar esa información para dirigir macro expansión.
El lenguaje de macros de HLA proporciona una función de macros sin contexto especial . Esta función permite escribir fácilmente macros que abarcan otras secciones de código a través de un par de macros de inicio y finalización (junto con invocaciones de macros intermedias opcionales que solo están disponibles entre las macros de inicio y finalización). Por ejemplo, se puede escribir una declaración SWITCH-CASE-DEFAULT-ENDSWITCH completamente recursiva-anidable utilizando esta función de macro.
Debido al diseño libre de contexto de las macro facilidades HLA, estas sentencias switch..case..default..endswitch se pueden anidar, y el código emitido de las sentencias anidadas no entrará en conflicto con las sentencias externas.
Lenguaje en tiempo de compilación
El sistema de macros HLA es en realidad un subconjunto de una función más grande conocida como Lenguaje de tiempo de compilación HLA (CTL). HLA CTL es un lenguaje interpretado que está disponible en un archivo fuente de programa HLA. Un intérprete ejecuta declaraciones HLA CTL durante la compilación de un archivo fuente HLA; de ahí el nombre de lenguaje en tiempo de compilación .
El HLA CTL incluye muchas declaraciones de control como #IF, #Mientras, #FOR, #PRINT, una declaración de asignación y así sucesivamente. También se pueden crear variables y constantes en tiempo de compilación (incluidos tipos de datos estructurados, como registros y uniones). El HLA CTL también proporciona cientos de funciones integradas (incluido un conjunto muy rico de funciones de coincidencia de cadenas y patrones). El HLA CTL permite a los programadores crear programas CTL que escanean y analizan cadenas, lo que permite a esos programadores crear lenguajes específicos de dominio incrustados (EDSL, también denominados mini-lenguajes ). La stdout.put
macro que aparece anteriormente es un ejemplo de tal EDSL. La macro put (en el espacio de nombres stdout, de ahí el nombre stdout .put) analiza su lista de parámetros de macro y emite el código que imprimirá sus operandos.
Biblioteca estándar
La biblioteca estándar de HLA es un extenso conjunto de rutinas y macros preescritas (como la macro stdout.put descrita anteriormente) que facilitan la vida a los programadores, evitando que reinventen la rueda cada vez que escriben una nueva aplicación. Quizás igualmente importante, la biblioteca estándar de HLA permite a los programadores escribir aplicaciones portátiles que se ejecutan en Windows o Linux con nada más que volver a compilar el código fuente . Al igual que la biblioteca estándar C para el lenguaje de programación C , la biblioteca estándar HLA permite abstraer las llamadas al sistema operativo (SO) de bajo nivel , por lo que el mismo conjunto de interfaces de programación de aplicaciones (API) del SO puede servir para todos los sistemas operativos que admite HLA. Mientras que un lenguaje ensamblador permite realizar las llamadas necesarias al sistema operativo, donde los programas utilizan el conjunto de API de la biblioteca estándar de HLA, escribir programas portátiles del sistema operativo es fácil.
La biblioteca estándar de HLA proporciona miles de funciones, procedimientos y macros. Si bien la lista cambia con el tiempo, a mediados de 2010 para HLA v2.12, incluía funciones en estas categorías:
- Procesamiento de argumentos de la línea de comandos
- Declaración y manipulación de matrices (dinámicas)
- Manipulación de bits
- Manipulación de blobs (objetos grandes binarios)
- Manipulación de personajes
- Conversiones
- Manipulación del juego de caracteres
- Funciones de fecha y hora
- E / S de archivos orientada a objetos
- E / S de archivo estándar
- Funciones de manipulación del sistema de archivos, por ejemplo, eliminar, renombrar, cambiar de directorio
- Declaraciones y funciones relacionadas con HLA
- La biblioteca de Windows de objetos HLA: marco orientado a objetos para la programación Win32
- Manipulación de listas vinculadas
- Funciones matematicas
- Gestión y asignación de memoria
- API específicas de FreeBSD
- API específicas de Linux
- API específicas de MacOS
- API específicas de Win32
- Funciones de la consola de texto
- Soporte de corrutina
- Soporte de variable de entorno
- Soporte de manejo de excepciones
- Compatibilidad con archivos asignados en memoria
- Compatibilidad con sockets y objetos cliente-servidor
- Soporte de subprocesos y sincronización
- Funciones de temporizador
- Compatibilidad con la coincidencia de patrones para expresiones regulares y lenguajes libres de contexto
- Generadores de números aleatorios
- Soporte de llamada de procedimiento remoto
- Funciones de salida de error estándar
- Funciones de salida estándar
- Funciones de entrada estándar
- Funciones de cadena
- Soporte de mesa (asociativo)
- Funciones de cadena terminadas en cero
Diseño
El sistema de lenguaje HLA v2.x es una herramienta basada en la línea de comandos que consta de varios componentes, incluido un programa de shell (por ejemplo, hla.exe en Windows), el compilador de lenguaje HLA (por ejemplo, hlaparse.exe), un traductor (por ejemplo, HLABE o HLA Back Engine), un enlazador (link.exe en Windows, ld en Linux) y otras herramientas como un compilador de recursos para Windows. Las versiones anteriores a la 2.0 se basaban en un back-end de ensamblador externo; las versiones 2.xy posteriores de HLA utilizan el HLABE integrado como formateador de código de objeto de fondo.
La aplicación de shell HLA procesa los parámetros de la línea de comandos y enruta los archivos apropiados a cada uno de los programas que componen el sistema HLA. Acepta como .hla
archivos de entrada (archivos fuente HLA), .asm
archivos (archivos fuente para ensambladores MASM, TASM, FASM, NASM o Gas), .obj
archivos para entrada al enlazador y .rc
archivos (para uso por un compilador de recursos).
Traducción de código fuente
Originalmente, la herramienta HLA v1.x compilaba su código fuente en un archivo fuente intermedio que un ensamblador de back-end como MASM, TASM, ensamblador plano ( FASM ), Ensamblador Netwide (NASM) o Ensamblador GNU (Gas) traduciría en el archivo de código de objeto de bajo nivel. A partir de HLA v2.0, HLA incluía su propio motor de respaldo HLA (HLABE) que proporcionaba la traducción del código de objeto de bajo nivel. Sin embargo, a través de varios parámetros de línea de comandos, HLA v2.x aún tiene la capacidad de traducir un archivo fuente HLA a un archivo fuente que sea compatible con uno de estos otros ensambladores.
Motor trasero HLA
HLA Back Engine (HLABE) es un compilador back-end que traduce un lenguaje intermedio interno en un ejecutable portátil (PE) de bajo nivel , formato de archivo de objeto común ( COFF ), formato ejecutable y enlazable (ELF) o código de objeto Mach-O . Un programa HLABE consiste principalmente en declaraciones de emisión de datos (bytes), declaraciones de direcciones reubicables de 32 bits, instrucciones de transferencia de control x86 y varias directivas. Además de traducir el byte y las declaraciones de direcciones reubicables al formato de código de objeto de bajo nivel, HLABE también maneja la optimización del desplazamiento de rama (eligiendo la forma más corta posible de una instrucción de rama).
Aunque HLABE está incorporado en el compilador HLA v2.x, en realidad es un producto separado. Es de dominio público y de código abierto (alojado en SourceForge.net ).
Ver también
Notas
- ^ " El arte de la programación en lenguaje ensamblador " . Archivado desde el original el 29 de marzo de 2018 . Consultado el 12 de febrero de 2010 .
Referencias
- Richard Blum, lenguaje ensamblador profesional , Wiley, 2005, ISBN 0-7645-7901-0 , pág. 42
- Randall Hyde , Write Great Code: Understanding the machine , No Starch Press , 2004, ISBN 1-59327-003-8 , págs. 14-15 y se utiliza en todo el libro
- Randall Hyde , El arte del lenguaje ensamblador, 2da edición , No Starch Press , 2010, ISBN 1-59327-207-3 , utilizado en todo el libro
Otras lecturas
- Paul Panks (29 de junio de 2005), HLA: El lenguaje de programación ensamblador de alto nivel , Linux Journal
enlaces externos
- Página web oficial
- Descargas para Windows, macOS y Linux