Estamos de acuerdo en que uno cuando desensambla quedará en ensamblador.
Los compiladores de C hacen cosas más allá de lo 'evidente' para alguien que viene del ensamblador. Montones de cosas tienen que ver con cargar datos en un stack, descargar y manejos internos que no son públicos para la mayoría de los mortales.
Eso hace que un código que fue escrito en C sea más dificil de interpretar que un código escrito en ensamblador.
Cuanto más complejo y más funciones lógicas tenga un código en C, más dificil será de interpretar.
Así y todo, un código en ensamblador incluso escrito por nosotros mismos puede ser complicado de interpretar cuando uno no tiene nombres de variables, etc. En mis códigos suelo usar muchos macros que me facilitan tareas repetitivas. Si veo el código asm puro de lo que se generó luego de 2000 líneas de código tal vez estaré algo más que perdido. Sobre todo en el manejo de variables cuando son de varios bytes de longitud. Lo obvio en un código no lo es tanto cuando uno levanta el código desensamblado.
Ej: movlw VARIABLE+3
Esa simple línea se va a ensamblar con la dirección absoluta que tomó VARIABLE+3 al momento de la compilación. Nada hace pensar que la vayamos a asociar a VARIABLE, salvo un minucioso estudio del código.
Yendo más allá con el ejemplo para ser más claro.
VARIABLE equ 0x20
movlw 0x04
movwf VARIABLE
bcf PIR1,TMR1IF
movlw 0x08
movwf VARIABLE+3
Al ensamblarse VARIABLE será reemplazado por 0x20 y VARIABLE+3 por 0x23. Entonces si uno ve el 0x20 y el 0x23 cómo sabe que es de la misma variable?
Más complicado aún cuando uno quiere interpretar una función que fue hecha en C y con envío de parámetros, cuando un parámetro puede ser o bien el valor o bien un puntero hacia el valor!
En mi opinión el que COPIA generalmente lo hace para grabar un micro con el firmware idéntico no y se detiene en la interpretación del código ya que le puede llevar semanas o meses entender un código que fue escrito por otro.
Saludos