• No se han encontrado resultados

6.5 LA UTILIDAD DEBUG/SYMDEB.

In document El Universo Digital Ibm Pc at y Ps2 (página 103-107)

Capítulo VI: EL ENSAMBLADOR EN ENTORNO DOS

6.5 LA UTILIDAD DEBUG/SYMDEB.

La utilidad DEBUG incluída en los sistemas MS-DOS, es una herramienta para depuración de programas muy interesante que permite desensamblar los módulos y, además, ejecutar programas paso a paso, viendo las modificaciones que sufren los registros y banderas. Se trata de un programa menos complejo, cómodo y potente que depuradores de código como Turbo Debugger (de Borland) o Codeview (Microsoft), pero en algunos casos es más útil. Veremos ahora los principales comandos del DEBUG, los cuales también son admitidos en su mayoría por Codeview, por lo que el tiempo invertido en aprenderlos será útil no sólo para conocer el clásico y mítico DEBUG.

Antes de empezar con ellos, conviene hacer referencia al programa SYMDEB que acompaña al MASM de Microsoft: se trata de un DEBUG mejorado, con ayuda, más rápido e inteligente (indica el tipo de función del sistema cuando al tracear un programa éste llama al DOS) y, en la práctica, es 99% compatible. También

admite las instrucciones adicionales del 286 y los NEC V20/V30. Su diferencia principal es que al abandonarlo para volver al DOS restaura los vectores de interrupción, lo que puede no ser deseable en algunos casos muy concretos. Además, desde la versión 4.0 se admite el parámetro /S (con SYMDEB /S nomfich.ext) lo que permite conmutar entre la pantalla de depuración y la de ejecución pulsando la tecla '\'.

Sintaxis general: DEBUG [programa.ext [parámetros] ]

Los programas pueden ser de tipo EXE o COM; en el caso de los primeros se les cargará ya montados y con los registros inicializados, listos para su ejecución. Evidentemente, los programas COM también se cargan con los registros inicializados y el correspondiente PSP preparado, así como con IP=100h. Los parámetros opcionales no son los de el DEBUG o SYMDEB sino los que normalmente se suministrarían al programa a depurar. También se pueden cargar otros ficheros de cualquier extensión o simplemente entrar en el programa sin cargar ningún fichero. Al entrar, aparecerá el prompt particular del DEBUG: un guión (-). Entonces se pueden teclear órdenes que constarán generalmente de una sola letra. La mayoría de las mismas admiten parámetros, que normalmente irán separados por comas. Estos parámetos pueden ser números hexadecimales de hasta dos o cuatro dígitos, registros y, además:

- Cadenas de caracteres: Encerradas entre comillas simples o dobles. El texto puede a su vez encerrar fragmentos entrecomillados, empleando comillas distintas a las más exteriores. Ejemplo:

"Cadena de caracteres", "Otra 'cadena' más", 'Curso de "8086"'

Con SYMDEB debe tenerse cuidado de no colocar el nombre de un registro de segmento en mayúsculas y seguido de dos puntos, ya que no se interpretará correctamente:

"ESTO ES: ESTA CADENA SERA MAL TRADUCIDA."

La cadena 'ES:' no será bien traducida a sus correspondientes valores ASCII. Con DEBUG este problema no existe.

- Direcciones: Pueden expresarse con sus correspondientes valores numéricos o bien apoyándose en algún registro de segmento, aunque el offset siempre será numérico: 1E93:AD21, CS:100, ES:19AC

El depurador SYMDEB es mucho más flexible y permite también emplear registros de propósito general en el offset. Sería válida la dirección DS:BX+AX+104.

- Rangos: Son dos direcciones separadas por una coma; o bien una dirección, la letra 'L' y un valor numérico que indica el número de bytes a partir de la dirección.

- Listas: Son secuencias de bytes y/o cadenas separadas por comas: AC, "Texto de ejemplo", 0D, 0A, '$'

El DEBUG del MS-DOS 5.0 y el SYMDEB poseen una ayuda invocable con el comando ?, en la que se resumen las principales órdenes. A continuación se listan las más interesantes:

„ Q (Quit): permite abandonar el programa y volver al DOS.

