Uffff ... vamos a ver si puedo exponer en
pocas palabras y mas o menos claro un par de ideas.
Un fichero .hex es una representación ASCII de qué byte va en qué dirección de memoria escrito según un acuerdo en la forma de colocar esa información en dicho fichero.
El cómo se guarda esto en un fichero .hex lo dijo Intel en su momento, y los que quieren escribir un fichero .hex se atienen a esas normas (
Formato HEX de Intel). Existen otros formatos de ficheros que representan bytes en posiciones de memoria, por el ejemplo el .s19 que es el que inventó Motorola (
Formato S19 de Motorola). Es lo mismo aunque no es igual.
La información guardada en un .hex puede representar un programa o no: puede ser el contenido de una memoria EEPROM por ejemplo. El .hex no es mas que un paso intermedio entre quien lo genera y quien ha de recibirlo, un microprocesador, una memoria FLASH o una EPROM ...
Para generar un fichero .hex no hace falta ni un compilador, ni un ensamblador ni nada mas que un editor de texto estilo notepad, vi o emacs. Escribes qué byte quieres en que address siguiendo la norma .hex, guardas y ya lo tienes.
Los programas del estilo de ICProg o WinPic800 "saben" abrir un fichero de texto .hex y enviar al PIC o a la memoria EPROM su contenido dependiendo de quien sea su receptor diciéndolo qué byte tiene que ir en qué dirección.
Una de las infinitas formas posibles de escribir un .hex es escribir un source en idioma ensamblador y diciéndole a un programa ensamblador que lo traduzca a .hex: su contenido será en este caso una serie de bytes que serán la traducción correspondiente de tu source a un programa ejecutable.
Otra forma es hacer lo mismo pero escribiendo un source en idioma C y diciéndole a un programa compilador de C que lo traduzca igualmente. Su contenido también será en este segundo caso una serie de bytes que serán la traducción correspondiente de tu source en C a un programa ejecutable, que podemos llegar a conseguir que sea idéntico al anterior.
Partiendo de dos sources distintos puedes obtener el mismo .hex que a su vez representa el mismo programa. El que el segundo utilice como paso intermedio un fuente en ensamblador es indiferente, puede ser o no.
Estos bytes generados no son ensamblador. Son código máquina puro y duro. Especiales y particulares para cada tipo de procesador. Al igual que distintos compiladores de C, distintos ensambladores pueden generar el mismo código máquina.
Cuando hacemos ingeniería inversa lo que hacemos es procesar al revés el contenido de un fichero .hex traduciendo los bytes en su posición a los nemónicos, direcciones y registros que escribiríamos en un source ensamblador sin utilizar ningún tipo de instrucciones de pre-procesado. Es lo que conocemos como desensamblar o usar un desensamblador.
Cada byte de instrucción es exactamente traducido por un nemonico de ensamblador, cada dirección es exactamente una dirección no una etiqueta ni una variable. Como dice Maunix hay una relación directa, exacta y univoca entre cada byte de instrucción y su nemonico correspondiente.
De todas formas el desensamblado de un .hex genera un fuente ensamblador que es muy difícil de leer y mas aún de interpretar correctamente. Lo se por experiencia directa.
Y un compilador es infinitamente mas complejo que un ensamblador, con instrucciones de control de flujo anidadas, enlazadas, supeditadas o excluyentes. Con estructuras de datos complejas, superpuestas o compartidas. Con sentencias distintas que son en realidad sucesivas acumulaciones de otras mas sencillas ... o acaso ¿no es lo mismo un While que un For? y ¿ambos no son mas que If complejos?.
.... hacer ingeniería inversa para obtener su fuente en C es una verdadera locura. Un único progama máquina debe generar un único código ensamblador o algunas docenas de miles de códigos C, dependiendo de cómo interprete o implemente tal o cual bloque de instrucciones el creador de "
descompilador".
El creador de un desensamblador solo tiene un camino, el del descompilador los tiene todos y todos ellos abiertos al mismo tiempo.
De ahí que hacia atrás solo se llegue hasta el ensamblador. Antes que ir mas arriba es preferible dedicarse a otra cosa.
Ea, mas novelas para no dormir.