Desensamblador

Un desensamblador es un programa de computador que traduce el lenguaje de máquina a lenguaje ensamblador, la operación inversa de la que hace el ensamblador. Un desensamblador difiere de un decompilador, en que éste tiene como objetivo un lenguaje de alto nivel en vez de al lenguaje ensamblador. la salida de un desensamblador, el desensamblado, es a menudo formateada para la legibilidad humana en vez de ser adecuada para la entrada a un ensamblador, haciendo que éste sea principalmente una herramienta de ingeniería inversa.

El código fuente en lenguaje ensamblador generalmente permite el uso de constantes y comentarios del programador. Estos son generalmente removidos, por el ensamblador, del código ensamblado a código de máquina. De esta manera, un desensamblador operando sobre el código de máquina, produciría el desensamblado careciendo de estas constantes y comentarios; la salida desensamblada se vuelve más difícil de ser interpretada por un humano que el código fuente con comentarios original. Algunos desensambladores hacen uso de la información de depuración simbólica presente en los archivos objeto tales como el ELF. En una sesión interactiva, el Interactive Disassembler permite al usuario humano colocar símbolos mnemónicos para valores o regiones de código: la intuición humana aplicada al proceso de desensamblado a menudo va en paralelo con la creatividad humana en el proceso de la escritura del código.

El desensamblado no es una ciencia exacta: En las plataformas CISC con instrucciones de ancho variable, o en presencia de código automodificable, es posible para un simple programa tener dos o más desensamblados razonables. Determinar qué instrucciones serían encontradas realmente durante una ejecución del programa reduce al problema de parada probado no solucionable.

El programa desensamblador a utilizar, por trabajar con lenguaje máquina y ensamblador, depende exclusivamente del microprocesador que estamos usando (para que pueda reconocer las instrucciones del código binario), de la arquitectura de la máquina y del sistema operativo en uso (no es lo mismo Microsoft Windows que GNU/Linux).

¿Qué hace un desensamblador?

El desensamblador transforma el código binario en instrucciones básicas del PC en la que se ejecuta, el programa no es capaz de distinguir si dichas instrucciones provienen de un "if", de un "for" o de un "while". Tampoco conoce los nombres de las variables (no se incluyen en el código binario ya que la máquina no usa nombres), así que suele inventar nombres como VAR_0001, VAR_0002, etc.

En cuanto a las funciones, algo parecido pasa con las funciones internas del programa, se suelen llamar CALL_0001 o JMP_0001, o similares, dependiendo de si son direcciones de llamadas con o sin retorno, respectivamente.

Las funciones externas dependen del sistema en el que se ejecute el programa a desensamblar:

Bajo sistemas como DOS, la mayoría de las veces puede indicar las funciones que se llaman (llamar a una función requiere normalmente una llamada a una interrupción con valores específicos en los registros, que deben ser consultados si no son provistos por el programa desensamblador). Por ejemplo, para imprimir un texto en pantalla:

  mov ax, 0009
  mov dx, offset TEXTO
  int 21h

En cambio bajo sistemas operativos modernos como Windows, las funciones se llaman por nombres, y esto suele ser bastante autoexplicativo. Esto resulta cierto para la mayoría de las funciones provistas por el sistema operativo y llamados externos en las bibliotecas de enlace dinámico. Por ejemplo, las funciones CreateFile o ReadFile.

Other Languages
български: Дизасемблер
čeština: Disassembler
Deutsch: Disassembler
English: Disassembler
français: Désassembleur
עברית: דיסאסמבלר
magyar: Disassembler
italiano: Disassembler
한국어: 역어셈블러
Nederlands: Disassembler
polski: Deasembler
português: Desmontador
русский: Дизассемблер
українська: Дизасемблер