You are on page 1of 24

PRCTICA DE PROGRAMACIN CON DEBUG

M.C.C. Sergio Luis Castillo Valerio

La herramienta debug

DEBUG es una herramienta de DOS que es til para:


revisin, correccin y creacin de programas y rutinas. Correccin de pequeos errores en un programa sin la necesidad de volver a ensamblarlo. Observar la ejecucin de un programa de manera controlada (paso a paso, por ejem).

Invocacin del debug

Para utilizar DEBUG, en una ventana de DOS teclear:


debug<Enter>

Al cargarse, el DEBUG despliega un -.

Este prompt indica que DEBUG est esperando algn comando.

Comandos de DEBUG

Los comandos de esta herramienta son casi todos letras simples:


a: Assembler (ensamblar). u: Unassembler (desensamblar). d: Desplegar(dump=vaciar,volcar). e: Entry (Introducir informacin). ?: Despliega una lista de los comandos.

Captura de programas
Con el debug podemos cargar en memoria programas en lenguaje mquina. Por ejemplo:

e 100 b8 00 01 bb 00 02 01 d8 cd 20 <Enter>

Con esto indicamos que queremos introducir, a partir del desplazamiento 100, los bytes b8, 00, 01, etc. Todos los nmeros estn en hexadecimal.

Despliegue de informacin
Para observar el contenido de la memoria podemos usar el comando d Por ejemplo, para ver el programa anterior tecleamos:

d 100<Enter>

Este comando desplegar algo parecido a lo siguiente:

