Obtener el código en ensamblador de un sketch de Arduino

Una de las cosas que echaba de menos al programar un Arduino era la posibilidad de ver un desemsamblado del código generado. Hay veces que puede ayudarte a entender por qué falla algo o saciar tu curiosidad de cómo funciona. Aunque el IDE de Arduino no trae una opción cómoda para hacerlo es muy sencillo.

Hay que realizar el proceso en dos pasos:

Obtener el volcado binario del sketch de Arduino

Primero vamos a obtener un volcado binario del sketch. Para ello recurrimos a la opción “Exportar Binarios compilados” del menú “Programa”.

Programa -> Exportar Binarios compilados

Una vez exportados podemos acceder a ellos con la opción “Mostrar Carpeta de Programa” del menú “Programa”.

Como resultado de la exportación obtenemos dos archivos .hex.

Ficheros binarios obtenidos

Se corresponden al binario con el bootloader de Arduino o sin el bootloader. Podemos abrirlo con un editor hexadecimal y ver que contiene.

Primeras lineas de ejemplo.ino.with_bootloader.standard.hex

El fichero con el bootloader es el que se copia a la placa Arduino cuando “cargamos” el sketch

Convertir el volcado vinario a ensamblador

Para realizar esta parte necesitaremos el programa avr-objdump el cual se puede encontrar en el directorio donde este instalado el IDE de Arduino en la ruta hardware\tools\avr\bin\avr-objdump. Una vez localizado podemos usar el siguiente comando para obtener el desensamblado del binario:

<ruta-avr-objdump>avr-objdump -j .sec1 -d -m avr5 fichero.hex > fichero.asm

Tras ejecutar ese comando la salida se vuelca en el fichero de nombre ejemplo.asm que podemos abrir con cualquier editor de textos.

Primeras lineas de ejemplo.asm

Como curiosidad las primeras lineas del fichero corresponde a la tabla de vectores de interrupción del microcontrolador, por eso son todo saltos al código que gestiona cada una de las interrupciones.