Practica 2. Debug. Exe

28

Transcript of Practica 2. Debug. Exe

Presentacin de PowerPoint

DEBUG.EXEINTRODUCCIONEn esta presentacin se explicara el funcionamiento del programa DEBUG.EXE del MS DOS.En primer lugar se proporcionaran algunos conceptos de la palabra DEBUG, y su funcionalidad. Describiremos 2 tipos de programadores para el lenguaje ensamblador. Adems de un poco sobre los registros el CPU.Despus 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 script. Tambin se menciona la entrada y salida de datos.Por ltimo se describe un breve la realizacin de un pequeo programa.CONCEPTOSPara 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 extensin, todos los programas y utilidades que sirven para escudriar los datos y el cdigo a bajo nivel, se identifican genricamente con esta denominacin.CONCEPTOSCon el depurador podemos revisar paso por paso la ejecucin de nuestro programa, revisar como va modificndose 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 didctico 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 mquina. DOS TIPOS DE PROGRAMADORPara comprender mejor, se hacen distincin entre los programadores.

Programador de aplicaciones

Se dedica a disear aplicaciones a de 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 bsico de instrucciones del procesador

Modos de direccionamientoDOS TIPOS DE PROGRAMADOREl programador de sistemas

Tiene a su haber otra misin, el diseo de sistemas lo ms ptimo posible; la explotacin 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 deoperacin del procesador, etc.REGISTROS INTERNOS DEL CPUEl Intel 8086, el primero de la serie x86, dispone de varios registros que pueden clasificarse en tres grupos:

Registros de propsito general (8 registros):

- De datos:AX: AcumuladorBX: BaseCX: ContadorDX: Datos

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

- ndices:SI: ndice de origen DI: ndice de destino Registros de puntero de instrucciones y registro de sealizadores (2 registros)

IP: Puntero de InstruccionesSealizadores (Flags) Registros de segmento (3 registros)

CS: Segmento de cdigoDS: Segmento de datosSS: Segmento de pilaES: 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. REGISTROS INTERNOS DEL CPUINICIALIZACINPara 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 ms interesantes no estarn 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 ejecucin, el indicador ("prompt") es un guin "-", indicando que el "Shell" espera recibir rdenes. Para salir basta pulsar una Q. Como muchos programas de su gnero, sus comandos empiezan por una letra o combinacin de ellas (pueden usarse indistintamente maysculas o minsculas) y ciertos parmetros opcionales (no es imprescindible separar la letra de opcin de los parmetros opcionales).COMANDOSEl comando mas sencillo es la interrogacin ?, cuyo resultado es una lista resumida de las opciones disponibles

COMANDOSLa traduccin al espaol seria:ensamblar A [direccin]comparar C direccin de intervalovolcar D [intervalo]escribir E direccin [lista de valores]llenar F lista de intervalosirG [=direccin] [direcciones]hexadecimalH valor1 valor2entradaI puertocargar L [direccin] [unidad] [primer _ sector] [nmero]mover M direccin de intervalonombre N [nombre _ ruta] [lista _ argumentos]salida O byte de puertoproceder P [=direccin] [nmero]salir Q

COMANDOSregistrarR [registrar]buscarS lista de intervalosseguimientoT [=direccin] [valor]desensamblarU [intervalo]escribirW [direccin] [unidad] [primer _ sector] [nmero]

asignar memoriaexpandidaXA [# de pginas]desasignar memoria expandidaXD [identificador]asignar pginas de memoria expandidaXM [L pgina] [P pgina] [identificador]mostrar estado de la memoria expandida XS

La mayora de los comandos de debug ejecutan una accin y vuelven al indicador del Shell, pero si es un comando largo, como puede ser mostrar un trozo grande de cdigo, puede detenerse pulsando CTRL Pausa o interrumpirse con CTRL C para volver al Shell.FICHERO SCRIPTUna caracterstica 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. Despus del ltimo, que debe ser una "Q" para salir de debug, es conveniente dejar una lnea en blanco pulsando INTRO dos veces. Las lneas pueden contener comentarios. Cualquier cosa a partir del carcter punto y coma (;) hasta el final de la lnea, ser ignorado.

Ejemplo:

; esto es un comentarioD ; aqu se mostrar algo...FICHERO SCRIPTSuponiendo que tengamos un fichero "Script" de nombre Ordenes.txt, puede ser utilizado como entrada para debug mediante un comando de redireccin en la siguiente forma:

DEBUG < Ordenes.txt

Tambin puede conseguirse que el programa redireccione la salida hacia un fichero que puede ser inspeccionado ms 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 podra obtenerse un fichero Result.txt con el siguiente comando:

DEBUG < Ordenes.txt > Result.txtERRORES

Cuando debug no sabe interpretar un comando, muestra un mensaje de error y un indicador "^" debajo del comando donde esta el error.ENTRADAS Y SALIDASDebug asume que los datos numricos proporcionados son hexadecimales, y cuando se trate de direcciones de memoria, deben introducirse en forma segmentada. A su vez, los resultados son mostrados tambin 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.UaENTRADAS Y SALIDASCada fila muestra 16 posiciones de memoria a partir de la posicin sealada 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 representacin 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 SALIDASPor razn de que ste tipo de salida pueda ser listado a impresora, el bloque derecho no contiene en realidad la representacin ASCII de todos los caracteres (algunos ni siquiera tienen una representacin 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 carcter imprimible. Esto no significa que dichas posiciones representen efectivamente tales valores para la aplicacin 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 nmero).EJECUTABLES EN DOSExisten dos formatos: .COM y .EXE.

El primero, .COM, es el formato original. En este formato, todo, cdigo y datos, es puesto en un nico segmento cuyo tamao no debe exceder los 64 KB.

En el segundo, .EXE, se reserva un segmento para datos, uno para cdigo y uno para la pila.

Con el debug se pueden escribir programas en formato .COM, que son bastante ms pequeos.

El programa debe comenzar a ejecutarse en la direccin 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 informacin que ser utilizada por el cargador de DOS.ESCRIBIR UN PROGRAMA Tomando la explicacin anterior, empezaremos escribiendo A 100 y un enter. Seguido las instrucciones mostradas en la pantalla siguiente:

ESCRIBIR UN PROGRAMALa primera instruccin ,"jmp 108", es saltar a la localidad 108. Necesitamos un espacio para nuestra cadena. Como no sabemos el tamao 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 dara error) le pasamos por encima. La instruccin 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 Operacin.

Vemos que la direccin de la cadena es 102, as que ponemos este valor en DX, con el comando mov, que es equivalente a la asignacin = de valor en programacin C; luego llamamos al servicio 9 (mov ah, 9) de la interrupcin 21h (int 21) para desplegar la cadena. Luego ejecutamos el servicio 10h de la interrupcin 16h (que detiene la ejecucin del programa) y por ltimo regresamos a DOS con la interrupcin 20h.ESCRIBIR UN PROGRAMA Luego pulsamos 2 veces enter para salir de la instruccin A Podemos probar nuestro programa con la instruccin 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 extensin debe ser .COM, porque W no puede crear ejecutables con formato .EXE; la orden es:

ESCRIBIR UN PROGRAMATambin debemos especificar el tamao de nuestro ejecutable. W crear un archivo con el tamao indicado en el registro CX; as que deberamos poner en CX el tamao 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:

CONCLUSINEn general la informacin 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, adems de tener una habilidad con los nmeros hexadencimales.Se que no se explica mucho, pero la intencin fue dar a conocer el programa y poder realizar un pequeo programa, no hacer un tutorial, adems 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.