Sie sind auf Seite 1von 28

INTRODUCCION

En esta presentación se explicara el funcionamiento del programa “DEBUG.EXE” que


del MS-DOS.
En primer lugar proporcionaran algunos conceptos de la palabra “DEBUG”, y su
funcionalidad.
Describiremos 2 tipos de programadores para el lenguaje ensamblador. Además de un
poco sobre los registros el CPU.
Después nos adentraremos al programa debug.exe, empezando por como se puede
ingresar a él, y algunos conocimientos previos antes de ingresar. Del programa se
mencionaran los comandos que se utilizan, y como utilizar ficheros “scipt”.
También se menciona la entrada y salida de datos,
Por último se describe un breve la realización de un pequeño programa.
CONCEPTOS
Para tener un concepto mas amplio del programa, hay que definir su nombre.

BUG, significa fallo, defecto de programa. Un concepto muy usado en juegos de


videojuegos.

DEBUG: " significa depurar (escrutar y eliminar fallos). La palabra ha quedado como
verbo (Depurar), de la que se deriva la palabra “DEBUGGER” (depurador).

Por extensión, todos los programas y utilidades que sirven para escudriñar los datos y el
código a bajo nivel, se identifican genéricamente con esta denominación.
CONCEPTOS
Con el depurador podemos revisar paso por paso la ejecución de nuestro programa,
revisar como va modificándose el contenido de los registros hasta ubicar donde está el
error y corregirlo.

DEBUG.EXE es un ejecutable que, hasta 2001, acompañó a todas las versiones de MS-
DOS, a partir del 2.0, y de Windows. Es sin duda un programa antiguo pero de enorme
potencial didáctico para el principiante.

El debug de DOS nos permite, entre otras cosas, editar archivos ejecutables y
hasta fungir como un tosco traductor de sentencias ensamblador a lenguaje máquina.
DOS TIPOS DE PROGRAMADOR
Para comprender mejor, se hacen distinción entre los programadores.

•Programador de aplicaciones

Se dedica a diseñar aplicaciones nivel usuario, así que su ámbito se reduce al


conocimiento de:

• Los registros internos del procesador, necesarios para manipular datos y


direcciones de memoria

• El repertorio básico de instrucciones del procesador

• Modos de direccionamiento
DOS TIPOS DE PROGRAMADOR

•El programador de sistemas

Tiene a su haber otra misión, el diseño de sistemas lo más óptimo posible de


explotación de los recursos del hardware para dar soporte a las aplicaciones previstas.
Para realizar su tarea, debe conocer

• Registro del sistema, indispensables para gestionar aspectos como el modo de


operación del procesador, etc.
REGISTROS INTERNOS DEL CPU
El Intel 8086, el primero de la serie x86, dispone de varios registros que pueden
clasificarse en tres grupos:

• Registros de propósito general (8 registros):

- De datos:
AX: Acumulador
BX: Base
CX: Contador
DX: Datos

- Punteros:
SP: Puntero de pila
BP: Puntero de base

- Índices:
SI: Índice de origen
DI: Índice de destino
REGISTROS INTERNOS DEL CPU
• Registros de puntero de instrucciones y registro de señalizadores
(2 registros)

IP: Puntero de Instrucciones


Señalizadores (Flags)

• Registros de segmento (3 registros)

CS: Segmento de código


DS: Segmento de datos
SS: Segmento de pila
ES: Segmento extendido

Estos registros constituyen el nivel del programador de aplicaciones. Esto quiere decir
que son totalmente visibles a este programador. Hay otros registros que ya no son
transparentes para el programador de aplicaciones: los registros del sistema.
INICIALIZACIÓN
Para utilizarlo basta con teclear debug desde el MS-DOS o desde una ventana DOS
de Windows. Aunque en este último caso algunas de sus funcionalidades más
interesantes no estarán disponibles. Es importante saber que muchos usos de estas
utilidades de bajo nivel, requieren un funcionamiento stand-alone, es decir, fuera de un
Sistema Operativo multi-usuario, ya que éstos encapsulan y ocultan (virtualizan)
muchos aspectos del hardware.

