Ensamblador de toda la red
El Netwide Assembler (NASM) es un ensamblador y desensamblador para la arquitectura Intel x86. Se puede utilizar para escribir programas de 16 bits, 32 bits (IA-32) y 64 bits (x86-64). Es considerado uno de los ensambladores más populares para Linux.
Fue escrito originalmente por Simon Tatham con la ayuda de Julian Hall. A partir de 2016, lo mantiene un pequeño equipo dirigido por H. Peter Anvin. Es un software de código abierto lanzado bajo los términos de una licencia BSD simplificada (2 cláusulas).
Características
NASM puede generar varios formatos binarios, incluidos COFF, OMF, a.out, formato ejecutable y vinculable (ELF), Mach-O y archivo binario (.bin, imagen de disco binario, utilizado para compilar sistemas operativos), aunque la posición -El código independiente solo se admite para archivos de objetos ELF. También tiene su propio formato binario llamado RDOFF.
La variedad de formatos de salida permite redirigir los programas a prácticamente cualquier sistema operativo (SO) x86. También puede crear archivos binarios planos, utilizables para escribir cargadores de arranque, imágenes de memoria de solo lectura (ROM) y en varias facetas del desarrollo del sistema operativo. Puede ejecutarse en plataformas que no sean x86 como ensamblador cruzado, como PowerPC y SPARC, aunque no puede generar programas utilizables por esas máquinas.
NASM utiliza una variante de la sintaxis ensambladora de Intel en lugar de la sintaxis de AT&T. También evita funciones como la generación automática de anulaciones de segmentos (y la directiva ASSUME relacionada) utilizada por MASM y ensambladores compatibles.
Programas de muestra
A "¡Hola, mundo!" programa para el sistema operativo DOS:
Sección .textorg 0x100movah, 0x9movdx, Hola.int0x21movax, 0x4c00int0x21Sección .dataHola.db ¡Hola, mundo! ', 13, 10, '$'
Un programa equivalente para Linux:
mundial ¡No!Sección .text_start:moveax, 4 ; escribirmovebx, 1 ; stdoutmovecx, msgmovedx, msg.lenint0x80 ; escriba (stdout, msg, strlen(msg));xoreax, msg.len ; invertir el valor de retorno de la escritura()xchg eax, ebx ; valor para la salida()moveax, 1 ; salidaint0x80 ; salida(...)Sección .datamsg:db"¡Hola, mundo!", 10.len:equo$ - msg
Un ejemplo de un programa similar para Microsoft Windows:
mundial _mainexterna _MessageBoxA@16externa _ExitProcess@4Sección código use32 clase=código_main:empujardword 0 ; UINT uType = MB_OKempujardword Título ; LPCSTR lpCaptionempujardword banner ; LPCSTR lpTextempujardword 0 ; HWND hWnd = NULLllamada_MessageBoxA@16empujardword 0 ; UINT uExitCodellamada_ExitProcess@4Sección datos use32 clase=datosbanner:db ¡Hola, mundo! ', 0Título:db ' Hola. ', 0
Un programa de 64 bits para Apple OS X que ingresa una pulsación de tecla y la muestra en la pantalla:
mundial ¡No!Sección .dataquery_string:db"Entra un personaje: "query_string_len:equo$ - query_stringout_string:db"Tienes entrada: "out_string_len:equo$ - out_stringSección .bssin_char:Resw 4Sección .text_start:movrax, 0x2000004; poner el código de llamadas del sistema de escritura en rax de registromovrdi, 1; dígale al kernel que use stdoutmovrsi, query_string; rsi es donde el núcleo espera encontrar la dirección del mensajemovrdx, query_string_len; y rdx es donde el núcleo espera encontrar la longitud del mensaje syscall; leer en el personajemovrax, 0x2000003; read system callmovrdi, 0; stdinmovrsi, in_char; dirección para almacenamiento, declarada en sección. bssmovrdx, 2; obtener 2 bytes del búfer del núcleo (uno para el retorno del carruaje)syscall; mostrar al usuario la salidamovrax, 0x2000004; llamada del sistema de escrituramovrdi, 1; stdoutmovrsi, out_stringmovrdx, out_string_lensyscallmovrax, 0x2000004; llamada del sistema de escrituramovrdi, 1; stdoutmovrsi, in_charmovrdx, 2; el segundo byte es aplicar el retorno de carro esperado en la cadenasyscall; llamada del sistema de salidamovrax, 0x2000001; llamada del sistema de salidaxor rdi, rdisyscall
Enlace
NASM genera principalmente archivos de objetos, que generalmente no son ejecutables por sí mismos. La única excepción a esto son los binarios planos (p. ej.,.COM) que están inherentemente limitados en el uso moderno. Para traducir los archivos de objeto en programas ejecutables, se debe utilizar un enlazador apropiado, como Visual Studio "LINK" utilidad para Windows o ld para sistemas tipo Unix.
Desarrollo
La versión 0.90 de NASM se lanzó en octubre de 1996.
La versión 2.00 se lanzó el 28 de noviembre de 2007 y agregó soporte para extensiones x86-64. Las versiones de desarrollo no se cargan en SourceForge.net, pero se registran en GitHub con instantáneas binarias disponibles en la página web del proyecto.
También está disponible un motor de búsqueda para la documentación de NASM.
En julio de 2009, a partir de la versión 2.07, NASM se lanzó bajo la licencia BSD simplificada (2 cláusulas). Anteriormente, debido a que tenía la licencia LGPL, condujo al desarrollo de Yasm, una reescritura completa de la nueva licencia BSD. Yasm ofreció soporte para x86-64 antes que NASM. También agregó soporte para la sintaxis de GNU Assembler.
RDOFF
Los desarrolladores utilizan el formato de archivo de objeto dinámico reubicable (RDOFF) para probar la integridad de las capacidades de salida de archivos de objetos de NASM. Se basa en gran medida en la estructura interna de NASM, que consiste esencialmente en un encabezado que contiene una serialización de las llamadas a funciones del controlador de salida, seguido de una serie de secciones que contienen código o datos ejecutables. Las herramientas para usar el formato, incluido un enlazador y un cargador, están incluidas en la distribución de NASM.
Hasta que se lanzó la versión 0.90 en octubre de 1996, NASM solo admitía la salida de archivos ejecutables de formato plano (por ejemplo, archivos DOS COM). En la versión 0.90, Simon Tatham agregó soporte para una interfaz de salida de archivo de objeto y para archivos DOS.OBJ solo para código de 16 bits.
NASM por lo tanto carecía de un formato de objeto de 32 bits. Para abordar esta carencia, y como un ejercicio para aprender la interfaz objeto-archivo, el desarrollador Julian Hall armó la primera versión de RDOFF, que se lanzó en la versión 0.91 de NASM.
Desde esta versión inicial, ha habido una actualización importante del formato RDOFF, que agregó un indicador de longitud de registro en cada registro de encabezado, lo que permite a los programas omitir registros cuyo formato no reconocen y admite varios segmentos; RDOFF1 solo admite tres segmentos: texto, datos y bss (que contienen datos no inicializados).
El formato RDOFF está totalmente obsoleto y se ha desactivado a partir de NASM 2.15.04.
Contenido relacionado
Protocolo de resolución de dirección inversa
Complejidad computacional
AbiPalabra