jueves, 27 de enero de 2011

Guia de Laboratorio No.2 del Debug

Guía de Laboratorio No. 2:  El DEBUG

El Depurador DEBUG
Es un programa que sirve para localizar errores a través de un cierto número de técnicas interactivas, es decir, a través de la interacción con el usuario. Además de ser una valiosa herramienta de depuración, un depurador es una valiosa herramienta de aprendizaje utilizada para conocer paso a paso la ejecución de cada instrucción, para llevar a cabo la interacción con el usuario, el depurador cuenta con comandos que son órdenes para el programa, existe un depurador específico para cada lenguaje, para el ensamblador 8088 el programa depurador se llama debug, el cual cuenta con 18 comandos que incluyen manejo de memoria de registros y de archivos, para utilizar el programa debug hay que llamarlo por su nombre y oprimir enter.

Lista de Comandos
A[dirección] Ensamblar:
Permite ensamblar código assembler, es el editor de programas que posee el debug. Para su utilización se le debe agregar la dirección de comienzo de nuestro programa, caso contrario comenzará después de la última línea de código ingresada por otra instrucción A

C [Com1] [Fin1] [Com2] Comparar:
Realiza una comparación byte a byte entre dos bloques de memoria. Se le deben ingresar 3 parámetros, dirección de comienzo primer bloque, dirección de final del primer bloque y dirección de comienzo segundo bloque.

D [Comienzo] [Final] Volcar:
Realiza una muestra o volcado de memoria, mostrando byte a byte lo que se encuentra en un sector de la memoria. Puede prescindir de parámetros, en cuyo caso comenzara a partir de la dirección h0100 mostrando en cada instrucción
D bloques sucesivos de memoria. Otra forma de utilizar la instrucción es agregando la dirección de comienzo del
bloque a ver y pudiendo agregar también la dirección final.

E dirección [lista] Introducir:
Permite modificar el valor de una posición de memoria. Se debe especificar una dirección y como segundo parámetro puede ir una lista de valores por ejemplo 12,13,14 o una cadena de caracteres "hola". En caso de no ingresar un segundo parámetro mostrará la posición a modificar luego el valor de esa posición de memoria y a continuación permitirá ingresar el nuevo valor. Para avanzar al próximo valor se utiliza la barra espaciadora y para retroceder
el signo -.

F lista de rango Llenar:
Esta función llena una porción de memoria con la lista de bytes indicada. Se le deberán pasar los siguientes parámetros, Dirección de Inicio, Dirección Final y carácter o lista de caracteres.

G [=dirección][direcc.] Ir:
Ejecuta código a partir de la dirección CS:IP o en caso de haber puesto una dirección a partir de esta. La dirección debe estar precedida de un signo =.
Puedo cargar una segunda dirección donde quiero que el programa se detenga

Hvalor1 valor2 Aritmética Hexadecimal:
Devuelve el resultado de sumar y restar los dos valores pasados como parámetro.

I puerto Entrada:
Permite leer la dirección de puerto indicada, devolviendo su valor.

L [dirección] Cargar:
Carga en memoria el programa especificado en la instrucción N, si no se especifica la dirección por defecto cargara el programa a partir de la dirección h0100.
La longitud del programa queda guardada en los registro.

M [intervalo] [destino] Mover:
Copia una porción de memoria a otra. Se debe especificar un intervalo compuesto por una dirección de inicio y otra
de final y una dirección de destino.

N [ruta y nombre] Nombre:
Se ingresa el nombre a utilizar luego por una instrucción de W o L

O[puerto] [byte] Salida:
Envía un byte al puerto especificado de Entrada/Salida.

P [=dirección][número] Continuar:
Permite ejecutar un programa paso a paso, saltando las llamadas Call o Int. Se puede saltar a una dirección especificada y luego ejecutar un número de líneas.

Q Salir:
Sale del debug

R [registro] Registro:
Si no se especifica registro se mostrara el estado general de todas las banderas y registros de microprocesador, en caso de especificar registro muestra su valor y permite modificarlo.

S[rango] [lista] Buscar:
Busca la lista especificada dentro de un rango de memoria Con el parámetro rango se especifica la dirección de comienzo y dirección final a buscar y en el parámetro lista se especifica el byte o los bytes a buscar.

T [=dirección][valor] Seguir:
Funciona de manera similar a P con la diferencia que entra a las llamadas Call o Int.

U [rango] Desensamblar:
Desensambla un rango de memoria. El rango se especifica con un comienzo y un final, se puede no indicar final, con lo que mostrará una serie de líneas hasta completar los 16 bytes de incremento de memoria, y también se puede no indicar ningún parámetro para mostrar bloques contiguos.

W [dirección] Escribir:
Escribe en el disco el archivo indicado con la función N a partir de la dirección especificada, en caso de no indicar dirección de comienzo la dirección por defecto será la h0100. La función W guardará desde la dirección de comienzo hasta la dirección de comienzo + N bytes. Donde N Bytes se especifica en BX:CX.


