NASM | |
---|---|
Tipo de | compilador |
Autor | Simón Tatham, Julian Hall |
Desarrolladores | H. Peter Anvin, Jim Kukunas, Cyrill Gorcunov, Frank B. Kotler |
Escrito en | C [1] |
Sistema operativo | Linux , MacOS , Windows , DOS , KolibriOS |
Primera edición | 1996 |
plataforma de hardware | x86, x86_64 |
ultima versión | 2.15.05 (28 de agosto de 2020) |
Licencia | LGPL , desde la versión 2.07 - licencia BSD simplificada |
Sitio web | nasm.es |
NASM ( Netwide Assembler ) es un ensamblador gratuito ( licencia LGPL y BSD ) para la arquitectura Intel x86 . Se utiliza para escribir programas de 16, 32 y 64 bits.
NASM fue creado por Simon Tatham con Julian Hall y actualmente está siendo desarrollado por un pequeño equipo de desarrollo en SourceForge.net . Originalmente se lanzó bajo su propia licencia, pero esta licencia se cambió más tarde a GNU LGPL después de muchos problemas causados por la elección de la licencia. A partir de la versión 2.07, la licencia se ha cambiado a una "BSD simplificada" (BSD de 2 cláusulas ).
NASM puede ejecutarse en plataformas que no sean x86, como SPARC y PowerPC , pero solo genera código para x86 y x86-64 [2] .
NASM compite con éxito con el estándar de ensamblador de gas en Linux y muchos otros sistemas UNIX . [3] [4] [5] NASM se considera de mejor calidad que el gas. [5] Además, el ensamblador de gas predeterminado [6] usa la sintaxis de AT&T , que está orientada a procesadores que no son de Intel, mientras que NASM usa una variante de la sintaxis tradicional de Intel para ensambladores x86 ; La sintaxis de Intel es utilizada por todos los ensambladores de DOS/Windows, por ejemplo , MASM , TASM , fasm .
NASM utiliza la sintaxis de Intel para escribir instrucciones. Una oración en lenguaje ensamblador NASM (línea de programa) puede constar de los siguientes elementos:
Etiqueta Instrucción Operandos ComentarioLos operandos están separados por una coma. Puede utilizar cualquier número de caracteres de espacio en blanco antes de la cadena y después de la declaración. Un comentario comienza con un punto y coma y el final del comentario es el final de la línea. Se puede utilizar un comando o pseudocomando (directiva del compilador) como instrucción. Si la línea es muy larga, entonces se puede mover a la siguiente usando una barra invertida , \similar a como se hace en el lenguaje C.
NASM compila programas para varios sistemas operativos dentro de procesadores compatibles con x86. Al estar en un sistema operativo, puede compilar libremente un archivo ejecutable para otro.
La compilación de programas en NASM consta de dos pasos. El primero es el montaje , el segundo es la vinculación . En la etapa de ensamblaje, se crea el código objeto. Contiene el código de máquina del programa y los datos, de acuerdo con el código fuente , pero los identificadores (variables, símbolos) aún no están vinculados a las direcciones de memoria. En la etapa de enlace , se crea un archivo ejecutable (programa) a partir de uno o más módulos de objetos . La operación de enlace asocia identificadores definidos en el programa principal con identificadores definidos en otros módulos, después de lo cual todos los identificadores reciben direcciones de memoria finales o se asignan dinámicamente.
Para vincular archivos de objetos a ejecutables en Windows, puede usar el enlazador gratuito alink [4] (para programas de 64 bits, el enlazador GoLink), y en Linux, el enlazador ld, que está disponible en cualquier versión de este sistema operativo.
Para ensamblar el archivo, ingrese el siguiente comando:
nasm -f formato nombre de archivo -o salidaEl compilador procesa el texto del programa en varias pasadas, de modo que las instrucciones de salto se pueden colocar antes de que se declaren las etiquetas correspondientes.
En los comandos de saltos condicionales e incondicionales ( jmp), se utiliza por defecto el tipo de salto cercano — near. Por lo tanto, si es posible un salto corto, para no sobrestimar el tamaño del programa con un byte extra, es necesario especificar específicamente el tipo de salto short. A partir de la versión 0.98.09b, se han agregado las opciones de optimización -Ox , que permiten optimizar automáticamente el tamaño de las instrucciones de bifurcación [7] , en versiones anteriores o sin tales opciones, el tamaño mínimo del programa solo se puede obtener modificando manualmente el código fuente.
NASM admite muchos formatos de archivo de salida, entre ellos [8] :
El formato del archivo de salida se puede especificar usando el modificador de línea de comando -f . Los formatos pueden extender la sintaxis de algunas instrucciones y agregar sus propias instrucciones.
Ejemplos de programas ¡Hola, mundo! , que muestra el mensaje apropiado y sale.
Para el sistema operativo Linux SECCIÓN .data msg db " ¡ Hola mundo ! " , 0xa len equ $ -msg SECCIÓN .text global _start ; _ el punto de entrada del programa _start: mov eax , 4 ; 'escribir' syscall mov ebx , 1 ; descripción del archivo 1 (salida estándar) mov ecx , mensaje ; puntero a datos mov edx , len ; cantidad de datos int 0x80 ; llamar al núcleo mov eax , 1 ; '_exit' llamada al sistema mov ebx , 0 ; código de salida cero (éxito) int 0x80 ; llamar al núcleo Para sistema operativo Linux (x64) inicio_global _ sección .text _start: mov rax , 1 ; la llamada al sistema 1 es escribir mov rdi , 1 ; el identificador de archivo 1 es stdout mov rsi , mensaje ; dirección de la cadena a la salida mov rdx , 13 ; número de bytes syscall ; invocar el sistema operativo para hacer la escritura mov eax , 60 ; la llamada al sistema 60 es exit xor rdi , rdi ; código de salida 0 syscall ; invocar sistema operativo para salir mensaje: db " Hola , mundo " , 10 ; tenga en cuenta la nueva línea al final Bajo sistema operativo DOS SECCIÓN .texto org 0x100 ; esta directiva es necesaria sólo en el caso de un archivo .com que no tiene secciones mov ah , 0x9 mov dx , hello int 0x21 mov ax , 0x4c00 ; ah == 0x4c al == 0x00 int 0x21 SECCIÓN .data hola DB " ¡Hola , mundo ! " , 0xd , 0xa , ' $ ' Para sistema operativo Windows (obj) % include ' WIN32N.INC ' EXTERN MessageBoxA Import MessageBoxA user32.dll EXTERN ExitProcess Import ExitProcess kernel32.dll SECTION CODE USE32 CLASS = CODE ..start: push UINT MB_OK push LPCTSTR title push LPCTSTR banner push HWND NULL call [ MessageBoxA ] push UINT NULL call [ ExitProcess ] SECCIÓN DATOS USO32 CLASE = DATOS banner db ' ¡Hola , mundo ! ' , 0xD , 0xA , 0 título db ' Hola ' , 0 Para sistema operativo Windows x64 (objetivo) ; Hello.asm EXTERN MessageBoxW EXTERN ExitProcess SECTION .text USE64 start: sub rsp , 28 h ; 32 bytes para la convención de llamada de Microsoft x64 "espacio de sombra" + 8 bytes para la alineación de la pila al límite de 16 bytes después de la llamada puesta en la pila 8 bytes de dirección de retorno xor rcx , rcx ; HWND hWnd = NULL lea rdx , [ banner ] ; LPCTSTR lpText = banner lea r8 , [ título ] ; LPCTSTR lpCaption = título xor r9 , r9 ; UINT uType = MB_OK call MessageBoxW ; MessageBox(hWnd, lpText, lpCaption, uType) xor rcx , rcx ; UINT uExitCode = 0 call ExitProcess ; ExitProcess(uExitCode) SECCIÓN .banner de datos dw __utf16__ ( ' ¡Hola , mundo ! ' ), 0 título dw __utf16__ ( ' ¡ Hola ! ' ), 0>nasm -f win64 Hola.asm
>golink Hola.obj kernel32.dll user32.dll
lenguaje ensamblador | |
---|---|
IDE | |
traductores | |
Formatos de sintaxis |