„ D [<dirección> [numbytes]] (dump): visualiza el contenido de la memoria. SYMDEB permite además visualizarla en palabras (DW), dobles palabras (DD), coma flotante ...

„ A [<dirección>] (assemble): permite ensamblar a partir de CS:IP si no se indica una dirección concreta. Se admiten las directivas DB y DW del ensamblador. Las instrucciones que requieran indicar un registro de segmento, con DEBUG hay que ponerlas en una sola línea. Por ejemplo:

XLAT CS: ; mal ensamblado con DEBUG (no así con SYMDEB) MOV WORD PTR ES:[100],1234 ; error en DEBUG (sí vale con SYMDEB) CS: ; bien emsamblado con ambos

XLAT

ES: ; y esto también MOV WORD PTR [100],1234

Los saltos inter-segmento deben especificarse como FAR (ej., CALL FAR [100]) a no ser que sea evidente que lo son (ej. CALL 1234:5678).

„ E <dirección> [<lista>] (enter): permite consultar y modificar la memoria, byte a byte. Por ejemplo, con E 230 1,2,3 se introducirían los bytes 1, 2 y 3 a partir de DS:230. Si no se indica <lista>, se visualizará la memoria byte a byte, pudiéndose modificar los bytes deseados, avanzar al siguiente (barra espaciadora) o retroceder al anterior (signo -). Para acabar se pulsa RETURN.

„ U [<direccion> [<rango>]] (unassemble): desensambla la memoria. Como ejemplos válidos: U ES:100, U E000:1940 ... si se indica rango, DEBUG desensamblará ese número de bytes y SYMDEB ese número de líneas. Por defecto se emplea CS: como registro de segmento.

„ R [<registro>] (register): permite visualizar y modificar el valor de los registros. Por ejemplo, si se ejecuta la orden 'rip', se solicitará un nuevo valor para IP; con RF se muestran los flags y se permite modificar alguno:

┌──────────────────┬──────────┬────────────┐ │ Flag │ Activo │ Borrado │ ├──────────────────┼──────────┼────────────┤ │ Desbordamiento │ OV │ NV │ │ Dirección │ DN () │ UP () │ │ Interrupción │ EI │ DI │ │ Signo │ NG (<0) │ PL (>0) │ │ Cero │ ZR (=0) │ NZ (!=0) │ │ Acarreo auxiliar │ AC │ NA │ │ Paridad │ PE (par) │ PO (impar) │ │ Acarreo │ CY │ NC │ └──────────────────┴──────────┴────────────┘

„ G [=<dirección> [,<dirección>,...]] (go): ejecuta código desde CS:IP (a menos que se indique una dirección concreta). Si se trabaja sobre memoria ROM no debe indicarse la segunda dirección. Para que el flujo del programa se detenga en la 2ª dirección o posteriores debe pasar necesariamente por ella(s). Se puede indicar hasta 10 direcciones donde debe detenerse.

„ T [<veces>] (trace): ejecuta una instrucción del programa (a partir de CS:IP) mostrando a continuación el estado de los registros y la siguiente instrucción. Ejecutar T10 equivaldría a ejecutar 16 veces el comando T. Si la instrucción es CALL o INT, se ejecutará como tal introduciéndose en la subrutina o servidor de interrupciones correspondiente (SYMDEB no entra en los INT 21h).

„ P [<veces>] (proceed): similar al comando T, pero al encontrarse un CALL o INT lo ejecuta de golpe sin entrar en su interior (ojo, ¡esto último falla al tracear sobre memoria ROM!).

„ N <especificacion_fichero> (name): se asigna un nombre al programa que está siendo creado o modificado. Se puede indicar la trayectoria de directorios.

„ L [<dirección>] (load): carga el fichero de nombre indicado con el comando N. Si es ejecutable lo prepara adecuadamente para su inmediata ejecución. En BX:CX queda depositado el tamaño del fichero (BX=0 para ficheros de menos de 64 Kb). Por defecto, la dirección es CS:100h.

...) a memoria. Se trata de sectores lógicos del DOS y no los sectores físicos de la BIOS. Las versiones antiguas de SYMDEB dan errores en particiones de más de 32 Mb.

