Este artículo del blog narra la experiencia de un programador de aplicaciones que, durante un período de desempleo, decidió seguir un tutorial para construir un sistema operativo en 1000 líneas de código, utilizando ensamblador. La principal conclusión es que sus habilidades de depuración, muy desarrolladas en el ámbito de la programación de aplicaciones de alto nivel, resultaron ineficaces al enfrentarse a los errores de bajo nivel del ensamblador.
La programación de aplicaciones se basa en gran medida en abstracciones, lo que oculta los detalles de bajo nivel del hardware. En contraste, la programación de sistemas operativos, especialmente a nivel de ensamblador, requiere una comprensión directa de cómo funciona el hardware y cómo se manipula la memoria. El autor se encontró con tres problemas significativos: primero, olvidó una instrucción ret en una función de ensamblador, lo que provocó una ejecución inesperada del código y un flujo de control erróneo; segundo, utilizó un tipo de datos incorrecto dentro de una estructura empaquetada, lo que, aunque no generó errores de compilación en C, sí causó fallos al acceder a la estructura en ensamblador; y tercero, un error tipográfico en un atributo de compilación (__attribute__ vs. __attribute((foo))) que pasó desapercibido durante la compilación.
Estos errores resaltan la importancia de abandonar las abstracciones habituales al depurar código de bajo nivel. En lugar de buscar patrones lógicos y rastrear llamadas a funciones, la depuración en ensamblador a menudo implica examinar el código adyacente y comprender cómo se manipulan los datos directamente en la memoria y los registros. El autor enfatiza que, a diferencia de los lenguajes de alto nivel, donde los errores suelen propagarse y señalarse de manera explícita, el ensamblador requiere una comprensión más granular del flujo de ejecución y la manipulación de la memoria. Finalmente, el autor señala que incluso herramientas como ChatGPT, diseñadas para ayudar en la programación, se vieron limitadas al intentar depurar el código de ensamblador debido a su dependencia de modelos de abstracción similares a los de la programación de aplicaciones.
