290 likes | 656 Views
DEBUG.EXE. 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.
E N D
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 intervalovolcar D [intervalo]escribir E dirección [lista de valores]llenar F lista de intervalosir G [=dirección] [direcciones]hexadecimal H valor1 valor2entrada I puertocargar L [dirección] [unidad] [primer _ sector] [número]mover M dirección de intervalonombre N [nombre _ ruta] [lista _ argumentos]salida O byte de puertoproceder P [=dirección] [número]salir Q
COMANDOS registrar R [registrar]buscar S lista de intervalosseguimiento 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..a177C: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.5a177C: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..K177C: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.