El lenguaje Assembler o ensamblador es uno de los más utilizados actualmente.
Tiene además un largo recorrido, ya que se programa en lenguajes de bajo nivel desde hace muchos años ¡más de 60!
Entonces, ¿porqué no hay tanta información de los lenguajes de bajo nivel?
El motivo es que los lenguajes de alto nivel, como pueden ser Java o Python, nos ofrecen muchas más características para hacer programación web, escritorio, etc.
Eso no significa que los lenguajes de programación de ensamblador estén obsoletos, ¡claro que no! Como he comentado al principio, es uno de los más usados.
¿Qué es el lenguaje ensamblador?
Pero empezamos por preguntar que es Assembler. Hablamos de un lenguaje de programación de bajo nivel, es decir, es el lenguaje que más se acerca al hardware del ordenador.
Se sigue utilizando para programar drivers, tareas del sistema operativos que pueden ser críticas o controladores.
A lo mejor piensas que nunca que te dedicarás a programar cosas como ésta, pero si sigues leyendo verás que no. Sigamos.
No debemos confundir un lenguaje ensamblador de un lenguaje máquina. El lenguaje máquina codifica instrucciones bit a bit (los bits son representados por 0 y 1), y esta codificación binaria es lo que ejecutará directamente el procesador/CPU de tu ordenador.
Sin embargo, es difícil codificar de esta manera para los programadores.
Si queremos escribir instrucciones precisas para el ordenador, no lo hacemos con el lenguaje máquina, utilizamos el lenguaje assembler.
El lenguaje permite escribir estas instrucciones como un texto, y un compilador traducirá las instrucciones al lenguaje máquina que hemos comentado.
Ejemplos del lenguaje ensamblador
¿Quieres ver un ejemplo? Veamos como funciona el lenguaje máquina. Échale un vistazo al siguiente ejemplo:
1110 0001 1010 0000 0100 0000 0000 0101
No entendemos prácticamente nada 😭😭😭. Quizás es más fácil saber como funciona assembler. La traducción sería:
MOV R8, R5
Es más fácil de entender que el valor que hay en el registro R5
sería copiado al registro R8
.
Las instrucciones tienen una correspondencia casi directa, ya que estamos moviendo datos, añadir o sumar valores, calcular las posiciones que hay en memoria, etc.
Otro ejemplo sería mostrar HOLA MUNDO en pantalla, con un codigo assembler más elaborado:
DATOS SEGMENT
MENSAJE DB 'HOLA MUNDO$', 0
DATOS ENDS
CODIGO SEGMENT
ASSUME CS:CODIGO, DS:DATOS
PRINCIPAL PROC
MOV AX, DATOS
MOV DS, AX
MOV AH, 9
MOV DX, OFFSET MENSAJE
INT 21H
MOV AH, 4CH
I NT 21H
PRINCIPAL ENDP
CODIGO ENDS
END PRINCIPAL
Así se haría la programación en assembler.
Luego se crearon los lenguajes de alto nivel, que añadía una capa más de abstracción para los que escriben código, haciendo la tarea de programar algo más sencilla y, lo más importante, que sea independiente del procesador en que se ejecuta.
Características del lenguaje Assembler
Ten en cuenta las siguientes características a la hora de valorar si quieres aprender a programar en ensamblador.
Estas características son:
- Un lenguaje de bajo nivel es más difícil de entender que un lenguaje de alto nivel, como puede ser Java o C++.
- Los lenguajes ensambladores ofrecen un control muy preciso de todas las instrucciones y tareas que realiza el procesador.
- El código fuente escrito en assembler está pensado para que se ejecute para un procesador concreto. Eso significa:
- Qué es más complicado que sea portable para otras máquinas ⇒ desventaja.
- Que sea mucho más eficiente, ya que consume menos recursos ⇒ ventaja.
Ahora veremos un par de lenguajes ensambladores para distintos microprocesadores.
Assembler x86
¿Y qué es Assembler x86? Empezamos diciendo que rodos los ordenadores tienen un tipo de procesador, ya se Intel o AMD, llamado procesadores x86.
Tampoco vamos a hablar de la historia de los procesadores x86, pero diremos que estos procesadores son los que se utilizan principalmente en ordenadores (ya sean personales o grandes servidores), móviles, tablets, y un largo etc. de dispositivos.
Pero, para hacer un programa para Windows, Linux o Mac, no lo vamos a hacer en Assembler. Para eso tenemos muchas otras alternativas más modernas e interesantes.
Entonces, ¿existen otros procesadores? Pues sí, por ejemplo los procesadores ARM.
ARM Assembler
Si pensamos en ARM, lo primero que se nos viene a la cabeza sería una Raspberry Pi.
Pero existen muchos más dispositivos que los utilizan: teléfonos móviles, calculadoras, GPS, PDAs (¿alguien sabe lo que es una PDA?), discos duros, juguetes, routers, etc.
Diferencia entre procesadores Intel y ARM
Los procesadores Intel permite ejecutar instrucciones más complejas en memoria, por eso se utilizan en PC.
ARM utiliza instrucciones más simplificadas, y estas instrucciones solo opera en registros. ¿Qué quiere decir eso? Qué solo las instrucciones que cargamos en memoria son las que podemos acceder.
Aunque eso parece un problema, significa que se ejecutan más rápido, aunque puede ejecutar menos instrucciones.
Ejemplos de ensambladores
Acabamos hablando de los ensambladores, que no dejan de ser los programas que se encargan compilar nuestro lenguaje ensamblador escrito.
Algunos de los más famosos son los siguientes:
- Microsoft Macro Assembler: como has adivinado en su nombre, lo creó Microsoft en su momento. Hablamos de antes de Windows, cuando existía MS-DOS.
- A86: se crearon para los procesadores Intel x86 de 16 bits, compatibles con Windows y DOS.
- Turbo Assembler: es uno de los ensambladores más conocidos. Creado por Borland para la plataforma IBM.
- GNU Assembler: el ensamblador del proyecto GNU, usado para el sistema operativo Linux.
- Flat Assembler: ensamblador libre usados para procesadores x86.