Una vez que el programa está en ejecución, el indicador ("prompt") es un guión "-",
indicando que el "Shell" espera recibir órdenes. Para salir basta pulsar una Q. Como
muchos programas de su género, sus comandos empiezan por una letra o combinación
de ellas (pueden usarse indistintamente mayúsculas o minúsculas) y ciertos parámetros
opcionales (no es imprescindible separar la letra de opción de los parámetros
opcionales).
COMANDOS
El comando mas sencillo es la interrogación ?, cuyo resultado es una lista resumida de
las opciones disponibles
CONADOS
La traducción al español seria:
ensamblar A [dirección]
comparar C dirección de intervalo
volcar D [intervalo]
escribir E dirección [lista de valores]
llenar F lista de intervalos
ir G [=dirección] [direcciones]
hexadecimal H valor1 valor2
entrada I puerto
cargar L [dirección] [unidad] [primer _ sector]
[número]
mover M dirección de intervalo
nombre N [nombre _ ruta] [lista _ argumentos]
salida O byte de puerto
proceder P [=dirección] [número]
salir Q
COMANDOS
registrar R [registrar]
buscar S lista de intervalos
seguimiento T [=dirección] [valor]
desensamblar U [intervalo]
escribir W [dirección] [unidad] [primer _ sector] [número]

