Trasteando con Ensamblador: primera parte

¿Que es Ensamblador?

Para no entrar en demasiados tecnicismos, podríamos decir que Ensamblador es un lenguaje de programación de bajo nivel que nos acerca mas a las instrucciones que el propio procesador entiende que a un lenguaje comprensible por los humanos, me explico: Los lenguajes de programación se dividen en dos grandes grupos, los lenguajes de alto nivel donde podemos encontrar( Python, Visual Basic, Delphi, Perl, PHP, ECMAScript, Rub,etc..) digamos que estos lenguajes son los que generan mayor capacidad de abstracción sobre la maquina, por lo que nosotros programamos en un lenguaje que esta muy alejado del propio lenguaje maquina, y es el compilador o el interprete el que hace la transformación para que ese lenguaje sea comprensible por la maquina y los lenguajes de bajo nivel(código maquina,ensamblador,etc..) estos lenguajes nos permiten escribir código que sera comprensible por la maquina, estos lenguajes nos permiten transformar nuestro código en lenguaje maquina, sin necesidad de un compilador o interprete.

El lenguaje C es un caso raro, puesto que es una mezcla de lenguaje de Alto y bajo nivel a la vez.

Codigo
Vamos a ver un pequeño ejemplo de código ensamblador, de un simple ejemplo de un programa en c, para que entendamos a que nos estamos refiriendo.

  • Escribimos un sencillo programa de «hola mundo» en lenguaje c en nuestro editor favorito

include <stdio.h>

int main()
{
        printf("Hola elbinario\n");
        return 0;
        }
  • Salvamos el archivo con extension .c

    hola.c
    
  • Compilamos

    gcc -o hola hola.c
    
    • Ejecutamos

      ./hola
      

Desamblar

Ahora que tenemos nuestro binario, vamos a desamblarlo para ver el lenguaje maquina que hay en su interior.

  • Obtenemos información sobre el binario

    objdump -f hola
    

Aquí podemos ver el tipo de fichero y la arquitectura donde ha sido compilado

  • Obtenemos la informacion en instrucciones de ASM/ensamblador

     objdump -d hola 
    

  • Si queremos ver TODA la informacion de nuestro binario tendremos que usar

        objdump -S hola
    

¿Y como quedaría nuestro hola mundo en lenguaje ensamblador directamente desde el codigo c?

  • Para poder ver como seria el codigo ensamblador de vuestro codigo en c

      gcc -S hola.c
    

    Esto creara un archivo llamado hola.s, que tan solo tendréis que visualizar para ver un contenido como este:

Como primera parte creo que lo voy a dejar a ti os dejo que os familiaricéis con las herramientas y los conceptos, porque la segunda parte tiene algo mas de tecnicismo, para entender como funciona el lenguaje maquina y como podemos debugear archivos binarios de linux elf para hacer «cositas»

Happy hacking

Compartir

5 Comentarios

  1. Sencillo y espectacular.

    Andaba aprendiendo yo ensamblador de Z80 para ZX Spectrum con este tutorial https://wiki.speccy.org/cursos/ensamblador/indice , todavía no he hecho nada que pueda demostrar mis conocimientos.

    Porque como punto añadir, el ensamblador aunque mas o menos es igual, depende mucho de la CPU y de la arquitectura de alrededor (memoria, puertos I/O, interrupciones…), como en lo que he dicho antes, Z80 es de 8bits con sus cosas y las tripas de alrededor es el ZX Spectrum con sus formas de organizada la memoria y la pantalla y tal.

    Desensamblar es muy útil para el software libre porque tenemos el caso de https://github.com/OpenRCT2/OpenRCT2 que han cogido un juego de hace unos añitos privativo aunque muy bueno, lo desensamblado y ahora está para GNU/Linux.

    Y bueno ya que estoy suelto la pregunta al aire, ¿Cómo puedo hacer lo mismo? Por ejemplo cojo el juego Dungeon Keeper o el juego PC Futbol 6 y lo desensamblo…pero como genero los distintos fichero C con el «ensamblador embebido» porque no es ensamblador es como C con pinta ensamblador que he visto en el OpenRCT2.

  2. si quieres aprender ensamblador del zx spectrum (Z80) te vendra muy bien el libro the complette spectrum rom desamsebly, que lleva toda la rom del spectrum desensamblada y esplicada. Todos los programas en ensamblador del spectrum se valian de llamadas directas a estas rutinas de la rom para no repetir procesos inutilmente ya que la memoria era muy imitada.

    1. Oído cocina, me apunto el libro…primero quería ser capaz de hacer algo cutrecillo pero sudando yo mismo para aprender de verdad.

Deja una respuesta

Your email address will not be published. Required fields are marked *

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax