Este lenguaje (ensamblador o assembler – a veces también assembly) ya tiene más de 70 años, pero todavía no piensa en jubilarse.
Existe una tradición de comenzar a aprender a programar con la salida de la frase «¡Hola, Mundo!
» en la pantalla. En el lenguaje Python, por ejemplo, esto es solo un comando:
print("¡Hola, Mundo!")
¡Todo es simple, claro y bonito! Pero existe un lenguaje de programación en el que, para obtener el mismo resultado, necesitas escribir un buen trozo de código:
.MODEL SMALL
.STACK 100h
.DATA
HelloMessage DB '¡Hola, Mundo!',13,10,'$'
.CODE
START:
mov ax,@data
mov ds,ax
mov ah,9
mov dx,OFFSET HelloMessage
int 21h
mov ah,4ch
int 21h
END START
Este es el ensamblador. Pero no pienses que es malo. Simplemente, Python es un lenguaje de alto nivel, y el ensamblador es de bajo nivel. Un comando de Python, al ejecutarse, llama a varias operaciones del procesador a la vez, mientras que cada comando del ensamblador solo ejecuta una operación.
¿Difícil? Vamos a entenderlo.

Un poco sobre los procesadores y el lenguaje de máquina
Para explicar qué es el lenguaje ensamblador, comencemos por cómo funciona el procesador y en qué lenguaje puedes «hablar» con él.
El procesador es un dispositivo electrónico (ahora es un microchip diminuto, pero antes los procesadores ocupaban salas enteras), que no entiende palabras ni cifras. Solo responde a dos niveles de voltaje: alto – uno, bajo – cero. Por lo tanto, cada comando del procesador es una secuencia de ceros y unos: 1 – hay un impulso, 0 – no hay un impulso.
Para trabajar con el procesador, se utiliza el lenguaje de máquina. Consiste en instrucciones escritas en código binario. Cada instrucción define una operación de máquina simple: aritmética con números, lógica (bit a bit), entrada-salida, etc.
Por ejemplo, para Intel 8088, la instrucción 0000001111000011B es la operación de suma de dos números, y 0010101111000011B es la resta.
Programar en lenguaje de máquina no es fácil: tienes que trabajar con largas cadenas de ceros y unos. Es difícil escribir o verificar un programa de este tipo, y aún más difícil comprender el código de otra persona.
Por eso, hace muchos años se creó el lenguaje ensamblador, en el que los códigos de las operaciones se indicaban con letras y abreviaturas de palabras inglesas que reflejan la esencia del comando. Por ejemplo, el comando mov ax, 6
significa: «mover el número 6 a la celda de memoria AX«.
¿Cuándo y cómo se creó el ensamblador?
Esto sucedió en la década de 1940. El ensamblador fue creado para las primeras computadoras con tubos de vacío, cuyos programas se escribían en lenguaje de máquina. Y como las computadoras tenían poca memoria, los comandos se introducían cambiando los interruptores y pulsando los botones. Incluso los cálculos sencillos tardaban mucho tiempo.
Se resolvió el problema cuando las computadoras aprendieron a almacenar programas en memoria. Ya en 1950 se desarrolló el primer programa traductor, que traducía al lenguaje de máquina los programas escritos en un lenguaje comprensible para los humanos. Este programa se llamó programa ensamblador, y el lenguaje – lenguaje ensamblador (del inglés assembler – ensamblador).
La aparición del ensamblador simplificó mucho la vida de los programadores. Pudieron utilizar comandos que consistían en símbolos cercanos al lenguaje habitual en lugar de códigos binarios. Además, el ensamblador permitió reducir el tamaño de los programas, lo que era importante para las máquinas de esa época.
¿Cómo funciona el lenguaje ensamblador?
El ensamblador se puede considerar como un lenguaje de segunda generación, si el primero es el lenguaje de máquina.
Funciona directamente con el procesador, y cada uno de sus comandos es una instrucción del procesador, y no del sistema operativo o del sistema de archivos. La traducción del lenguaje ensamblador a lenguaje de máquina se denomina ensamblaje.
Los comandos del ensamblador consisten en códigos de operación y operandos. Los operandos son las direcciones desde las que el procesador tomará los datos para los cálculos y en las que colocará el resultado. Las direcciones pueden ser celdas de memoria y registros – memoria dentro del procesador. El procesador trabaja con los registros mucho más rápido que con la memoria RAM.
Los códigos de operación en lenguaje ensamblador son mnemónicos, es decir, fáciles de recordar:
ADD
– suma (del inglés addition);SUB
– resta (del inglés subtraction);MUL
– multiplicación (del inglés multiplication), etc.
Los registros y las celdas de memoria reciben nombres simbólicos, por ejemplo:
EAX
,EBX
,AX
,AH
– nombres para registros;meml
– nombre para una celda de memoria.
Por ejemplo, así es como se ve el comando de sumar números de los registros AX y BX:
add ax, bx
Y este es el comando de restar números de los registros AX y BX:
sub ax, bx
Además de las instrucciones, en el lenguaje ensamblador hay directivas: comandos de control del compilador, es decir, del programa ensamblador.
Aquí hay algunos de ellos:
INCLUDE
– abrir un archivo y comenzar a compilarlo;EXIT
– detener la compilación del archivo;DEF
– asignar un nombre simbólico a un registro, etc.
No pienses que el ensamblador es solo un conjunto de instrucciones del procesador con una escritura conveniente para el programador. Este es un lenguaje de programación completo en el que puedes organizar bucles, saltos condicionales, procedimientos y funciones.
Por ejemplo, aquí tienes un código en ensamblador que imprime en pantalla los números del 1 al 10:
section .text
global _start
_start:
mov ecx,10
mov eax, '1'
l1:
mov [num], eax
mov eax, 4
mov ebx, 1
push ecx
mov ecx, num
mov edx, 1
int 0x80
mov eax, [num]
sub eax, '0'
inc eax
add eax, '0'
pop ecx
loop l1
mov eax,1
int 0x80
section .bss
num resb 1
Aquí, la acción se ejecutará en un bucle, como, por ejemplo, en los bucles for
o do while
en los lenguajes de alto nivel.
No existe un estándar único para los lenguajes ensambladores. Al trabajar con procesadores Intel, los desarrolladores se adhieren a dos sintaxis: Intel y AT&T. Ninguno de los dos tiene ventajas especiales: AT&T es la sintaxis estándar en Linux, mientras que Intel se utiliza en el mundo de Microsoft.
Un mismo comando se ve diferente en ambos.
Por ejemplo, en la sintaxis de Intel:
mov eax, ebx
- este comando mueve los datos del registro eax al registro ebx.
En la sintaxis de AT&T, este comando se ve así:
movl %eax, %ebx
¿Por qué se necesita un ensamblador diferente para diferentes familias de procesadores?
El caso es que cada procesador tiene un conjunto de características: la arquitectura. Esta es su construcción y principio de funcionamiento, así como los registros, la direccionamiento de memoria y el conjunto de comandos utilizado. Si los procesadores tienen la misma arquitectura, se dice que pertenecen a la misma familia.
Como los conjuntos de comandos para diferentes arquitecturas de procesadores son diferentes, los programas en ensamblador escritos para una familia no funcionarán en procesadores de otras familias. Por eso el ensamblador se denomina lenguaje orientado a la máquina.
¿Quién y para qué necesita el lenguaje ensamblador?
Incluso de nuestro ejemplo «¡Hola, Mundo!» se puede ver que el ensamblador no es tan cómodo en el desarrollo como los lenguajes de alto nivel. Actualmente, nadie escribe programas grandes en este lenguaje, pero hay áreas en las que es insustituible:
- En ensamblador se desarrollan programas integrados para microcontroladores. Estos son miniordenadores que se instalan en sistemas de alarma, paneles de control, sensores, electrodomésticos, módems y en muchos otros dispositivos. Los microcontroladores se utilizan incluso en robótica y sistemas de navegación por satélite. El volumen de memoria de estos miniordenadores es limitado, y el ensamblador es cómodo para su programación porque un comando suyo se traduce en un comando en código binario. Por el texto fuente del programa se puede determinar el tiempo de ejecución y el volumen de memoria para su almacenamiento.
- En ensamblador se escriben controladores de dispositivos y algunos componentes de los sistemas operativos, como el kernel o el gestor de arranque. Los sistemas operativos aficionados MenuetOS y KolibriOS están totalmente escritos en ensamblador. El código ensamblador está presente en programas para consolas de juegos y códecs multimedia.
- El ensamblador se utiliza en la ingeniería inversa: desarrollo inverso de programas. La ingeniería inversa se utiliza para comprender cómo funcionan los programas, cuál es su algoritmo. Esto es necesario en aquellos casos en que el creador, por alguna razón, no quiere publicar el código fuente. La ingeniería inversa la utilizan las empresas de antivirus que investigan virus y troyanos, los creadores de controladores y sistemas operativos, y también los curiosos. También la utilizan activamente los ciberdelincuentes de todo tipo: piratean programas, buscan vulnerabilidades, escriben virus, generadores de claves y cosas por el estilo.
Si quieres desarrollar nuevos microprocesadores o convertirte en ingeniero de retroingeniería, tiene sentido que te dediques seriamente al estudio del lenguaje ensamblador.
¿Son demandados los programadores ensambladores en la actualidad?
Por supuesto. Aunque en los sitios web de búsqueda de empleo es poco probable que encuentres ofertas de trabajo de empleadores con títulos como «Se necesita programador en ensamblador«, pero hay muchas que requieren el conocimiento del ensamblador además de los lenguajes de alto nivel: C, C++ o Python. Estas son ofertas de trabajo de ingenieros de retroingeniería (ingeniería inversa), especialistas en seguridad informática, desarrolladores de controladores y programas para microcontroladores/microprocesadores, programadores de sistemas y otras.
El salario ofrecido es el habitual en el sector de las TI: de 1.000 a 3.700 euros, en función de la cualificación y la experiencia. Por ejemplo, aquí tienes una oferta de trabajo de ingeniero de ingeniería inversa en Glassdoor, donde se requiere el conocimiento del ensamblador (Assembly):

¿Vale la pena empezar a aprender a programar con el lenguaje ensamblador?
No, no hay que hacerlo. Hay varias razones para ello:
- El ensamblador es demasiado diferente de los lenguajes de alto nivel, y será difícil pasar de él a otro lenguaje.
- La experiencia obtenida al estudiar el ensamblador no te servirá en otro lenguaje. Tendrás que empezar a aprender los lenguajes de alto nivel desde cero.
- El ensamblador es un lenguaje demasiado detallado. Todas las acciones rutinarias que el traductor se encarga en otros lenguajes, el programador tiene que describirlas en el ensamblador. Esto puede aburrir rápidamente.
Por lo tanto, incluso si has decidido dedicarte a una profesión relacionada con el ensamblador, es mejor que empieces a aprender a programar con un lenguaje de alto nivel. Y después, aprender ensamblador no será difícil.