viernes, 28 de enero de 2011

Guia de Laboratorio No.3 del Debug

 
Guía No.3 del Debug

REVISION DE LOS RECURSOS DE LA PC MEDIANTE DEBUG

El DEBUG permite visualizar  la memoria, introducir programas en ella y rastrear su ejecución. Una característica de debug es que despliega todo el código del  programa y los datos de formato hexadecimal.

LISTA DE COMANDOS

A[dirección] Ensamblar: ensambla instrucciones simbólicas y la pasa a código maquina.
C [Com1] [Fin1] [Com2] Comparar: compara dos bloques de memoria
D [Comienzo] [Final] Volcar: muestra el contenido de un área de memoria
E dirección [lista] Introducir: introduce datos en memoria, iniciando en una localidad específica.
F lista de rango Llenar: Llena un rango de memoria
G [dirección] [direcc.] Ir: corre el programa ejecutable que se encuentra en memoria
H valor1 valor2 Aritmética Hexadecimal: Realiza la suma y resta de direcciones
I puerto Entrada:
L [dirección] Cargar: carga un programa.
M [intervalo] [destino] Mover: mueve el contenido de una localidad de memoria a otra.
N [ruta y nombre] Nombre: nombra un programa.
O [puerto] [byte] Salida:
P [dirección][número] Continuar: ejecuta una instrucción
Q Salir: sale de la sesión del debug
R [registro] Registro: rastrea el contenido de registros
S [rango] [lista] Buscar:
T [dirección][valor]  Seguir: rastrea la ejecución de una instrucción
U [rango] Desensamblar: desensambla código maquina y pasa a código simbólico
W [dirección] Escribir: Graba un programa en disco.



1)  Usar el comando D, para mostrar el contenido de la memoria

1.1  verificación  del equipo del sistema

Una palabra del estado del equipo en el área de datos del BIOS, ofrece una indicación rudimentaria de los dispositivos instalados. Esta palabra esta en las localidades 410H-411H, que puede ver desde debug por medio  de una dirección de dos partes: 40 para la dirección del segmento y 10 para el desplazamiento, teclee lo siguiente
D 40:10 (enter)

El despliegue debe empezar con algo como esto::
0040:0010  63   44

En este ejemplo, los 2 bytes en la palabra del estado del equipo contienen los valores hexadecimales 63 y 44. Invierta los bytes (44  63) y convierta a binario.

Bit
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0

0
1
0
0
0
1
0
0
0
1
1
0
0
0
1
1

A continuación está una explicación del código hexadecimal

bits
dispositivo
15,14
Numero de puertos paralelos para impresora conectados =1(01)
11-9
Numero de puertos seriales conectados =2(binario 010)
7,6
Numero de dispositivos de discos flexibles =2(donde 00=1,  01=2,  10=3,  11=4)
5,4
Modo inicial de video = 10(donde 01=40X25 en color, 10=80X1225 en color, 11= 80X1225 monocromático)
1
1= coprocesador matemático esta presente
0
1= unidad de disco flexible esta presente


1.2  Verificación del tamaño de la memoria (localidades : 413H y 414H)
Teclee:
            D 40:13(enter)

Despliegue (depende de cada PC):

            0040:0013  ..  ..   ..   ..  XX  XX  XX

Los primeros dos bytes mostrados en el desplazamiento 0013H son los KB de memoria en hexadecimal, con los bytes en secuencia inversa. Ejemplo

Hexadecimal inverso
Hexadecimal corregido
Valor decimal (k)
00   02
02    00
512
80   02
02    80
640


1.3  Verificación del numero de serie y la nota de derecho reservado
 (localidad: FE000H)
Teclee
D FE00:0 (Enter)

La pantalla debe mostrar un numero de siete dígitos seguido, en maquinas convencionales, de una nota de derecho reservados es mas reconocible en el área ASCII a la derecha. La nota de derechos reservados puede continuar pasando sobre lo que ya esta mostrado; para verla, basta con presionar D, seguido de la tecla enter.

1.4  Verificación de su ROM BIOS inicia en la localidad FFFF5H, registrada como mm/dd/aa para verla teclee:
D FFFF: 5
El conocimiento de esta fecha puede ser útil para determinar la edad y modelo de la computadora.

1.5  Verificación de la identificación del modelo, en la localidad FFFFEH
Teclee:
D FFFF: E  (enter) 

Código hex.
modelo
F8
PS/2 modelos 70 y 80
F9
PC convertible
FA
PS/2 modelo 30
FB
PC-XT (1986)
FC
PC-AT, PC-XT modelo 286, PS/2 modelos 50 y 60
FE
PC-XT (1982), portátil (1982)
FF
Primera IBM PC