asignar memoria expandida XA [# de páginas]


desasignar memoria expandida XD [identificador]
asignar páginas de memoria expandida XM [L página] [P página] [identificador]
mostrar estado de la memoria expandida XS

La mayoría de los comandos de debug ejecutan una acción y vuelven al indicador


del shell, pero si es un comando largo, como puede ser mostrar un trozo grande de
código, puede detenerse pulsando CTRL-Pausa o interrumpirse con CTRL-C para
volver al shell.
FICHERO SCRIPT
Una característica poco conocida, es que debug puede aceptar entradas desde un
fichero "Script", que puede ser un simple fichero de texto ASCII en el que cada comando
esté separado del anterior por un INTRO. Después del último, que debe ser una "Q"
para salir de debug, es conveniente dejar una línea en blanco pulsando INTRO dos
veces. Las líneas pueden contener comentarios. Cualquier cosa a partir del carácter
punto y coma (;) hasta el final de la línea, será ignorado.

Ejemplo:

; esto es un comentario
D ; aquí se mostrará algo...
FICHERO SCRIPT
Suponiendo que tengamos un fichero "Script" de nombre Ordenes.txt, puede ser
utilizado como entrada para debug mediante un comando de redirección en la siguiente
forma:

DEBUG < Ordenes.txt

También puede conseguirse que el programa redireccione la salida hacia un fichero que
puede ser inspeccionado más tarde. Aunque tiene la dificultad de tener que trabajar "a
ciegas", puede ser de utilidad en determinadas circunstancias. Por ejemplo, cuando se
desea un volcado de determinadas zonas de la memoria. En el caso anterior podría
obtenerse un fichero Result.txt con el siguiente comando:

DEBUG < Ordenes.txt > Result.txt


ERRORES
Cuando debug no sabe interpretar un comando, muestra un mensaje de error y un
indicador "^" debajo del comando donde esta el error.
ENTRADAS Y SALIDAS
Debug asume que los datos numéricos proporcionados son hexadecimales, y cuando
se trate de direcciones de memoria, deben introducirse en forma segmentada. A su
vez, los resultados son mostrados también en formato hexadecimal cuando se refieren a
direcciones de memoria. Cuando se trata simplemente del contenido de ciertas
posiciones de memoria, el resultado es mostrado en formato hexadecimal y en ASCII.
Por ejemplo, una salida puede presentar el siguiente aspecto:

177C:0180 01 21 10 03 41 10 05 61-10 07 81 10 09 A1 10 0B .!..A..a........


177C:0190 C1 10 0D E1 10 0F 01 11-11 21 11 13 41 11 15 61 .........!..A..a
177C:01A0 11 17 81 11 19 A1 11 1B-C1 11 1D E1 11 1F 01 12 ................
177C:01B0 21 21 12 23 41 12 25 61-12 27 81 12 29 A1 12 2B !!.#A.%a.'..)..+
177C:01C0 C1 12 2D E1 12 2F 01 13-31 21 13 33 41 13 35 61 ..-../..1!.3A.5a
177C:01D0 13 37 81 13 39 A1 13 3B-C1 13 3D E1 13 3F 01 14 .7..9..;..=..?..
177C:01E0 41 21 14 43 41 14 45 61-14 47 81 14 49 A1 14 4B A!.CA.Ea.G..I..K
177C:01F0 C1 14 4D E1 14 4F 01 15-51 21 15 53 41 15 55 61 ..M..O..Q!.SA.Ua
ENTRADAS Y SALIDAS
Cada fila muestra 16 posiciones de memoria a partir de la posición señalada por las
columnas de la izquierda, que las muestran como desplazamiento:segmento. El bloque
central muestra el contenido hexadecimal de cada byte, mientras que el bloque derecho
contiene la representación ASCII. Por ejemplo, la 5ª fila muestra el contenido de las
posiciones 177C:01C0 a 177C:01CF (ambas inclusive). Sus dos últimos bytes
contienen respectivamente los caracteres 5 y a, que corresponden a las cantidades 35h
y 61h del bloque central. Que como sabemos, equivalen a los decimales 53 y 97, que
son precisamente los valores ASCII de los caracteres mencionados.
ENTRADAS Y SALIDAS
Por razón de que éste tipo de salida pueda ser listado a impresora, el bloque derecho
no contiene en realidad la representación ASCII de todos los caracteres (algunos ni
siquiera tienen una representación imprimible). En realidad solo se muestran los
caracteres imprimibles del primer bloque (US-ASCII). El resto está representado por un
punto.

No perder de vista que, a pesar de que algunas posiciones de memoria puedan


contener valores cuya equivalencia ASCII sea un carácter imprimible. Esto no significa
que dichas posiciones representen efectivamente tales valores para la aplicación que
las utiliza. Por ejemplo, puede que en realidad, las dos posiciones de memoria
mencionadas (dos octetos), en vez de los caracteres 5 y a, representen una palabra de
16 bits en formato Little Endian, que a su vez representan una cantidad entera (un
número).
EJECUTABLES EN DOS
Existen dos formatos: .COM y .EXE.

• El primero, .COM, es el formato original. En este formato, todo, código y datos,


es puesto en un único segmento cuyo tamaño no debe exceder los 64KB.

• En el segundo, .EXE, se reserva un segmento para datos, uno para código y uno
para la pila.

Con el debug se pueden escribir programas en formato .COM, que son bastante
más pequeños.

El programa debe comenzar a ejecutarse en la dirección 256 [100h], ya que los


ejecutables de DOS reservan los primeros 256 bytes para colocar ahí una estructura
de datos conocida como PSP, cuando es cargado en la memoria. El PSP (Program
Segment Prefije: Prefijo de Segmento del Programa) contiene información que será
utilizada por el cargador de DOS.
ECRIBIR UN PROGRAMA
• Tomando la explicación anterior, empezaremos escribiendo A 100 y un enter.
Seguido las instrucciones mostradas en la pantalla siguiente:
ESCRIBIR UN PROGRAMA
La primera instrucción ,"jmp 108", es saltar a la localidad 108. Necesitamos un
espacio para nuestra cadena. Como no sabemos el tamaño del programa y no
podemos determinar al comienzo donde estará la cadena si la ponemos al final del
programa, la ponemos al comienzo, y para evitar que el programa comience a
ejecutarse en la cadena (lo que daría error) le pasamos por encima. La instrucción
jmp 108 tiene dos bytes, reservamos 6 bytes para la cadena. Nos sobra un byte, así
que escribimos "nop" en D10, un operador cero que significa No OPeración.

Vemos que la dirección de la cadena es 102, así que ponemos este valor en DX, con
el comando “mov”, que es equivalente al la asignación “”=de valor en programación C;
luego llamamos al servicio 9 (mov ah, 9) de la interrupción 21h (int 21) para
desplegar la cadena. Luego ejecutamos el servicio 10h de la interrupción 16h (que
detiene la ejecución del programa) y por último regresamos a DOS con la interrupción
20h.
ESCRIBIR UN PROGRAMA
• Luego pulsamos 2 veces enter para salir de la instrucción A
• Podemos probar nuestro programa con la instrucción G:
ESCRIBIR UN PROGRAMA
• Debes pulsar ENTER para salir del programa. Se desplegará:
"El programa ha terminado de forma normal"
ESCRIBIR UN PROGRAMA
• Ahora debemos escribir nuestro programa a un archivo .COM en disco. Para ello
empleamos la orden W [write]. Para realizar esta escritura correctamente, primero
elegimos un nombre para el programa, como saludo.com. La extensión debe ser
.COM, porque W no puede crear ejecutables con formato .EXE; la orden es:
ESCRIBIR UN PROGRAMA
También debemos especificar el tamaño de nuestro ejecutable. W creará un archivo con
el tamaño indicado en el registro CX; así que deberíamos poner en CX el tamaño de
nuestro ejecutable empleando la orden R:
ESCRIBIR UN PROGRAMA
• Por ultimo escribimos el archivo en disco
ESCRIBIR UN PROGRAMA
• Ahora nos podemos salir del debug con el “Q” y correr nuestro programa:
CONCLUSIÓN
En general la información nos da un concepto amplio del uso del programa debug.exe
para aplicaciones de usuario, ya que programar sistemas es muy complejo. Hemos visto
que para programar en este lenguaje hay que tener algunos conocimientos previos de
los registros, además de tener una habilidad con los números hexadencimales.
Se que no se explica mucho, pero la intención fue dar a conocer el programa y poder
realizar un pequeño programa, no hacer un tutorial, además de que este tipo de
programas es muy poco usado por su complejidad, por lo que se usan mas los de
lenguaje de alto nivel.