Pregunta que seguro que alguno se ha hecho estudiando: ¿para qué sirve aprender ensamblador hoy, si con toda probabilidad nunca vas a escribir uno en producción en tu carrera?
Mi opinión, después de verlo desde el otro lado: no se aprende ensamblador para usarlo a diario, se aprende para entender qué está pasando de verdad por debajo de cualquier lenguaje de alto nivel que uses después.
Cosas concretas que se entienden muchísimo mejor después de haber escrito ensamblador, aunque sea solo en una asignatura:
Por qué un desbordamiento de entero pasa lo que pasa. Cuando ves cómo se representan los números en registros de un tamaño fijo (8, 16, 32 bits) y qué ocurre cuando un cálculo se pasa de ese tamaño, un int overflow en C o Java deja de ser magia negra.
Por qué unas operaciones son más rápidas que otras. Sumar es barato, dividir es caro, y eso no es una regla arbitraria, viene directamente de cuántos ciclos de reloj necesita cada instrucción real del procesador para completarse.
Cómo funciona una pila de llamadas (call stack). Ver a mano cómo call/return empujan y sacan direcciones de la pila hace que conceptos como recursión, stack overflow o paso de parámetros dejen de ser abstractos.
Qué hace realmente el compilador por ti. Una vez has escrito a mano lo que un compilador genera automáticamente (gestión de registros, saltos, aritmética de punteros), aprecias muchísimo más por qué los lenguajes de alto nivel existen y qué complejidad te están ahorrando.
Dicho esto, hay excepciones donde sí se escribe ensamblador de verdad hoy: firmware de microcontroladores muy limitados, optimizaciones críticas puntuales en motores de videojuegos o compresión, y código de arranque de sistemas operativos antes de que exista un entorno C funcional. Son casos concretos, no el pan de cada día de la mayoría de programadores, pero existen.
Ruben