Ahora que ya sabe como usar el comando para desplegar información, puede ver el contenido de cualquier localidad de almacenamiento. También puede avanzar por la memoria con solo presionar D de forma repetida. DEBUG muestra de manera sucesiva 8 líneas, continuando a partir de la última operación D.
Para finalizar, teclee Q (salir), o continúe con la siguiente practica.

II) Usando los comandos del debug realizar los siguientes ejercicios:

2.1) Mostrar el estado de todos los registros y banderas

2.2) Realizar la suma y resta de los siguientes pares numéricos
* 100 108
* 108 100

2.3) Asignar al registro AX el valor 34A3 y BX el valor 33DA, verificando luego el resultado

2.4) Utilizando las instrucciones del Debug, examinar el bloque de memoria 100-110 y compararlo con el bloque 200-210, mostrando el resultado.

2.5) Llenar el segmento de memoria de 0100 – 0170 con asteriscos, utilizando para ello la instrucción F del debug.

2.6) Proporcione los comandos de Debug para las siguientes necesidades:
a) Muestre la memoria iniciando el en desplazamiento 264H en el segmento de   datos.
b) Muestre la memoria iniciando en la localidad 410H.
Nota: Separe esta dirección en  los valores de su segmento y del desplazamiento.
c) Ingrese el valor hexadecimal A8B364 en el segmento de datos iniciando en la  localidad 200H.

2.7) Suponga que ha utilizado debug para introducir el comando siguiente:
         - E CS: 100 B8 45 01 05 25 00

El valor 45 hexadecimal supuestamente era 54. Codifique otro comando E para corregir solo el byte que esta incorrecto. Esto es cambiar el 45 por 54 de forma directa.

III) Trabajando con programas en debug
3.1) Elabore un programa que cargue los registros con los siguientes valores
AX:10
BX:20
CX:30
DX:40
Luego ejecutar los siguientes comandos y anotar las observaciones.
* u 100
* d 100
* g 100
* q


3.2) El siguiente programa  escribe un asterisco en la pantalla, grabar ese programa en el disco y luego ejecutarlo desde el prompt del DOS.

0BBD:0100 mov AH,02     Utiliza la interrupción 21, función 02
0BBD:0102 mov DL,2a     para escribir un carácter en la pantalla. 0BBD:0104 int 21   El valor del ASCII a mostrar se ingresa
0BBD:0106 int 20   en DL, en este caso 2a
0BBD:0108

3.3) Cargar el programa anteriormente grabado y verificar si el programa se encuentra en la memoria

3.4) Mover el programa anterior a la posición 010C

3.5) Realizar un programa que cargue dos números cualquiera en los registros AX y BX, y luego que sume y reste esos dos números guardando el resultado de la suma en AX y la resta en BX.

3.6) Ingresar con el comando a el siguiente código

mov ax,156
add ax,100
add ax,100
int 20

Mediante los comandos del debug copiar las últimas 3 instrucciones a la posición donde se encuentra la int 20.
Guardar el programa y luego ejecutarlo verificando el valor de AX

3.7) Utilice el comando A de debug para introducir las siguientes instrucciones:
         mov bx,25
         add bx,30
         shl bx,1
         sub bx,22
         nop

Desensamble las instrucciones y rastree su ejecución hasta nop y revise el valor del registro bx después de cada instrucción.

3.8). Dado el siguiente programa:

        
Instrucción de maquina
Código simbólico
Explicación

B82301
052500
8BD8
03D8
8BCB
2BC8
2BC0
90

MOV AX,0123
ADD AX,0025
MOV BX,AX
ADD BX,AX
MOV CX,BX
SUB CX,AX
SUB AX,AX
NOP

Mover el valor 0123 a AX
Sumar el valor 0025 a AX
Mover el contenido de AX a BX
Sumar el contenido de AX a BX
Mover el contenido de BX a CX
Restar el contenido de AX del de CX
Restar AX  de AX (Limpiar AX)
No operación (No hacer nada)



a)     Como introduciría este programa directamente en memoria?
b)    Como verificar luego que el programa esta cargado en memoria?

3.9) La instrucción mov word ptr [120],25 mueve el numero 25 a las localidades  de memoria 120 y 121.
    La instrucción mov byte ptr [122],30 mueve el numero 30 a la localidad de memoria   122.
    Si utiliza la instrucción mov dword ptr [123],50 ¿Cuántas localidades de  memoria  utilizaría este numero?

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: