240 likes | 409 Views
PRÁCTICA DE PROGRAMACIÓN CON “DEBUG”. © M.C.C. Sergio Luis Castillo Valerio. La herramienta “debug”. DEBUG es una herramienta de DOS que es útil para: revisión, corrección y creación de programas y rutinas.
E N D
PRÁCTICA DEPROGRAMACIÓNCON “DEBUG” © M.C.C. Sergio Luis Castillo Valerio
La herramienta “debug” • DEBUG es una herramienta de DOS que es útil para: • revisión, corrección y creación de programas y rutinas. • Corrección de pequeños errores en un programa sin la necesidad de volver a ensamblarlo. • Observar la ejecución de un programa de manera controlada (paso a paso, por ejem).
Invocación 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 algún 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 información). • ?: Despliega una lista de los comandos.
Captura de programas • Con el debug podemos cargar en memoria programas en lenguaje máquina. • 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 números están en hexadecimal.
Despliegue de información • 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 información 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 AA 5F 0E 1F 89 ......... .._... 1BA5:0110 0E 69 D7 89 3E 6B D7 59-5F 5E C3 56 34 00 94 1B .i..>k.Y_^.V4... 1BA5:0120 4F 05 89 0E 5F E2 51 F3-A4 32 C0 AA 59 5E 56 BF O..._.Q..2..Y^V. 1BA5:0130 69 E4 F3 A4 AA 5E 8B 47-03 2B C6 C7 06 59 E2 65 i....^.G.+...Y.e 1BA5:0140 E3 C7 06 5B E2 69 E4 01-06 59 E2 01 06 5B E2 C3 ...[.i...Y...[.. 1BA5:0150 53 8B 1E 5F E2 80 BF 64-E3 5C 74 12 80 BF 64 E3 S.._...d.\t...d. 1BA5:0160 3A 74 0B C6 87 65 E3 5C-43 83 06 5F E2 01 C7 06 :t...e.\C.._.... 1BA5:0170 59 E2 65 E3 01 1E 59 E2-80 3E 5D E2 00 75 0D C7 Y.e...Y..>]..u.. -
Desensamble de programas • Para “desensamblar” nuestro programa tecleamos: • u 100<Enter> • Desensamblar: traducir de lenguaje máquina a lenguaje ensamblador. • Este comando desplegará algo parecido a lo siguiente:
Desensamble de programas -u 100<Enter> 1BA5:0100 B80001 MOV AX,0100 1BA5:0103 BB0002 MOV BX,0200 1BA5:0106 01D8 ADD AX,BX 1BA5:0108 CD20 INT 20 1BA5:010A 0DAA5F OR AX,5FAA 1BA5:010D 0E PUSH CS 1BA5:010E 1F POP DS 1BA5:010F 890E69D7 MOV [D769],CX 1BA5:0113 893E6BD7 MOV [D76B],DI 1BA5:0117 59 POP CX 1BA5:0118 5F POP DI 1BA5:0119 5E POP SI 1BA5:011A C3 RET 1BA5:011B 56 PUSH SI 1BA5:011C 3400 XOR AL,00 1BA5:011E 94 XCHG SP,AX 1BA5:011F 1B4F05 SBB CX,[BX+05] -
Ensamble de programas • DEBUG también permite el “ensamble” de programas. • Ensamblar: Traducir de lenguaje ensamblador (assembly) a lenguaje máquina. • El comando “a” nos permite capturar programas en lenguaje ensamblador.
Ensamble de programas 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> - • A manera de práctica capture el siguiente programa:
Contenido de los registros -r<Enter> AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=1BA5 ES=1BA5 SS=1BA5 CS=1BA5 IP=0100 NV UP EI PL NZ NA PO NC 1BA5:0100 B81000 MOV AX,0010 - • El comando “r” despliega el contenido de los registros. • Si después de ensamblar el programa anterior, tecleamos el comando “r”, se desplegará algo parecido a lo siguiente:
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 (instrucción por instrucción) un programa. • La instrucción 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 después de capturar el programa, la última línea muestra la primera instrucción de nuestro programa (mov ax,0010).
Trazado de programas -r AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=178D ES=178D SS=178D CS=178D IP=0100 NV UP EI PL NZ NA PO NC 178D:0100 B81000 MOV AX,0010 -t AX=0010 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=178D ES=178D SS=178D CS=178D IP=0103 NV UP EI PL NZ NA PO NC 178D:0103 BB2000 MOV BX,0020 -t AX=0010 BX=0020 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=178D ES=178D SS=178D CS=178D IP=0106 NV UP EI PL NZ NA PO NC 178D:0106 01D8 ADD AX,BX -t AX=0030 BX=0020 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=178D ES=178D SS=178D CS=178D IP=0108 NV UP EI PL NZ NA PE NC 178D:0108 CD20 INT 20 -g El programa ha finalizado con normalidad -
Suma de 30 primeros enteros 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. • Vamos a capturar este programa de ejemplo:
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 dirección de fin_mientras, por tanto supongo que será 120h
Captura de programa -a 109 178D:0109 jg 110<Enter> 178D:010B<Enter> - • Al terminar la captura encuentro que el salto condicional debe ser a la dirección 110h y no a la 120h como supuse, por tanto, corrijo la instrucción en 109h:
Captura de programa -u 178D:0100 B80000 MOV AX,0000 178D:0103 BB0100 MOV BX,0001 178D:0106 83FB1E CMP BX,+1E 178D:0109 7F05 JG 0110 178D:010B 01D8 ADD AX,BX 178D:010D 43 INC BX 178D:010E EBF6 JMP 0106 178D:0110 CD20 INT 20 178D:0112 1E PUSH DS 178D:0113 7205 JB 011A 178D:0115 01D8 ADD AX,BX 178D:0117 43 INC BX 178D:0118 EBF6 JMP 0110 178D:011A CD20 INT 20 178D:011C 3400 XOR AL,00 178D:011E 7C17 JL 0137 - • Ahora desensamblo el programa ya corregido:
Ejecución rápida • - g 110<Enter> • Además del trazado, es posible ejecutar un programa hasta que el IP apunte a cierta dirección. • Para nuestro programa la instrucción final es “Int 20h”, que está en la dirección 110h. • Para detener nuestro programa antes de ejecutar esta instrucción tecleamos:
Ejecución rápida -g 110<Enter> AX=01D1 BX=001F CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=178D ES=178D SS=178D CS=178D IP=0110 NV UP EI PL NZ NA PO NC 178D:0110 CD20 INT 20 - • Esto desplegará algo parecido a lo siguiente: • AX=01D1h=465=1+2+3+...+29+30
Instrucciones aritméticas • A manera de práctica ejecute las siguientes operaciones: • 513x23 (201hx17h) • 1215x119(4bfhx77h) • 1525/14(5f5h/eh) • Introduce ahora el programa para calcular la raíz cuadrada aproximada.
Algoritmo raiz cuadrada aproximada AX = 81 ; N BX = 1 ; Impar CX = 0 ; Contador while (AX > 0) AX = AX – BX CX = CX + 1 BX = BX + 2 finwhile CX = Raiz aproximada de N.