1) Comprobar los siguientes ejemplos del uso de los comandos del debug.

Comando A (Assemble). Se encarga de ensamblar nemónicos 8086, 8087 y 8088, directamente en la memoria, esto es, permite meter instrucciones a partir de una dirección especificada ensamblándolas inmediatamente para ser ejecutadas. La sintaxis es:
A[dirección]
Ejemplo:
-A 100
Dirección cs: 100 mov ah, 0
Dirección cs: 102 add ah, bh
Dirección cs: 104
Para terminar de ensamblar solo dar enter y se retornará al prompt esperando una nueva orden.
El comando A verifica los errores de sintaxis línea a línea, si existiera un error en una línea no le permitirá al usuario escribir la siguiente línea sin haber corregido la anterior.
Ejemplo:
-A 200
Dirección cs: 200 mov 5, ah
^Error
Dirección cs: 200

Comando D (Dump). Este comando muestra el contenido de la memoria del rango especificado en el comando, o bien muestra 128 bytes a partir de la dirección inicial especificada en el comando.
Sintaxis:
D [rango]
Donde rango puede ser una sola dirección o dirección inicial, dirección final


Ejemplo:
Código hexadecimal Carácter asociado (ASCII)
-d 100 Solo usando una dirección inicial
1074:0100 F8 8B CF 81 E9 82 00 26-88 0E 80 00 C3 8B 1E 92 .......&........
1074:0110 DE BE 1A D4 BA FF FF B8-00 AE CD 2F 34 00 63 10 .........../4.c.
1074:0120 DB E2 0A C0 74 09 56 57-E8 2A 21 5F 5E 73 0A B9 ....t.VW.*!_^s..
1074:0130 04 01 FC 56 57 F3 A4 5F-5E C3 50 56 33 C9 33 DB ...VW.._^.PV3.3.
1074:0140 AC E8 5F 23 74 19 3C 0D-74 15 F6 C7 20 75 06 3A .._#t.<.t... u.:
1074:0150 06 0C D3 74 0A 41 3C 22-75 E6 80 F7 20 EB E1 5E ...t.A<"u... ..^
1074:0160 58 C3 A1 E1 D7 8B 36 E3-D7 C6 06 25 D9 00 C6 06 X.....6....%....
1074:0170 21 D9 00 8B 36 E3 D7 8B-0E E1 D7 8B D6 E3 42 51 !...6.........BQ

-d 100,120 Especificando un rango
1074:0100 F8 8B CF 81 E9 82 00 26-88 0E 80 00 C3 8B 1E 92 .......&........
1074:0110 DE BE 1A D4 BA FF FF B8-00 AE CD 2F 34 00 63 10 .........../4.c.
1074:0120 DB .
-
Comando E (Enter). Muestra el contenido de la memoria permitiendo la modificación de dicho contenido. La memoria es modificada únicamente en la porción correspondiente al segmento de datos.
Sintaxis:
E Dirección [Lista de datos] Esta última puede omitirse
Uso:
Cuando se le proporciona únicamente la dirección muestra el contenido de la memoria en esa dirección y espera cuatro posibles opciones:
1) Que el usuario oprima la barra espaciadora con lo cual mostrará el
contenido de la siguiente localidad.
Ejemplo:
-e 100
1074:0100 F8. 8B. CF. Se oprimió dos veces la barra espaciadora.

2) Que el usuario oprima la tecla correspondiente al guión, en cuyo caso mostrará el contenido de la localidad anterior.
Ejemplo:
-e 100
1074:0100 F8. 8B. CF.-
1074:0101 8B.

3) Si el usuario oprime enter, saldrá del comando
Ejemplo:
-e 100
1074:0100 F8. 8B. CF.
-
4) Modificar la información, esto es, dar un nuevo dato y oprimir enter.
Ejemplo:
-e 100
1074:0100 F8.54 8B.45 En este caso en la dirección 100 en lugar de tener un F8 ahora se tendrá un 54 y en la siguiente dirección (101) en lugar de tener un 8B se tendrá ahora un 45. Para verificar esto se debe utilizar el comando D con la dirección 100.

