lunes, 26 de mayo de 2014

INSTALANDO NASM Y PROBANDO HOLA MUNDO

NASM



Primeramente Nasm es un ensamblador libre para la arquitectura x86. Podemos encontrarlo para diversos sistemas operativos como Linux o Windows.  Un ensamblador permite ensamblar código en lenguaje ensamblador. (sic) 

Desgraciadamente, ensamblador significa dos cosas: 
  • El lenguaje ensamblador que permite programar en lenguaje de maquina utilizando instrucciones mnemónicas 
  • El programa que va a transformar el código en lenguaje de maquina para que pueda ser comprendido directamente por el procesador. 

INSTALAR NASM PARA UBUNTU O DEBIAN
Las características de mi equipo son:


Como se observa la instalación la he hecho para ubuntu 12.04 con arquitectura de 64 bits. La instalación está dada por consola con el comando:

$ sudo apt-get install nasm build-essential

Colocamos la constraseña y esperamos a que se instale el compilador. Terminado esto está instalado NASM.



CREANDO HOLA MUNDO EN ENSAMBLADOR
No es necesario un editor específico para crear un fichero fuente destinado a Nasm. Eventualmente podríamos utilizar un editor que soporte la coloración sintáctica del ensamblador pero que yo sepa no existe uno que soporte la sintaxis de Nasm.  Por lo tanto, podemos elegir entre gedit, sublime, kwrite, xemacs etc... 

Al guardar el siguiente código fuente se lo debe hacer con la extensión .nasm. En mi caso se llama prueba.nasm y ha sido grabado en el escritorio.


; "Hello World!" in 32 bit Linux NASM
; adapted from http://asm.sourceforge.net/intro/hello.html by Mark Loiseau
; referenced in http://blog.markloiseau.com/2012/04/hello-world-NASM-Linux
 
global _start            ; global entry point export for ld
 
section .text
_start:
 
    ; sys_write(stdout, message, length)
 
    mov eax, 4        ; sys_write syscall
    mov ebx, 1        ; stdout
    mov ecx, message    ; message address
    mov edx, length        ; message string length
    int 80h
 
    ; sys_exit(return_code)
 
    mov eax, 1        ; sys_exit syscall
    mov ebx, 0        ; return 0 (success)
    int 80h
 
section .data
    message: db 'Hello, world!',0x0A    ; message and newline
    length: equ $-message            ; NASM definition pseudo-instruction




COMPILANDO EL PROGRAMA ENSAMBLADOR EN CÓDIGO MÁQUINA
Dependiendo de la arquitectura del SO se deben ejecutar los siguientes comandos:

Sistema de 64 bits:
$ nasm -f elf64 -o prueba.o prueba.nasm

Sistema de 32 bits:
$ nasm -f elf -o prueba.o prueba.nasm

Esto traducirá el programa conjunto en x86 código de máquina que su procesador pueda entender. NASM soporta una variedad de arquitecturas. Se puede ver la lista escribiendo 
$ nasm -hf

Por desgracia, el código máquina prima no se puede ejecutar por sí mismo. Tiene que ser presentado en el sistema operativo en un formato normalizado con unas pocas piezas o metadatos relevantes. Linux utiliza el formato de ejecutables y enlazables (ELF) para ejecutables. Para ejecutar el código compilado, tenemos que vincularlo a un binario ELF.


VINCULAR EL CÓDIGO DE LA MÁQUINA EN UN BINARIO ELF
El siguiente comando utilizará ld, el enlazador dinámico y cargador, conectar nuestro código máquina compilado NASM en un binario ELF.

$ ld -o hello32 hello32.o



EJECUTANDO EL ARCHIVO EJECUTABLE
El binario ELF recién vinculado se puede ejecutar como cualquier otro programa:

$ ./hello32
Hello World!



A continuación dejo unas capturas de pantalla para observar el proceso descrito.


8 comentarios:

  1. Hola hermano, estoy trabajando de lleno en el lenguaje de bajo nivel. Me ayuda mucho tu post. Gracias.

    ResponderEliminar
  2. que tal amigo y como ago el hola mundo con una macro en ensamblador

    ResponderEliminar
  3. Hola, no se puede localizar el paquete nasm, ayuda

    ResponderEliminar
  4. ¡Puta Madre!
    Por favor....
    ¿Dónde coño de su puta madre está ese puto enlace para descargar el puto programa NASM?
    ¡Qué mama güevadas, que no dejan el maldito puto enlace para descargar esa mierda!
    Gracias y me disculpo por las molestias

    ResponderEliminar
    Respuestas
    1. hahahaha, solo tenes que correr el comando que esta arriba hahahaha

      Eliminar