„ W [<dirección>] (write): graba el contenido de una zona de memoria a disco. Si no se indica la dirección, se graba desde CS:100h hasta CS:100h+número_bytes; el número de bytes se indica en BX:CX (no es una dirección segmentada sino un valor de 32 bits). Si se trata de un EXE no se permitirá grabarlo (para modificarlos, hay que renombrarles para cambiarles la extensión, aunque de esta manera no serán montados al cargarlos).

„ W <dirección> <unidad> <primer_sector> <num_sectores> (write): graba sectores de la memoria a disco en la unidad 0, 1, ... (A, B, ...). Se trata de sectores lógicos del DOS y no los sectores físicos de la BIOS. Las versiones antiguas de SYMDEB dan errores en particiones de disco duro de más de 32 Mb.

„ S <rango> <lista> (search): busca una cadena de bytes por la memoria. Para buscar la cadena "PEPE" terminada por cero en un área de 512 bytes desde DS:100 se haría: S 100 L 200 "PEPE",0 (por defecto se busca en DS:). No se encontraría sin embargo "pepe" (en minúsculas).

„ F <rango> <lista> (fill): llena la zona de memoria especificada con repeticiones de la lista de bytes indicada. Por ejemplo, para rellenar códigos 0AAh 100h bytes a partir de 9800h:0 se ejecutaría F 9800:0 L 100 AA; en vez de AA se podría haber indicado una lista de bytes o cadenas de caracteres.

„ C <rango> <dirección> (compare): compara dos zonas de memoria mostrando las diferencias. Por ejemplo, para comparar 5 bytes de DS:100 y DS:200 se hace: C 100 L 5 200.

„ M <rango> <dirección> (move): Más que mover, copia una zona de memoria en otra de manera inteligente (controlando los posibles solapamientos de los bloques).

„ I <puerto> (input): visualiza la lectura del puerto de E/S indicado. „ O <puerto> <valor> (output): envia un valor a un puerto de E/S.

„ H <valor1> <valor2> (hexaritmetic): muestra la suma y resta de valor1 y valor2, ambos operandos de un máximo de 16 bits (si hay desbordamiento se trunca el resultado, que tampoco excede los 16 bits). También existen comandos en DEBUG para acceder a la memoria expandida: XS (obtener el estado de la memoria expandida), XA npag (localizar npag páginas), XD handle (desalojar el handle indicado) y XM pagina_logica pagina_fisica handle (mapear páginas).

Con SYMDEB pueden además colocarse, con suma facilidad, puntos de ruptura (breakpoints); con DEBUG se pueden implementar con la orden G (indicando más de una dirección hasta un máximo de 10, donde debe detenerse el programa si pasa por ellas) aunque es más incómodo. En SYMDEB se pueden definir con BP dirección, borrarse con BC num_breakpoint, habilitarse con BP num_breakpoint (necesario antes de emplearlos), deshabilitarse con BD num_breakpoint y listar los definidos con BL. Además, SYMDEB puede visualizar datos en coma flotante de 32, 64 y 80 bits con el comando D (DS, DL y DT).

SYMDEB es realmente un depurador simbólico (SYMbolic DEBugger) que permite mostrar información adicional y depurar con mayor comodidad los programas que han sido ensamblados con información de depuración.

Una posibilidad interesante de DEBUG y SYMDEB es que admiten el redireccionamiento del sistema operativo. Ello permite, por ejemplo, crear ficheros ASCII con órdenes y después suministrárselas al programa, como en el siguiente ejemplo: DEBUG < ORDENES.TXT. La última orden de este fichero deberá ser Q (quit), de lo contrario no se devolvería el control al DOS ni se podría parar el programa (la entrada por defecto -el teclado- no actúa). También es versátil la posibilidad de redireccionar la salida. Por ejemplo, tras DEBUG > SALIDA.TXT, se puede teclear un comando para desensamblar (U) y otro para salir (Q): en el disco aparecerá

el fichero con los datos del desensamblaje (se teclea a ciegas, lógicamente, porque la salida por pantalla ha sido redireccionada al fichero). Por supuesto, también es posible redireccionar entrada y salida a un tiempo: DEBUG < ORDENES.TXT > SALIDA.

In document El Universo Digital Ibm Pc at y Ps2 (página 103-107)