Otra forma de usar el comando es además de dar la dirección, dar una cadena encerrada entre comillas (“”). Esta información será almacenada a partir de la dirección dada en el segmento de datos.
Ejemplo:
-e 100 "Lenguaje ensamblador"
-
Ahora verificamos que realmente tenemos esta cadena en el segmento de datos a partir de la dirección 100, para ello utilizamos el comando D.
-d 100,130
1074:0100 4C 65 6E 67 75 61 6A 65-20 65 6E 73 61 6D 62 6C Lenguaje ensambl
1074:0110 61 64 6F 72 BA FF FF B8-00 AE CD 2F 34 00 63 10 ador......./4.c.
1074:0120 DB E2 0A C0 74 09 56 57-E8 2A 21 5F 5E 73 0A B9 ....t.VW.*!_^s..
1074:0130 04 .
-
Comando R (Register). Muestra el contenido de los registros y permite modificarlos.
Sintaxis:
R [nombre del registro]
Ejemplo:
-r En este caso solo muestra el contenido de los registros
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1074 ES=1074 SS=1074 CS=1074 IP=0100 NV UP EI PL NZ NA PO NC
1074:0100 4C DEC SP
-
-r bx
BX 0000
:0
-r ds
DS 1074 Este es el valor anterior del registro ds
:1000 Aquí estamos cambiando el valor de los registros bx y ds.
-r
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1000 ES=1074 SS=1074 CS=1074 IP=0100 NV UP EI PL NZ NA PO NC
1074:0100 4C DEC SP Banderas

- Aquí podemos comprobar que sí se realizaron nuestros cambios

Las banderas que podemos visualizar con el comando r son 8, éstas están representadas por 2 caracteres y tienen dos estados. Aquí no aparece la bandera de Trap.
Bandera Encendido Apagado
OF (Overflow) OV NV
DF (Direction) DN (Decremento) UP (Incremento)
IF (Interrupt) EI (Habilitado) DI (Deshabilitado)
SF (Sign) NG (Negativo) PL (Positivo)
ZF (Zero) ZR NZ
AF (Auxiliary Carry) AC NA
PF (Parity) PE (Par) PO (Impar)
CF (Carry) CY NC
Comando T (Trace). Permite ejecutar una a una las instrucciones de un programa, a partir de la dirección especificada, o de la dirección contenida en el registro IP.
Sintaxis:
T[=dirección] [numero]
Si se omite la dirección el depurador ejecuta la instrucción cuya dirección esta contenida en el registro IP.
Si no se omite el número, este comando ejecutará número de instrucciones a partir de la dirección dada o contenida en el registro IP.
Si se omite numero, solo se ejecuta una sola instrucción.
Ejemplo:
-t=100 2 Se ejecutaron 2 instrucciones a partir de la dirección 100

AX=0000 BX=0000 CX=0000 DX=0000 SP=FFE5 BP=0000 SI=0004 DI=0000
DS=1000 ES=1074 SS=1074 CS=1074 IP=0101 NV UP EI NG NZ NA PO NC
1074:0101 65 DB 65

AX=0000 BX=0000 CX=0000 DX=0000 SP=FFE5 BP=0000 SI=0005 DI=0000
DS=1000 ES=1074 SS=1074 CS=1074 IP=0167 NV UP EI NG NZ NA PO NC
1074:0167 E3D7 JCXZ 0140 Esta es la siguiente instrucción
-
Esta es la dirección de la siguiente instrucción a ejecutarse

-t Se ejecuta una sola instrucción

AX=0000 BX=0000 CX=0000 DX=0000 SP=FFE5 BP=0000 SI=0005 DI=0000
DS=1000 ES=1074 SS=1074 CS=1074 IP=0140 NV UP EI NG NZ NA PO NC
1074:0140 AC LODSB
-
Comando U. Permite ver el contenido del segmento de código (el conjunto de instrucciones) a partir de la dirección especificada y se esta se omite, a partir de la dirección contenida en el registro IP.
Sintaxis;
U [dirección inicial, dirección final]
Si se omite la dirección final se muestran 1f bytes del segmento de código, o menos si es que alguna instrucción sobrepasa los 1f bytes.
Ejemplo:
-u 100,104
1074:0100 4C DEC SP
1074:0101 65 DB 65
1074:0102 6E DB 6E
1074:0103 67 DB 67
1074:0104 7561 JNZ 0167

Comando Q (Quit). Nos permite salir del depurador.
Sintaxis:
Q
Comando G. Permite ejecutar un conjunto de instrucciones.
Sintaxis:
G=dir_inicial, dir_final
Comando w. Permite guardar un conjunto de instrucciones a disco.
Sintaxis:
w dir_inicial
Antes hay que colocar el número de bytes de que consta el programa en los registros BX CX.

2) Introducir y ejecutar un programa.

El comando A.
El comando A (assemble, ensamblar) le dice a debug que acepte instrucciones simbólicas en ensamblador y las convierta a lenguaje de maquina.

2.1 Ensamblar
A) Inicialice la dirección de inicio en el segmento de código con desplazamiento 100h para sus instrucciones como

A 100h (enter)

Debug muestra el valor del segmento de código y el desplazamiento como 0CD3:0100

B) Ingrese el siguiente programa:

MOV AL, 25 (Enter)
MOV BL, 32 (Enter)
ADD AL, BL (Enter)
INT 20 (Enter)

C) Guarde el programa con la extensión *.com
D) Salir del debug
E) Cargar el programa anteriormente guardado
F) Verificar el código de maquina generado
G) Verificar si el programa esta cargado en memoria
H) Ahora rastree la ejecución del programa:

No hay comentarios:

Publicar un comentario