DEBUG
Ingresar al debug
Escribir la orden debug en el prompt del DOS
C:>debug
-
Ya estamos posicionados en el DEBUG y éste está preparado para recibir órdenes del debug.
Tipeamos lo siguiente:
-?
Nos mostrará la información que sigue.
ensamblar A [dirección]
comparar C dirección de intervalo
volcar D
escribir E dirección
llenar F lista de intervalos
Ir G [=dirección]
hex H valor1 valor2
entrada I puerto
cargar L [dirección]
[primer_sector] [número]
mover M dirección de intervalo
nombre N [nombre_ruta] [lista_argumentos]
salida O byte de puerto
proceder P [=dirección] [número]
salir Q
registrar R
buscar S lista de intervalos
seguimiento T [=dirección]
desensamblar U
escribir W [dirección]
[primer_sector] [número]
asignar memoria expandida XA [#páginas]
desasignar memoria expandida XD
asignar páginas de memoria expandida XM [Lpágina] [Ppágina]
mostrar estado de la memoria expandida XS
Ver los registros de la cpu.
Escribir en el prompt del debug
-r
Nos muestra lo que sigue:
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1987 ES=1987 SS=1987 CS=1987 IP=0100 NV UP EI PL NZ NA PO NC
-
El significado de los diferentes registros se da en la tabla siguiente.
AX: Acumulador *Almacena el resultado de operaciones matemáticas; lectura / escritura (I/O) desde y hacia los puertos que están conectados con los periféricos; almacena también un área de memoria temporal.
BX :Registro Base *Almacena direcciones o valores y puede interactuar con el Acumulador.
CX: Registro Contador *Utilizados para la ejecución de LOOPS y puede ser incrementado o decrementado según la instrucción que sea necesaria
DX :Registro de Datos *De acuerdo a la estructura de computadores analizada por nosotros corresponde al MDR (MEMORY DATA REGISTER) y es el paso intermedio para el ingreso de datos.
DS: Registro de segmento de datos *Es un puntero que nos indica la dirección donde se encuentran los datos.
ES: Segmento extra para datos *Igual que el anterior pero apuntando a una dirección mayor.
SS: Registro de segmento de pila * Indica donde se encuentra el STACK.
CS: Registro de segmento código *Indica donde esta almacenado el código para la ejecución del programa.
BP: Puntero del STACK *Registro complementario para no modificar el SS.
SI: Registro de índice de segmento *Almacena una dirección que nos indica donde se encuentra el vector de datos.
DI: Ìndice destino *Contiene una dirección donde se copiara el vector de datos indicado por SI.
SP: Puntero de Pila (STACK POINTER) * Permite saber donde se encuentra el último dato almacenado en el STACK. Siempre debe ser mayor o igual al SS o BP
IP :Apuntador de la siguiente instrucción (INSTRUCTION POINTER) *También llamado PROGRAM COUNTER. Tiene almacenada la dirección de la próxima instrucción a ser ejecutada.
Registro bandera o STATUS REGISTER, que nos da el resultado de la última operación de la ALU.
Señal REF Función REF Función
Overflow NV No hay OV Hay
Direction UP Hacia adelante DN Hacia atrás
Interrupts DI Desactivadas EI Activadas
Sign PL Valor positivo NG Valor negativo
Zero NZ No es cero ZR Es cero
Auxiliary Carry NA No hay acarreo AC Hay acarreo
Parity PO Paridad impar PE Paridad Par
Carry NC No hay acarreo CY Se produjo acarreo
Comando del debug
r (registro)
Nos permite interactuar con los registros de la CPU, posibilitando modificar sus contenidos. Cuando tipeamos r sin ningún otro parámetro nos muestra todos los registros con sus respectivos contenidos, pero si agregamos un parámetro nos va a mostrar solo el contenido del registro que nosotros mencionamos:
-r bx
BX 0000
-r bx
BX 0000
:5555
-r
AX=0000 BX=5555 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1987 ES=1987 SS=1987 CS=1987 IP=0100 NV UP EI PL NZ NA PO NC
Comando del debug
a (dirección)
Nos permite ingresar código assembler en la memoria del computador. Se escribe la a y luego la dirección de memoria donde se almacenará el programa assembler
-a 100
XXXX:0100 MOV AX, 0200 Mover 200 al acumulador (AX)
XXXX:0103 MOV BX, 0300 Mover 300 al Registro Base (BX)
Sumar con el debug.
Se pide sumar dos valores (200 y 300)
Ingresamos las siguientes instrucciones en el orden dado
-a 100 Indica que se debe comenzar a ingresar datos a partir de la posición 100
XXXX:0100 MOV AX, 0200 Mover 200 al acumulador (AX)
XXXX:0103 MOV BX, 0300 Mover 300 al Registro Base (BX)
XXXX:0106 ADD AX, BX Sumar BX a AX
XXXX:0108
-
Comando del debug
u (dirección desde) (dirección hasta)
Nos permite ver el código assembler que está almacenado en la memoria del computador a partir de la dirección desde hasta la dirección hasta.
-u 0100 010A
XXXX:0100 MOV AX, 0200 Mover 200 al acumulador (AX)
XXXX:0103 MOV BX, 0300 Mover 300 al Registro Base (BX)
XXXX:0106 ADD AX, BX Sumar BX a AX
XXXX:0108
Observemos los diferentes tamaños de las instrucciones que utilizamos:
La primera y segunda corresponden a la sentencia MOV (mover) y tienen un longitud de tres bytes.
La tercera corresponde a una instrucción de suma y tiene solo dos.
Comando del debug
d (dirección)
Nos muestra la memoria dividida en dos partes a partir de una dirección dada.
a) La comprendida por caracteres hexadecimales que nos permiten ver todo el contenido de la memoria porque la combinación de bits en un nibble (4 bits) siempre tiene representación en hexadecimal.
b) En caracteres, en castellano o ingles, pero no se entiende mucho porque normalmente la configuración de memoria no tiene una estructura semántica y sintáctica que podamos comprender.
c) El guión que separa en dos partes la memoria expresada en hexadecimal no indica el cambio de palabra.
Direccionamiento de memoria
Este programa muestra como se carga un dato en el registro AX desde la dirección de memoria 0200 correspondiente al segmento de datos DS. La manera es simple se coloca entre corchetes la dirección de memoria [0200 ].
-a
1987:0100 mov ax,[0200]
1987:0103 mov cx,[0FFF]
1987:0107 add ax,cx
1987:0109
Comando del debug
-t
Nos permite ejecutar el programa anterior paso a paso
Primero vemos que tienen almacenados los registros de la cpu.
-r
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1987 ES=1987 SS=1987 CS=1987 IP=0100 NV UP EI PL NZ NA PO NC
1987:0100 A10002 MOV AX,[0200]
DS:0200=A708
-
Vemos que AX = 0000 que CX= 0000 y que la dirección [0200] = A708 que está indicada por el registro DS que se encuentra en la parte inferior derecha del ejemplo y en negrilla. Ahora vamos a usar el comando TRACE que se representa por la letra t. Este nos permite ver paso a paso que sucede en nuestro computador.
-t
AX=A708 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1987 ES=1987 SS=1987 CS=1987 IP=0103 NV UP EI PL NZ NA PO NC
1987:0103 8B0EFF0F MOV CX,[0FFF]
DS:0FFF=DB52
-
Vemos que la primera instrucción modificó el contenido del registro AX con el valor de DS. Esto está bien, porque es lo que nosotros pedimos. Si volvemos a tipear t ejecutaremos la segunda instrucción.
-t
AX=A708 BX=0000 CX=DB52 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1987 ES=1987 SS=1987 CS=1987 IP=0107 NV UP EI PL NZ NA PO NC
1987:0107 01C8 ADD AX,CX
-
Vemos que ahora no aparece el registro DS porque en la instrucción que se va a ejecutar no mencionamos direcciones.
-t
AX=825A BX=0000 CX=DB52 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1987 ES=1987 SS=1987 CS=1987 IP=0109 NV UP EI NG NZ NA PE CY
1987:0109 CD20 INT 20
-
Se ha realizado la suma de los dos registros y algunas cosas se han modificado.
a) El registro AX se ha modificado pero notemos que el nuevo valor es inferior al que ya teníamos almacenado. ¿Porqué? La respuesta es simple porque se ha producido un acarreo. Se recomienda realizar la suma manualmente para comprobar que lo sucedido es cierto.
b) Veamos que el STATUS REGISTER ha modificado su valor indicándonos que eso ha sucedido, para mayor claridad lo marcamos en negrilla y en color.
c) Compárelo con el DISPLAY anterior.
Por último ejecutemos INT 20.
-t
AX=825A BX=0000 CX=DB52 DX=0000 SP=FFE8 BP=0000 SI=0000 DI=0000
DS=1987 ES=1987 SS=1987 CS=00CA IP=0FA8 NV UP DI NG NZ NA PE CY
00CA:0FA8 90 NOP
-
Observemos que la nueva instrucción que aparece es un NOP (NO OPERATION) indicándonos que el programa ha terminado.
NOTA: Podemos ejecutar directamente (t) pero nos mostrará la segunda instrucción a ejecutarse y la primera ya ejecutada. Tipee q en la línea de comando, vuelva a tipear DEBUG y cargue nuevamente el programa, posteriormente empiece directamente con el TRACE.
-