Despliegue de informacin
C:\>debug<Enter> -e 100 b8 00 01 bb 00 02 01 d8 cd 20<Enter> -d 100<Enter> 1BA5:0100 B8 00 01 BB 00 02 01 D8-CD 20 0D 1BA5:0110 0E 69 D7 89 3E 6B D7 59-5F 5E C3 1BA5:0120 4F 05 89 0E 5F E2 51 F3-A4 32 C0 1BA5:0130 69 E4 F3 A4 AA 5E 8B 47-03 2B C6 1BA5:0140 E3 C7 06 5B E2 69 E4 01-06 59 E2 1BA5:0150 53 8B 1E 5F E2 80 BF 64-E3 5C 74 1BA5:0160 3A 74 0B C6 87 65 E3 5C-43 83 06 1BA5:0170 59 E2 65 E3 01 1E 59 E2-80 3E 5D AA 56 AA C7 01 12 5F E2 5F 34 59 06 06 80 E2 00 0E 00 5E 59 5B BF 01 75 1F 94 56 E2 E2 64 C7 0D 89 1B BF 65 C3 E3 06 C7 ......... .._... .i..>k.Y_^.V4... O..._.Q..2..Y^V. i....^.G.+...Y.e ...[.i...Y...[.. S.._...d.\t...d. :t...e.\C.._.... Y.e...Y..>]..u..

Desensamble de programas

Para desensamblar nuestro programa tecleamos:


u 100<Enter>

Desensamblar: traducir de lenguaje mquina a lenguaje ensamblador. Este comando desplegar algo parecido a lo siguiente:

Desensamble de programas
-u 100<Enter> 1BA5:0100 B80001 1BA5:0103 BB0002 1BA5:0106 01D8 1BA5:0108 CD20 1BA5:010A 0DAA5F 1BA5:010D 0E 1BA5:010E 1F 1BA5:010F 890E69D7 1BA5:0113 893E6BD7 1BA5:0117 59 1BA5:0118 5F 1BA5:0119 5E 1BA5:011A C3 1BA5:011B 56 1BA5:011C 3400 1BA5:011E 94 1BA5:011F 1B4F05 MOV MOV ADD INT OR PUSH POP MOV MOV POP POP POP RET PUSH XOR XCHG SBB AX,0100 BX,0200 AX,BX 20 AX,5FAA CS DS [D769],CX [D76B],DI CX DI SI SI AL,00 SP,AX CX,[BX+05]

Ensamble de programas
DEBUG tambin permite el ensamble de programas. Ensamblar: Traducir de lenguaje ensamblador (assembly) a lenguaje mquina. El comando a nos permite capturar programas en lenguaje ensamblador.

Ensamble de programas

A manera de prctica capture el siguiente programa:


C:\>debug<Enter> -a 100<Enter> 1BA5:0100 mov ax,10<Enter> 1BA5:0103 mov bx,20<Enter> 1BA5:0106 add ax,bx<Enter> 1BA5:0108 int 20<Enter> 1BA5:010A<Enter> -

Contenido de los registros


El comando r despliega el contenido de los registros. Si despus de ensamblar el programa anterior, tecleamos el comando r, se desplegar algo parecido a lo siguiente:

-r<Enter> AX=0000 BX=0000 DS=1BA5 ES=1BA5 1BA5:0100 B81000 CX=0000 DX=0000 SP=FFEE SS=1BA5 CS=1BA5 IP=0100 MOV AX,0010 BP=0000 SI=0000 DI=0000 NV UP EI PL NZ NA PO NC

Registro de Banderas
Activa (1) Inactiva (0) -----------------------------------------------------------------OV: Overflow NV: No overflow DN: Direction Down UP: Direction Up EI: Interrupts enabled DI: Interrupt disabled NG: Sign Flag Negative PL: Sign Flag Plus ZR: Zero NZ: Not zero AC: Auxiliary Carry NA: No Aux Carry PO: Odd Parity PE: Even Parity CY: Carry NC: No carry

Trazado de programas
El comando t nos permite trazar un programa. Trazar: Ejecutar paso a paso (instruccin por instruccin) un programa. La instruccin a ejecutar es aquella a la que apunta el registro IP.

Trazado de programas
Vamos a trazar el ltimo programa que capturamos. Observe que cuando desplegamos los registros justo despus de capturar el programa, la ltima lnea muestra la primera instruccin de nuestro programa (mov ax,0010).

Trazado de programas
-r AX=0000 BX=0000 DS=178D ES=178D 178D:0100 B81000 -t AX=0010 BX=0000 DS=178D ES=178D 178D:0103 BB2000 -t AX=0010 BX=0020 DS=178D ES=178D 178D:0106 01D8 -t AX=0030 BX=0020 DS=178D ES=178D 178D:0108 CD20 -g CX=0000 DX=0000 SP=FFEE SS=178D CS=178D IP=0100 MOV AX,0010 BP=0000 SI=0000 DI=0000 NV UP EI PL NZ NA PO NC

CX=0000 DX=0000 SP=FFEE SS=178D CS=178D IP=0103 MOV BX,0020

BP=0000 SI=0000 DI=0000 NV UP EI PL NZ NA PO NC

CX=0000 DX=0000 SP=FFEE SS=178D CS=178D IP=0106 ADD AX,BX

BP=0000 SI=0000 DI=0000 NV UP EI PL NZ NA PO NC

CX=0000 DX=0000 SS=178D CS=178D INT 20

SP=FFEE IP=0108

BP=0000 SI=0000 DI=0000 NV UP EI PL NZ NA PE NC

El programa ha finalizado con normalidad -

Suma de 30 primeros enteros

Vamos a capturar este programa de ejemplo:


mov ax,0 ; Suma=0 mov bx,1 ;i=1 mientras1: cmp bx,30 ; Mientras (bx 30) haz jg fin_mientras1 add ax,bx ; suma=suma+i inc bx ;i=i+1 jmp mientras1 fin_mientras1: int 20h ; fin.

Captura de programa
-a 100<Enter> 178D:0100 mov ax,0<Enter> 178D:0103 mov bx,1<Enter> 178D:0106 cmp bx,1e<Enter> 178D:0109 jg 120<Enter> 178D:010B add ax,bx<Enter> 178D:010D inc bx<Enter> 178D:010E jmp 106<Enter> 178D:0110 int 20<Enter> 178D:0112<Enter> -

Compara

bx con 30(1Eh)

Al

momento de la captura no conozco la direccin de fin_mientras, por tanto supongo que ser 120h

Captura de programa

Al terminar la captura encuentro que el salto condicional debe ser a la direccin 110h y no a la 120h como supuse, por tanto, corrijo la instruccin en 109h:
-a 109 178D:0109 jg 110<Enter> 178D:010B<Enter> -

Captura de programa

Ahora desensamblo el programa ya corregido:

-u 178D:0100 178D:0103 178D:0106 178D:0109 178D:010B 178D:010D 178D:010E 178D:0110 178D:0112 178D:0113 178D:0115 178D:0117 178D:0118 178D:011A 178D:011C 178D:011E -

B80000 BB0100 83FB1E 7F05 01D8 43 EBF6 CD20 1E 7205 01D8 43 EBF6 CD20 3400 7C17

MOV MOV CMP JG ADD INC JMP INT PUSH JB ADD INC JMP INT XOR JL

AX,0000 BX,0001 BX,+1E 0110 AX,BX BX 0106 20 DS 011A AX,BX BX 0110 20 AL,00 0137

Ejecucin rpida
Adems del trazado, es posible ejecutar un programa hasta que el IP apunte a cierta direccin. Para nuestro programa la instruccin final es Int 20h, que est en la direccin 110h. Para detener nuestro programa antes de ejecutar esta instruccin tecleamos:

g 110<Enter>

Ejecucin rpida

Esto desplegar algo parecido a lo siguiente:


CX=0000 DX=0000 SS=178D CS=178D INT 20 SP=FFEE IP=0110 BP=0000 SI=0000 DI=0000 NV UP EI PL NZ NA PO NC

-g 110<Enter>
AX=01D1 BX=001F DS=178D ES=178D 178D:0110 CD20 -

AX=01D1h=465=1+2+3+...+29+30

Instrucciones aritmticas

A manera de prctica ejecute las siguientes operaciones:


513x23 (201hx17h) 1215x119(4bfhx77h) 1525/14(5f5h/eh)

Introduce ahora el programa para calcular la raz cuadrada aproximada.

Algoritmo raiz cuadrada aproximada


AX = 81 BX = 1 CX = 0 ; N ; Impar ; Contador

while (AX > 0) AX = AX BX CX = CX + 1

BX = BX + 2
finwhile CX = Raiz aproximada de N.