Tutorial Debug

22
Arquitectura y Tecnología de los Computadores. Departamento de Automática. Universidad de Alcalá. Laboratorio de Estructura de Computadores - 1- MANUAL BREVE DE “DEBUG” Se trata de una utilidad muy poco amigable, sin menús y -sólo en versiones recientes- con ayuda mínima, pero una vez aprendidos unos cuantos comandos es extremadamente potente. Hay quien lo considera como el mejor programa que ha hecho Microsoft. Debug, invocado sin parámetros, se carga y pasa a mostrar un lacónico guión, a la espera de órdenes del usuario. Todas -a excepción de las relativas a operaciones con memoria expandida, que no se verán aquí- constan de una única letra seguida o no de parámetros. Si se va a desensamblar un programa, se le puede indicar a debug que lo cargue también tras cargarse él escribiendo: debug nombre-del-programa argumentos-del-programa C:\> Debug [Enter] En la siguiente línea aparecerá un guión, éste es el indicador del Debug, en este momento se pueden introducir las instrucciones del Debug. Utilizando los comandos: A: ASSEMBLE Sin parámetros ensambla las instrucciones que se introduzcan, guardándolas en la dirección siguiente a la que se llegó en el último "a". Cuando se utiliza este comando se le puede dar como parámetro la dirección donde se desea que se inicie el ensamblado, si se omite el parámetro el ensamblado se iniciará en la localización especificada por CS:IP, usualmente 0100H, que es la localización donde deben iniciar los programas con extensión .COM, y será la localización que utilizaremos debido a que debug solo puede crear este tipo específico de programas. También se le puede decir qué zona se desea ver con a <direccion> pudiendo ser la dirección absoluta (a segmento:desplazamiento) o relativa al segmento de código actual (a desplazamiento). Parámetros : <dir_comienzo> Resultados : se pueden escribir instrucciones en ensamblador a partir de la dirección de memoria CS:<dir_comienzo>, hasta que se pulse INTRO. Si no especificamos el parámetro <dir_comienzo> se toma como dirección de inicio CS:IP Ejemplo : Vamos a usar la instrucción MOV, que como veremos más adelante, sirve para copiar datos de la memoria a los registros y viceversa, además de copiar datos entre registros, que es justo lo que vamos a usar en el ejemplo. -a 2048:0106 mov ax,bx

Transcript of Tutorial Debug

Page 1: Tutorial Debug

Arquitectura y Tecnología de los Computadores. Departamento de Automática.

Universidad de Alcalá.

Laboratorio de Estructura de Computadores - 1-

MANUAL BREVE DE “DEBUG”

Se trata de una utilidad muy poco amigable, sin menús y -sólo en versiones recientes- con ayuda mínima, pero una vez aprendidos unos cuantos comandos es extremadamente potente. Hay quien lo considera como el mejor programa que ha hecho Microsoft.

Debug, invocado sin parámetros, se carga y pasa a mostrar un lacónico guión, a la espera de órdenes del usuario. Todas -a excepción de las relativas a operaciones con memoria expandida, que no se verán aquí- constan de una única letra seguida o no de parámetros. Si se va a desensamblar un programa, se le puede indicar a debug que lo cargue también tras cargarse él escribiendo:

debug nombre-del-programa argumentos-del-programa

C:\> Debug [Enter]

En la siguiente línea aparecerá un guión, éste es el indicador del Debug, en este momento se pueden introducir las instrucciones del Debug. Utilizando los comandos:

A: ASSEMBLE

Sin parámetros ensambla las instrucciones que se introduzcan, guardándolas en la dirección siguiente a la que se llegó en el último "a".

Cuando se utiliza este comando se le puede dar como parámetro la dirección donde se desea que se inicie el ensamblado, si se omite el parámetro el ensamblado se iniciará en la localización especificada por CS:IP, usualmente 0100H, que es la localización donde deben iniciar los programas con extensión .COM, y será la localización que utilizaremos debido a que debug solo puede crear este tipo específico de programas.

También se le puede decir qué zona se desea ver con a <direccion> pudiendo ser la dirección absoluta (a segmento:desplazamiento) o relativa al segmento de código actual (a desplazamiento).

Parámetros: <dir_comienzo>

Resultados: se pueden escribir instrucciones en ensamblador a partir de la dirección de memoria CS:<dir_comienzo>, hasta que se pulse INTRO. Si no especificamos el parámetro <dir_comienzo> se toma como dirección de inicio CS:IP

Ejemplo: Vamos a usar la instrucción MOV, que como veremos más adelante, sirve para copiar datos de la memoria a los registros y viceversa, además de copiar datos entre registros, que es justo lo que vamos a usar en el ejemplo.

-a2048:0106 mov ax,bx

Page 2: Tutorial Debug

Arquitectura y Tecnología de los Computadores. Departamento de Automática.

Universidad de Alcalá.

Laboratorio de Estructura de Computadores - 2-

2048:0108 mov bx,cx2048:010A-u 106 1082048:0106 89D8 MOV AX,BX2048:0108 89CB MOV BX,CX

Como veremos más adelante, la instrucción 'U' sirve para hacer volcados de memoria, pero no viendo el contenido de la misma, sino interpretándola como instrucciones en lenguaje ensamblador.

; Ejemplo 2

-r csCS 2048:2050-a 200 2050:0200 mov ax,bx 2050:0202 -u 200 2002050:0200 89D8 MOV AX,BX

D: DUMP

Muestra el contenido de una zona de memoria en hexadecimal y en ASCII. Sin parámetros muestra los primeros 128 bytes a partir de la posición a la que se llegó en el último "d". Si se le da un rango, mostrará ese rango.

Parámetros: <dir_1> ; Dirección de comienzo del volcado [<dir_2>] ; Dirección final del volcado.

Resultado: Presenta por pantalla el contenido de las direcciones de memoria entre DS:<dir_1> y DS:<dir_2> ( si no se ha especificado el segundo parámetro, nos hace un volcado desde <dir_1>

Ejemplo:

-d 100 2048:0100 92 D3 3D 64 00 77 0B 3D-50 00 73 03 05 64 00 05 ..=d.w.=P.s..d.. 2048:0110 6C 07 A3 BF E1 E8 4C 00-B0 08 F8 5F 34 00 37 20 l.....L...._4.7 2048:0120 FF EB F8 33 C0 51 B9 0A-00 80 3C 30 72 12 80 3C ...3.Q....<0r..< 2048:0130 39 77 0D F6 E1 02 04 80-D4 00 2D 30 00 46 EB E9 9w........-0.F.. 2048:0140 59 C3 AC 3A 06 2B E1 74-0E 3C 2F 74 0A 3C 2D 74 Y..:.+.t.<-t 2048:0150 06 3C 2E 74 02 F9 C3 80-3C 30 72 F9 80 3C 39 77 .<.t....<0r..<9w 2048:0160 F4 F8 EB F2 50 53 8B 1E-8E D3 B8 C6 DB E8 31 FE ....PS........1. 2048:0170 3B 77 09 77 03 5B 58 C3-FF 06 8E D3 8B 1E 8E D3 ;w.w.[X.........

Page 3: Tutorial Debug

Arquitectura y Tecnología de los Computadores. Departamento de Automática.

Universidad de Alcalá.

Laboratorio de Estructura de Computadores - 3-

-d 100 110 2048:0100 92 D3 3D 64 00 77 0B 3D-50 00 73 03 05 64 00 05 ..=d.w.=P.s..d.. 2048:0110 6C l

(NOTA: El contenido de la memoria seguramente no coincide.)

E DIRECCION: EDIT

Permite editar, byte por byte, una zona de memoria. Muestra -en hexadecimal- el byte de esa posición y permite escribir otro valor para cambiarlo. Pulsando espacio pasa al byte siguiente, dejando como estaba el anterior si no se ha cambiado, o guardando los cambios si sí se ha hecho. Para terminar la edición se pulsa INTRO.

Parámetros: <dir_comienzo> [lista de palabras a escribir]

Resultados: Se escribe a partir de la dirección de memoria DS:<dir_comienzo> la lista de palabras (dos dígitos hexadecimales) del segundo parámetro. Si no se especifica un segundo parámetro entonces DEBUG no permite introducir palabra a palabra los datos que queramos, a partir de la dirección DS:<dir_comienzo>. Podemos pasar a la palabra siguiente de memoria presionando la tecla ESPACIO, cuando hayamos terminado de introducir los datos que queramos, hay que pulsar INTRO

Ejemplo:

-e 100 00 01 02-d 100 1022048:0100 00 01 02 ...

; Ejemplo 2

-e 100 2048:0100 00. 01.04 02.05 64. -d 100 1032048:0100 00 04 05 64 ...d

F: FILL

Llena una zona de memoria con un valor determinado. Como al terminar un programa la zona de memoria en que se residía no se borra (poniéndola a cero, por ejemplo), a menudo es útil para distinguir entre lo que son datos del programa actual y lo que es basura del anterior.

Parámetros: <dir_comienzo> <dir_final> <patrón> ; Palabra con la que queremos rellenar

Resultados: Rellenamos las direcciones de memoria entre DS:<dir_comienzo> y DS:<dir_final> con el patrón especificado

Page 4: Tutorial Debug

Arquitectura y Tecnología de los Computadores. Departamento de Automática.

Universidad de Alcalá.

Laboratorio de Estructura de Computadores - 4-

Ejemplo:

-f 100 105 66-d 100 1052048:0100 66 66 66 66 66 66 ffffff

Ejemplo:

-f 100 FFFF 0

Llena de ceros lo que hay desde la posición 100 (hexadecimal) hasta el final del segmento.

G: GO

Sin parámetros, empieza a ejecutar desde la posición cs:ip hasta que se acabe el programa. Si la orden es "g <direccion>", la ejecución empieza en cs:ip y termina (debug pone un break point) justo antes de ejecutar la instrucción que se encuentra en <direccion>.

Parámetros: [<=dir_origen>] <dir_destino> ( NOTA: HAY QUE INCLUIR EL '=' )

Resultados: se ejecutan instrucciones desde CS:<dir_origen> hasta CS:<ir_destino>, si no se especifica la dirección origen, se toma como dirección origen CS:IP. Por cierto no se os ocurra ejecutar el comando 'G' a secas, porque podéis parar en alguna instrucción que no tiene sentido o podéis obtener un bonito cuelgue de la ventana MS-DOS o un bloqueo del sistema, si lo estás ejecutando A PANTALLA COMPLETA; a no ser que por casualidades del destino, DEBUG encuentre una int 20h, o cualquier cosa peor.

Ejemplo: Vamos a usar una interrupción de MS-DOS para presentar una letra por pantalla, esta subrutina es el servicio 02h de la interrupción 21h, y pasándole como parámetro el valor hexadecimal del carácter ASCII a.

-rAX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000DS=2048 ES=2048 SS=2048 CS=2048 IP=0100 NV UP EI PL NZ NA PO NC2048:0100 92 XCHG DX,AX-a 100 2048:0100 mov ax,02002048:0103 mov dl,612048:0105 int 212048:0107-g 107

aAX=0261 BX=0000 CX=0000 DX=0061 SP=FFEE BP=0000 SI=0000 DI=0000DS=2048 ES=2048 SS=2048 CS=2048 IP=0107 NV UP EI PL NZ NA PO NC

Page 5: Tutorial Debug

Arquitectura y Tecnología de los Computadores. Departamento de Automática.

Universidad de Alcalá.

Laboratorio de Estructura de Computadores - 5-

2048:0107 3D5000 CMP AX,0050-g =100 107aAX=0261 BX=0000 CX=0000 DX=0061 SP=FFEE BP=0000 SI=0000 DI=0000DS=2048 ES=2048 SS=2048 CS=2048 IP=0107 NV UP EI PL NZ NA PO NC2048:0107 3D5000 CMP AX,0050

H NUM1 NUM2: HEX

Muestra por pantalla el resultado (en hexadecimal) de las operaciones num1+num2 y num1-num2.

Parámetros: 2 números hexadecimales de 4 dígitos ( máximo )

Uso: la instrucción "H <op_1> <op_2>" nos devuelve la suma y la resta ( en complemento a dos ) de los dos operandos suministrados

Resultado: <resultado_1> ; Es la suma ( <op_1> + <op_2>), <resultado_2> ; es la resta (<op_1> - <op_2> )

Ejemplo:

-h 0003 00020005 0001-h 0000 00010001 FFFF

Como se observa, el resultado de la segunda operación es FFFF que es el equivalente en complemento a 2 de -1

L: LOAD

La sintaxis completa es l [direccion] [unidad] [sector] [n sectores]. Si se le dan todos los parámetros lee de la unidad dada, empezando en el sector indicado, tantos sectores como determine "nsectores" y los guarda en la posición de memoria especificada por "dirección". Poniendo sólo l dirección intenta cargar el fichero definido con la orden n (ver abajo) en esa posición.

Parámetros: <direc_destino> <unidad> <primer_sector> <numero>

Resultados: Esta instrucción carga en comenzando en la dirección de memoria DS:<dir_destino> el <numero> de sectores especificados de la <unidad> ( NOTA: A= 0, B=1, C=2, ... )

Ejemplo: voy a leer el sector 0 del disco A y lo vuelco a partir de la dirección DS:100, ( ESTO NO QUIERE DECIR QUE OS TENGA QUE SALIR LO MISMO EN VUESTRO VOLCADO )

Page 6: Tutorial Debug

Arquitectura y Tecnología de los Computadores. Departamento de Automática.

Universidad de Alcalá.

Laboratorio de Estructura de Computadores - 6-

-l 100 0 0 1 -d 100 3002048:0100 EB 3E 90 29 79 3B 46 5D-49 48 43 00 02 01 01 00 .>.)y;F]IHC.....2048:0110 02 E0 00 40 0B F0 09 00-12 00 02 00 00 00 00 00 [email protected]:0120 00 00 00 00 00 00 29 5D-46 DB 1C 4E 4F 20 4E 41 ......)]F..NO NA2048:0130 4D 45 20 20 20 20 46 41-54 31 32 20 20 20 F1 7D ME FAT12 .}2048:0140 FA 33 C9 8E D1 BC FC 7B-16 07 BD 78 00 C5 76 00 .3.....{...x..v.2048:0150 1E 56 16 55 BF 22 05 89-7E 00 89 4E 02 B1 0B FC .V.U."..~..N....2048:0160 F3 A4 06 1F BD 00 7C C6-45 FE 0F 8B 46 18 88 45 ......|.E...F..E2048:0170 F9 FB 38 66 24 7C 04 CD-13 72 3C 8A 46 10 98 F7 ..8f$|...r<.F...2048:0180 66 16 03 46 1C 13 56 1E-03 46 0E 13 D1 50 52 89 f..F..V..F...PR.2048:0190 46 FC 89 56 FE B8 20 00-8B 76 11 F7 E6 8B 5E 0B F..V.. ..v....^.2048:01A0 03 C3 48 F7 F3 01 46 FC-11 4E FE 5A 58 BB 00 07 ..H...F..N.ZX...2048:01B0 8B FB B1 01 E8 94 00 72-47 38 2D 74 19 B1 0B 56 .......rG8-t...V2048:01C0 8B 76 3E F3 A6 5E 74 4A-4E 74 0B 03 F9 83 C7 15 .v>..^tJNt......2048:01D0 3B FB 72 E5 EB D7 2B C9-B8 D8 7D 87 46 3E 3C D8 ;.r...+...}.F><.2048:01E0 75 99 BE 80 7D AC 98 03-F0 AC 84 C0 74 17 3C FF u...}.......t.<.2048:01F0 74 09 B4 0E BB 07 00 CD-10 EB EE BE 83 7D EB E5 t............}..2048:0200 BE 81 7D EB E0 33 C0 CD-16 5E 1F 8F 04 8F 44 02 ..}..3...^....D.2048:0210 CD 19 BE 82 7D 8B 7D 0F-83 FF 02 72 C8 8B C7 48 ....}.}....r...H2048:0220 48 8A 4E 0D F7 E1 03 46-FC 13 56 FE BB 00 07 53 H.N....F..V....S2048:0230 B1 04 E8 16 00 5B 72 C8-81 3F 4D 5A 75 A7 81 BF .....[r..?MZu...2048:0240 00 02 42 4A 75 9F EA 00-02 70 00 50 52 51 91 92 ..BJu....p.PRQ..2048:0250 33 D2 F7 76 18 91 F7 76-18 42 87 CA F7 76 1A 8A 3..v...v.B...v..2048:0260 F2 8A 56 24 8A E8 D0 CC-D0 CC 0A CC B8 01 02 CD ..V$............2048:0270 13 59 5A 58 72 09 40 75-01 42 03 5E 0B E2 CC C3 [email protected].^....2048:0280 03 18 01 27 0D 0A 44 69-73 63 6F 20 69 6E 63 6F ...'..Disco inco2048:0290 72 72 65 63 74 6F 20 20-20 FF 0D 0A 45 72 72 6F rrecto ...Erro2048:02A0 72 20 45 2F 53 20 20 20-20 20 FF 0D 0A 43 61 6D r E/S ...Cam2048:02B0 62 69 65 20 65 6C 20 64-69 73 63 6F 20 79 20 70 bie el disco y p2048:02C0 72 65 73 69 6F 6E 65 20-75 6E 61 20 74 65 63 6C resione una tecl2048:02D0 61 20 20 20 20 0D 0A 00-49 4F 20 20 20 20 20 20 a ...IO2048:02E0 53 59 53 4D 53 44 4F 53-20 20 20 53 59 53 80 01 SYSMSDOS SYS..2048:02F0 00 57 49 4E 42 4F 4F 54-20 53 59 53 00 00 55 AA .WINBOOT SYS..U.2048:0300 BE .

M RANGO DIRECCION: MOVE

Mueve la zona de memoria delimitada por "rango" a la dirección "dirección".

N NOMBRE: NAME Da un nombre de fichero sobre el que actúan l y w.

P: STEP

Trace puede ser incómodo si no se quiere depurar el código de las rutinas de interrupción , o si ya se sabe el código que hay en las subrutinas y tan sólo interesa seguir avanzando sin entrar en ellas. En estos casos se usa p.

Parámetros: <=dir_origen> <NUM_instrucciones>

Resultados: es como el comando 'T' sin embargo si llamamos a una subrutina y usáramos el comando 'T' entraríamos dentro del código de la subrutina, por lo que si ejecutamos una interrupción de MS-DOS no sabríamos que estamos haciendo

Ejemplo:

Page 7: Tutorial Debug

Arquitectura y Tecnología de los Computadores. Departamento de Automática.

Universidad de Alcalá.

Laboratorio de Estructura de Computadores - 7-

-rAX=0261 BX=0000 CX=0000 DX=0061 SP=FFEE BP=0000 SI=0000 DI=0000DS=2048 ES=2048 SS=2048 CS=2048 IP=0107 NV UP EI PL NZ NA PO NC2048:0107 3D5000 CMP AX,0050-a 1002048:0100 mov ax,02002048:0103 mov dl,612048:0105 int 212048:0107-p =100 3AX=0200 BX=0000 CX=0000 DX=0061 SP=FFEE BP=0000 SI=0000 DI=0000DS=2048 ES=2048 SS=2048 CS=2048 IP=0103 NV UP EI PL NZ NA PO NC2048:0103 B261 MOV DL,61AX=0200 BX=0000 CX=0000 DX=0061 SP=FFEE BP=0000 SI=0000 DI=0000DS=2048 ES=2048 SS=2048 CS=2048 IP=0105 NV UP EI PL NZ NA PO NC2048:0105 CD21 INT 21aAX=0261 BX=0000 CX=0000 DX=0061 SP=FFEE BP=0000 SI=0000 DI=0000DS=2048 ES=2048 SS=2048 CS=2048 IP=0107 NV UP EI PL NZ NA PO NC2048:0107 3D5000 CMP AX,0050

Q: QUIT

Salir de debug y volver al DOS.

R: REGISTERS

Sin parámetros, muestra el contenido de los registros de la CPU, así como la próxima instrucción a ejecutar.

r registro muestra el contenido del registro especificado y cambia el prompt de "-" a ":" invitando a que se cambie su valor. Pulsando Enter sin más lo deja como estaba.

Parámetros: [registro]

Resultado: Si especificamos un registro, DEBUG nos permite modificar el contenido de ese registro, si no lo hemos especificado, nos presenta por pantalla el contenido de los registros principales del procesador, además nos muestra la instrucción apuntada por CS:IP

Registro de flags: Para poder cambiar el registro de flags, hay que usar el comando "H F" y aparecerá algo tal que así:

NV UP EI PL NZ NA PO NC - ; meter aquí una lista de los indicadores que se quieran.

Page 8: Tutorial Debug

Arquitectura y Tecnología de los Computadores. Departamento de Automática.

Universidad de Alcalá.

Laboratorio de Estructura de Computadores - 8-

Desbordamiento ( si/no) Poner: OV Quitar: NV

Direccion(reducción / incremento) poner: DN quitar UP

Interrupción(activar/desactivar) poner: EI quitar: DI

Signo (negativo / positivo) poner: NG quitar: PL

Cero ( sí / no) poner: ZR quitar: NZ

Acarrero Auxiliar ( sí / no ) poner: AC quitar: NA

Paridad ( par / impar ) poner: PE quitar: PO

Acarreo (sí / no ) poner: CY quitar: NC

Ejemplo:

-rAX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000DS=2048 ES=2048 SS=2048 CS=2048 IP=0100 NV UP EI PL NZ NA PO NC2048:0100 92 XCHG DX,AX

; Ejemplo 2

-r ax AX 0000:01-r AX=0001 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000DS=2048 ES=2048 SS=2048 CS=2048 IP=0100 NV UP EI PL NZ NA PO NC2048:0100 92 XCHG DX,AX

S: SEARCH

Page 9: Tutorial Debug

Arquitectura y Tecnología de los Computadores. Departamento de Automática.

Universidad de Alcalá.

Laboratorio de Estructura de Computadores - 9-

Busca una secuencia de bytes o una cadena en el rango especificado, mostrando la dirección en que aparece en pantalla. s 100 500 cd 13 Busca todas las llamadas a la interrupción 13h (código máquina cdh 13h). s 100:0 ffff "virus" muestra las zonas de memoria del segmento 100h en que aparece la palabra "virus".

T: TRACE

Ejecuta la instrucción apuntada por cs:ip y vuelve a debug. Permite ejecutar paso a paso un programa y observar en cada instrucción el efecto producido. Si haciendo "trace" se llega a una subrutina (CALL) o a una interrupción (INT) la siguiente instrucción que se ejecutará será la primera de la subrutina o la primera de la rutina de atención de la interrupción correspondiente.

Parámetros: [< =dirección>] ; Dirección a partir de la cual se quiere que se tracee (OJO: HAY QUE PONER EL '=' ) <num_instrucciones> ; Número de instrucciones que hay que ejecutar

Resultados: se ejecutan las <NUM_instrucciones> instrucciones a partir de CS:<direccion> ( si se ha especificado <direccion> ) o se ejecutan <NUM_instrucciones> a partir de CS:IP, si no se especifica el parámetro <NUM_instrucciones> se ejecuta una única instrucción

Ejemplo:

-rAX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000DS=2048 ES=2048 SS=2048 CS=2048 IP=0100 NV UP EI PL NZ NA PO NC2048:0100 3D0000 CMP AX,0000-r bxBX 0000:2-a 1002048:0100 mov ax,bx2048:0102-tAX=0002 BX=0002 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000DS=2048 ES=2048 SS=2048 CS=2048 IP=0102 NV UP EI PL NZ NA PO NC2048:0102 00AC01D8 ADD [SI+D801],CH DS:D801=74

; Ejemplo 2

-rAX=0000 BX=0007 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000DS=2048 ES=2048 SS=2048 CS=2048 IP=0100 NV UP EI PL NZ NA PO NC2048:0100 3D0000 CMP AX,0000-a 1002048:0100 mov ax,bx2048:0102 mov cx,bx

Page 10: Tutorial Debug

Arquitectura y Tecnología de los Computadores. Departamento de Automática.

Universidad de Alcalá.

Laboratorio de Estructura de Computadores - 10-

2048:0104-t 2AX=0007 BX=0007 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000DS=2048 ES=2048 SS=2048 CS=2048 IP=0102 NV UP EI PL NZ NA PO NC2048:0102 89D9 MOV CX,BXAX=0007 BX=0007 CX=0007 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000DS=2048 ES=2048 SS=2048 CS=2048 IP=0104 NV UP EI PL NZ NA PO NC2048:0104 01D8 ADD AX,BX

U : UNASSEMBLE

Desensambla una zona de memoria. Si no se le dan parámetros empieza a hacerlo en la dirección apuntada por cs:ip. También se le puede decir qué zona se quiere ver con u <dirección> pudiendo ser la dirección absoluta (u segmento:desplazamiento) o relativa al segmento de código actual (u desplazamiento).

Si se da un rango de direcciones desensamblará esa zona: u 1000 2000 desensambla el código que haya desde cs:1000 a cs:2000. Todos los números son tratados como hexadecimales, así que u 1000 empieza a desensamblar desde la posición 4096 (decimal) del segmento de código.

Parámetros: <dir_comienzo> [<dir_final>]

Resultados: se desensamblan las direcciones de memoria a partir de CS:<dir_comienzo> hasta CS:<dir_final> ( <dir_final> es opcional )

Ejemplo:

-u 100 11e2050:0100 7403 JZ 01052050:0102 E97F00 JMP 01842050:0105 8B4EFA MOV CX,[BP-06]2050:0108 E303 JCXZ 010D2050:010A B90200 MOV CX,00022050:010D 83C108 ADD CX,+082050:0110 B82871 MOV AX,71282050:0113 50 PUSH AX2050:0114 51 PUSH CX2050:0115 9A1A025D2F CALL 2F5D:021A2050:011A 0BC0 OR AX,AX2050:011C 7463 JZ 01812050:011E 8B3E2A71 MOV DI,[712A]

; Ejemplo 2

Page 11: Tutorial Debug

Arquitectura y Tecnología de los Computadores. Departamento de Automática.

Universidad de Alcalá.

Laboratorio de Estructura de Computadores - 11-

-u 1002050:0100 7403 JZ 01052050:0102 E97F00 JMP 01842050:0105 8B4EFA MOV CX,[BP-06]2050:0108 E303 JCXZ 010D2050:010A B90200 MOV CX,00022050:010D 83C108 ADD CX,+082050:0110 B82871 MOV AX,71282050:0113 50 PUSH AX2050:0114 51 PUSH CX2050:0115 9A1A025D2F CALL 2F5D:021A2050:011A 0BC0 OR AX,AX2050:011C 7463 JZ 01812050:011E 8B3E2A71 MOV DI,[712A]

W: WRITE

La sintaxis completa es w [dirección] [unidad] [sector] [n sectores] Con todos los parámetros escribe en la unidad y sectores dados el contenido de la dirección de memoria.

Pasándole sólo la dirección escribe en el fichero definido con n tantos bytes como determinen el par de registros BX:CX a partir de la posición de memoria dada.

?: AYUDA?

En versiones recientes de MS-DOS (por lo menos a partir de la 5) muestra una mini-ayuda.

Existen algunas órdenes más para tratar con memoria expandida y otras operaciones que no serán de especial relevancia para el tema que nos ocupa.

Es posible cambiar el valor del registro de banderas, así como utilizarlo como estructura de control en nuestros programas como se verá mas adelante. Cada bit del registro tiene un nombre y significado especial, la lista dada a continuación describe el valor de cada bit, tanto apagado como prendido y su relación con las operaciones del procesador:

Overflow NV = no hay desbordamiento; OV = sí lo hay Direction UP = hacia adelante; DN = hacia atras; Interrupts DI = desactivadas;

Page 12: Tutorial Debug

Arquitectura y Tecnología de los Computadores. Departamento de Automática.

Universidad de Alcalá.

Laboratorio de Estructura de Computadores - 12-

EI = activadas Sign PL = positivo; NG = negativo Zero NZ = no es cero; ZR = sí lo es Auxiliary Carry NA = no hay acarreo auxiliar; AC = hay acarreo auxiliar Parity PO = paridad non; PE = paridad par; Carry NC = no hay acarreo; CY = Sí lo hay

Para asentar ideas y de paso aprender algunos pasos útiles a los que se hará referencia varias veces, unos ejemplos.

Ejemplo completo: Escribir y comprobar un programa que imprime el contenido del puerto 378h como numero hexadecimal. Las entradas del operador son en negrita. Los comentarios son en latina (no les consideras como entrada): C:\>debug Como pedir ayuda de DEBUG – entrar ?. -a100 Assembly a partir de CS:100

No utilizar las direcciones CS:0 – CS:100 – en estas direcciones se encuentran los PSP y COM del programa.

106E:0100 mov dx,378 Todos los números en DEBUG son en HEX. 106E:0103 in al,dx 106E:0104 call 140 Tal como no hay etiquetas tenemos que utilizar direcciones

absolutas. En este punto necesitamos un programa que convierte el AL en una cadena de caracteres (dígitos hex).

106E:0107 int 3 Este es un punto de parada (interrupción del programa, breakpoint). Lo entramos a mano (notar que no utilizamos mov AX,4c00// int 21 o int 20). Se utiliza int 3 porque ocupa solo un byte y puede remplazar cualquier instrucción.

Page 13: Tutorial Debug

Arquitectura y Tecnología de los Computadores. Departamento de Automática.

Universidad de Alcalá.

Laboratorio de Estructura de Computadores - 13-

106E:0108 Salimos del ensamblador con entrada de una línea vacía. -a104 Ensamblador de nuevo a partir de la dirección 104 (mirar arriba) 106E:0104 mov di,200 ; seria la dirección donde se encuentra la cadena de salida. 106E:0107 call 140 ; el programa que convierte AL a cadena de dos caracteres 106E:010A mov dx,200 ; Escribimos en CON: “sea lo que sea CON:” 106E:010D mov ah,9 106E:010F int 21 106E:0111 int 3 ; La parada cómoda de DEBUG. Por la diferencia de INT 20h

escribe el contenido de los registros. 106E:0112 -a140 ; Esto seria el programa de conversión de AL en HEX 106E:0140 cld 106E:0141 call 143 ; Supongamos que a partir de la siguiente instrucción hay un programa que convierte la parte alta de al a carácter ASCII (HEX). Calculamos y es erróneo, la dirección de la siguiente instrucción no esta en 141+2-> 143). 106E:0144 rol al,1 ; Nos hemos equivocado – la siguiente instrucción empieza en 144. 106E:0146 ; Volvemos a entrar a partir de 144. -a141 106E:0141 call 144 106E:0144 rol al,1 106E:0146 rol al,1 106E:0148 rol al,1 106E:014A rol al,1 106E:014C push ax 106E:014D and al,0f 106E:014F cmp al,a ; Si al esta fuera del rango 0-a ; no hay caracteres 106E:0151 jna 156 ; No sabemos donde saltar, porque seria muy complicado memorizar la longitud de todas las instrucciones y calcular direcciones en hex sentándose ante un ordenador, pero sabemos que esta cerca de esta dirección. Apostamos por 156 106E:0153 add al,6 ; tenemos de añadir ‘A’-(‘9’+1) que es mas o menos 6. 106E:0155 add al,a 106E:0157 stosb 106E:0158 pop ax 106E:0159 ret Corregimos la instrucción equivocada (la dirección no es 156 pero 155). -a151 106E:0151 jna 155 106E:0153 Todo esta listo para ejecutar: Ultima mirada antes de ejecutar: -u100

Page 14: Tutorial Debug

Arquitectura y Tecnología de los Computadores. Departamento de Automática.

Universidad de Alcalá.

Laboratorio de Estructura de Computadores - 14-

106E:0100 BA7803 MOV DX,0378106E:0103 EC IN AL,DX106E:0104 BF0002 MOV DI,0200106E:0107 E83600 CALL 0140106E:010A BA0002 MOV DX,0200106E:010D B409 MOV AH,09106E:010F CD21 INT 21106E:0111 CC INT 3106E:0112 2BC6 SUB AX,SI ; Esto es basura. Puede

; ser muy distinto106E:0114 8BC8 MOV CX,AX106E:0116 E87BF4 CALL F594106E:0119 83F97F CMP CX,+7F106E:011C 3400 XOR AL,00106E:011E 5D POP BP106E:011F 1000 ADC [BX+SI],AL-u140 106E:0140 FC CLD106E:0141 E80000 CALL 0144106E:0144 D0C0 ROL AL,1106E:0146 D0C0 ROL AL,1106E:0148 D0C0 ROL AL,1106E:014A D0C0 ROL AL,1106E:014C 50 PUSH AX106E:014D 240F AND AL,0F106E:014F 3C0A CMP AL,0A106E:0151 7602 JBE 0155106E:0153 0406 ADD AL,06106E:0155 040A ADD AL,0A106E:0157 AA STOSB106E:0158 58 POP AX106E:0159 C3 RET106E:015A 215F5E AND [BX+5E],BX ; basura

Ejecutamos paso a paso a partir de CS:100 -t=100 Significa Trace – ejecutar la siguiente instrucción

(con el flag T de 8086 a partir de la dirección 100h) AX=0000 BX=0000 CX=0000 DX=0378 SP=FFEE BP=0000 SI=0000 DI=0000 DS=106E ES=106E SS=106E CS=106E IP=0103 NV UP EI PL NZ NA PO NC 106E:0103 EC IN AL,DX Después de ejecutar la instrucción en 100 (mov dx,378) el DEBUG escribe el contenido de los registros y la siguiente instrucción de ejecutar (IN AL,DX). Notar que DX tiene valor 378. -t ; Sin dirección significa que se ejecuta la siguiente instrucción AX=0000 BX=0000 CX=0000 DX=0378 SP=FFEE BP=0000 SI=0000 DI=0000

Page 15: Tutorial Debug

Arquitectura y Tecnología de los Computadores. Departamento de Automática.

Universidad de Alcalá.

Laboratorio de Estructura de Computadores - 15-

DS=106E ES=106E SS=106E CS=106E IP=0104 NV UP EI PL NZ NA PO NC 106E:0104 BF0002 MOV DI,0200 -t ; Parece trivial, tal como en el puerto 378 había 00 (AL=00). Seria mucho mas instructivo si había 0B5h en AL. Cambiamos el contenido de AL con 0B5h: -r AX AX 0000 :00B5 AX=00B5 BX=0000 CX=0000 DX=0378 SP=FFEE BP=0000 SI=0000 DI=0200 DS=106E ES=106E SS=106E CS=106E IP=0107 NV UP EI PL NZ NA PO NC 106E:0107 E83600 CALL 0140 -t ; seguimos AX=00B5 BX=0000 CX=0000 DX=0378 SP=FFE6 BP=0000 SI=0000 DI=0200 DS=106E ES=106E SS=106E CS=106E IP=0140 NV UP EI NG NZ AC PE CY 106E:0140 FC CLD -t ; Seguimos. Observamos que se prepara STOBS, pero nos hemos olvidado de ES. Por ‘suerte’ ES es igual a CS y DS. AX=00B5 BX=0000 CX=0000 DX=0378 SP=FFE6 BP=0000 SI=0000 DI=0200 DS=106E ES=106E SS=106E CS=106E IP=0141 NV UP EI NG NZ AC PE CY 106E:0141 E80000 CALL 0144 -t ; Entramos a escribir un carácter en la memoria. AX=00B5 BX=0000 CX=0000 DX=0378 SP=FFE4 BP=0000 SI=0000 DI=0200 DS=106E ES=106E SS=106E CS=106E IP=0144 NV UP EI NG NZ AC PE CY 106E:0144 D0C0 ROL AL,1 -t AX=006B BX=0000 CX=0000 DX=0378 SP=FFE4 BP=0000 SI=0000 DI=0200 DS=106E ES=106E SS=106E CS=106E IP=0146 OV UP EI NG NZ AC PE CY 106E:0146 D0C0 ROL AL,1 -t AX=00D6 BX=0000 CX=0000 DX=0378 SP=FFE4 BP=0000 SI=0000 DI=0200 DS=106E ES=106E SS=106E CS=106E IP=0148 OV UP EI NG NZ AC PE NC 106E:0148 D0C0 ROL AL,1 -t AX=00AD BX=0000 CX=0000 DX=0378 SP=FFE4 BP=0000 SI=0000 DI=0200 DS=106E ES=106E SS=106E CS=106E IP=014A NV UP EI NG NZ AC PE CY 106E:014A D0C0 ROL AL,1 -t AX=005B BX=0000 CX=0000 DX=0378 SP=FFE4 BP=0000 SI=0000 DI=0200 DS=106E ES=106E SS=106E CS=106E IP=014C OV UP EI NG NZ AC PE CY

Page 16: Tutorial Debug

Arquitectura y Tecnología de los Computadores. Departamento de Automática.

Universidad de Alcalá.

Laboratorio de Estructura de Computadores - 16-

106E:014C 50 PUSH AX -t AX=005B BX=0000 CX=0000 DX=0378 SP=FFE2 BP=0000 SI=0000 DI=0200 DS=106E ES=106E SS=106E CS=106E IP=014D OV UP EI NG NZ AC PE CY 106E:014D 240F AND AL,0F -t ; los nibbles (unidades de 4 bits) se han cambiado – correcto) AX=000B BX=0000 CX=0000 DX=0378 SP=FFE2 BP=0000 SI=0000 DI=0200 DS=106E ES=106E SS=106E CS=106E IP=014F NV UP EI PL NZ NA PO NC 106E:014F 3C0A CMP AL,0A -t ; en AL esta B – el primer dígito de escribir AX=000B BX=0000 CX=0000 DX=0378 SP=FFE2 BP=0000 SI=0000 DI=0200 DS=106E ES=106E SS=106E CS=106E IP=0151 NV UP EI PL NZ NA PO NC 106E:0151 7602 JBE 0155 -t AX=000B BX=0000 CX=0000 DX=0378 SP=FFE2 BP=0000 SI=0000 DI=0200 DS=106E ES=106E SS=106E CS=106E IP=0153 NV UP EI PL NZ NA PO NC 106E:0153 0406 ADD AL,06 -t AX=0011 BX=0000 CX=0000 DX=0378 SP=FFE2 BP=0000 SI=0000 DI=0200 DS=106E ES=106E SS=106E CS=106E IP=0155 NV UP EI PL NZ AC PE NC 106E:0155 0430 ADD AL,30 -t AX=0041 BX=0000 CX=0000 DX=0378 SP=FFE2 BP=0000 SI=0000 DI=0200 DS=106E ES=106E SS=106E CS=106E IP=0157 NV UP EI PL NZ NA PE NC 106E:0157 AA STOSB -t AX=0041 BX=0000 CX=0000 DX=0378 SP=FFE2 BP=0000 SI=0000 DI=0201 DS=106E ES=106E SS=106E CS=106E IP=0158 NV UP EI PL NZ NA PE NC 106E:0158 58 POP AX Veamos que hay en la memoria es:200 -d es:200 L1 ; Dump de un byte (L1) a partir de es:200 106E:0200 41 A --------------HEX-------------------------------COMO ASCII. Es erróneo! Queremos que escriba ‘B’ de ‘B5’. Nos hemos equivocado con la instrucción ADD AL,6, que tiene que estar ADD AL,7. Corregimos. Buscamos la instrucción: -u140 … … … (como antes)

Page 17: Tutorial Debug

Arquitectura y Tecnología de los Computadores. Departamento de Automática.

Universidad de Alcalá.

Laboratorio de Estructura de Computadores - 17-

-a153 106E:0153 add al,7 -u140 (por sea caso). …. (con instrucción correcta). -r ; veamos donde estamos AX=0041 BX=0000 CX=0000 DX=0378 SP=FFE2 BP=0000 SI=0000 DI=0201 DS=106E ES=106E SS=106E CS=106E IP=0158 NV UP EI PL NZ NA PE NC 106E:0158 58 POP AX ; Seguimos. -t AX=005B BX=0000 CX=0000 DX=0378 SP=FFE4 BP=0000 SI=0000 DI=0201 DS=106E ES=106E SS=106E CS=106E IP=0159 NV UP EI PL NZ NA PE NC 106E:0159 C3 RET -t AX=005B BX=0000 CX=0000 DX=0378 SP=FFE6 BP=0000 SI=0000 DI=0201 DS=106E ES=106E SS=106E CS=106E IP=0144 NV UP EI PL NZ NA PE NC 106E:0144 D0C0 ROL AL,1 ; Esto ya lo hemos visto. Andamos un poco mas deprisa. -u 106E:0144 D0C0 ROL AL,1106E:0146 D0C0 ROL AL,1106E:0148 D0C0 ROL AL,1106E:014A D0C0 ROL AL,1106E:014C 50 PUSH AX106E:014D 240F AND AL,0F106E:014F 3C0A CMP AL,0A106E:0151 7602 JBE 0155106E:0153 0407 ADD AL,07106E:0155 0430 ADD AL,30106E:0157 AA STOSB106E:0158 58 POP AX106E:0159 C3 RET; Notar que se desensambla (u de un-assembly) desde la posición actual (CS:IP). Vamos hasta RET. En AL es:200..201 podemos ver los caracteres que se han escrito. -g 159 ; g de GO mas el punto de control (breakpoint) 159. El DEBUG sustituye el contenido de CS:159 con INT 3 y después ejecuta el programa desde la dirección actual (CS:IP). Notar que la parada del programa no se garantiza (si el programa no ejecuta la instrucción de CS:159 no hay garantía que va a parar. Además 159 puede estar incluso en la mitad de una instrucción. AX=00B5 BX=0000 CX=0000 DX=0378 SP=FFE6 BP=0000 SI=0000 DI=0202 DS=106E ES=106E SS=106E CS=106E IP=0159 NV UP EI PL NZ NA PE NC 106E:0159 C3 RET -d200 201 ; Utilizamos la forma de dirección 200 hasta dirección 201.

Page 18: Tutorial Debug

Arquitectura y Tecnología de los Computadores. Departamento de Automática.

Universidad de Alcalá.

Laboratorio de Estructura de Computadores - 18-

106E:0200 41 35 A5 Menos mal – el segundo carácter es 5 de ‘B5’ – es correcto. -t AX=00B5 BX=0000 CX=0000 DX=0378 SP=FFE8 BP=0000 SI=0000 DI=0202 DS=106E ES=106E SS=106E CS=106E IP=010A NV UP EI PL NZ NA PE NC 106E:010A BA0002 MOV DX,0200 -t AX=00B5 BX=0000 CX=0000 DX=0200 SP=FFE8 BP=0000 SI=0000 DI=0202 DS=106E ES=106E SS=106E CS=106E IP=010D NV UP EI PL NZ NA PE NC 106E:010D B409 MOV AH,09 -t AX=09B5 BX=0000 CX=0000 DX=0200 SP=FFE8 BP=0000 SI=0000 DI=0202 DS=106E ES=106E SS=106E CS=106E IP=010F NV UP EI PL NZ NA PE NC 106E:010F CD21 INT 21 ; En este punto es necesario ver si todo esta correcto en la memoria DS:200. -d200 ; Sin longitud el DEBUG nos imprime 80 bytes. 106E:0200 41 35 D7 D7 C3 BE BC DB-8B 4C 05 8B 74 09 E8 08 A5.......L..t...106E:0210 00 03 F1 E8 03 00 3C 0D-C3 AC E8 04 F9 75 04 3C ......<......u.<106E:0220 3B 75 F6 4E C3 1E 52 50-53 51 56 57 2E 8E 1E FE ;u.N..RPSQVW....106E:0230 D2 80 3E 43 04 00 75 0D-F6 06 21 04 FF 75 06 E8 ..>C..u...!..u..106E:0240 0B 00 E8 59 00 5F 5E 59-5B 58 5A 1F C3 2E 80 3E ...Y._^Y[XZ....>106E:0250 D5 E2 00 74 F7 1E 0E 1F-BE D5 E2 E8 98 02 2E A1 ...t............106E:0260 2F E7 BB 40 00 BA 01 00-33 FF CD 21 1F 72 0B 8B /[email protected]..!.r..106E:0270 D8 B0 FF 86 47 18 A2 18-00 C3 0E 1F E8 D2 00 3D ....G..........=

; ERRROOOORRR!! La cadena no termina con ‘$’. Si ejecutamos int 21 puede ocurrir cualquier cosa. ; Otro error – escribimos en ES:DI pero imprimimos de DS:DI. Por ‘suerte’ el DEBUG asigna el mismo valor de todos los registros del segmento. Cambiamos el contenido de la memoria. Añadimos CR LF y ‘$’. -e202 106E:0202 0D.0d 0A.a Después de 0d tenemos de teclear espacio. Después del ultimo byte tenemos de teclear salto de linea. Entramos ‘$’ como símbolo: -e204 ‘$’ Comprobamos -d200 106E:0200 41 35 0D 0A 24 BE BC DB-8B 4C 05 8B 74 09 E8 08 A5..$....L..t... …. Ahora esta bien. -r ; donde estamos AX=09B5 BX=0000 CX=0000 DX=0200 SP=FFE8 BP=0000 SI=0000 DI=0202 DS=106E ES=106E SS=106E CS=106E IP=010F NV UP EI PL NZ NA PE NC 106E:010F CD21 INT 21

Page 19: Tutorial Debug

Arquitectura y Tecnología de los Computadores. Departamento de Automática.

Universidad de Alcalá.

Laboratorio de Estructura de Computadores - 19-

Estamos antes de ejecutar INT 21h con AH=9 y DX=200. Tenemos que ejecutar esta instrucción pero no nos interesa entrar en DOS. Por esto ejecutamos INT 21 no con t pero con p. El comando p sustituye la siguiente instrucción con INT 3 (que en este caso es también INT 3) y ejecuta el programa como si entramos G. -p A5 AX=0924 BX=0000 CX=0000 DX=0200 SP=FFE8 BP=0000 SI=0000 DI=0202 DS=106E ES=106E SS=106E CS=106E IP=0111 NV UP EI PL NZ NA PE NC 106E:0111 CC INT 3 Bien! El programa escribe A5 (después de la línea de p), como debe ser (casi, tal como tiene que escribir B5). Tal como hemos ayudando al programa ‘a mano’ de conseguir su tarea, corregimos añadiendo un patch en 180 (a partir de este momento no escribo los comandos U necesarios): -a180 106E:0180 push ds 106E:0181 pop es 106E:0182 call 140 106E:0185 mov al,d ; el CR 106E:0187 stosb 106E:0188 mov al,a ; El LF 106E:018A stosb 106E:018B mov al,24 ; El ‘$’. Podemos verlo en la memoria ES:204 106E:018D stosb 106E:018E ret 106E:018F -a107 106E:0107 call 180 ; entramos en el patch y no en 140 106E:010A ponemos en puerto 378 el valor que vamos a escribir: -o378 5D ; esto es equivalente al programa: MOV DX,378h // MOV al,5Dh // OUT dx,al Comprobamos el contenido del puerto: -i378 ; Esto es casi equivalente al nuestro programa 5D ; Correcto, tal como el puerto es un simple I/O buffer. Ejecutamos -g=100 107 ; esta parte ya la sabemos Un poco mas despacio con la nueva parte. AX=095D BX=0000 CX=0000 DX=0378 SP=FFE2 BP=0000 SI=0000 DI=0200 DS=106E ES=106E SS=106E CS=106E IP=0107 NV UP DI PL NZ NA PE NC 106E:0107 E87600 CALL 0180 -t AX=095D BX=0000 CX=0000 DX=0378 SP=FFE0 BP=0000 SI=0000 DI=0200 DS=106E ES=106E SS=106E CS=106E IP=0180 NV UP DI PL NZ NA PE NC

Page 20: Tutorial Debug

Arquitectura y Tecnología de los Computadores. Departamento de Automática.

Universidad de Alcalá.

Laboratorio de Estructura de Computadores - 20-

106E:0180 1E PUSH DS -t AX=095D BX=0000 CX=0000 DX=0378 SP=FFDE BP=0000 SI=0000 DI=0200 DS=106E ES=106E SS=106E CS=106E IP=0181 NV UP DI PL NZ NA PE NC 106E:0181 07 POP ES -t AX=095D BX=0000 CX=0000 DX=0378 SP=FFE0 BP=0000 SI=0000 DI=0200 DS=106E ES=106E SS=106E CS=106E IP=0182 NV UP DI PL NZ NA PE NC 106E:0182 E8BBFF CALL 0140 Con esto – a toda marcha. Ya lo sabemos. -p AX=095D BX=0000 CX=0000 DX=0378 SP=FFE0 BP=0000 SI=0000 DI=0202 DS=106E ES=106E SS=106E CS=106E IP=0185 NV UP DI PL NZ NA PE NC 106E:0185 B00D MOV AL,0D -t AX=090D BX=0000 CX=0000 DX=0378 SP=FFE0 BP=0000 SI=0000 DI=0202 DS=106E ES=106E SS=106E CS=106E IP=0187 NV UP DI PL NZ NA PE NC 106E:0187 AA STOSB -t AX=090D BX=0000 CX=0000 DX=0378 SP=FFE0 BP=0000 SI=0000 DI=0203 DS=106E ES=106E SS=106E CS=106E IP=0188 NV UP DI PL NZ NA PE NC 106E:0188 B00A MOV AL,0A -t AX=090A BX=0000 CX=0000 DX=0378 SP=FFE0 BP=0000 SI=0000 DI=0203 DS=106E ES=106E SS=106E CS=106E IP=018A NV UP DI PL NZ NA PE NC 106E:018A AA STOSB -t AX=090A BX=0000 CX=0000 DX=0378 SP=FFE0 BP=0000 SI=0000 DI=0204 DS=106E ES=106E SS=106E CS=106E IP=018B NV UP DI PL NZ NA PE NC 106E:018B B024 MOV AL,24 -t AX=0924 BX=0000 CX=0000 DX=0378 SP=FFE0 BP=0000 SI=0000 DI=0204 DS=106E ES=106E SS=106E CS=106E IP=018D NV UP DI PL NZ NA PE NC 106E:018D AA STOSB -t AX=0924 BX=0000 CX=0000 DX=0378 SP=FFE0 BP=0000 SI=0000 DI=0205 DS=106E ES=106E SS=106E CS=106E IP=018E NV UP DI PL NZ NA PE NC 106E:018E C3 RET

Page 21: Tutorial Debug

Arquitectura y Tecnología de los Computadores. Departamento de Automática.

Universidad de Alcalá.

Laboratorio de Estructura de Computadores - 21-

-t Comprobamos la memoria -d200 106E:0200 35 44 0D 0A 24 BE BC DB-8B 4C 05 8B 74 09 E8 08 5D..$....L..t... …. Y a toda marcha hasta el final. -g 5D AX=0924 BX=0000 CX=0000 DX=0200 SP=FFE2 BP=0000 SI=0000 DI=0205 DS=106E ES=106E SS=106E CS=106E IP=0111 NV UP DI PL NZ NA PE NC 106E:0111 CC INT 3 Lo hemos conseguido. Lo único malo de este ‘programa’ de DOS es que no termina correcto. Arreglamos el problema: -a111 106E:0111 int 20 Ahora ejecutamos desde el principio: -g=100 ; ejecutamos desde dirección CS:100 sin paradas. Salvamos el programa en el disco. -r CX ; En BX:CX – 4 bytes de longitud del fichero. Cuidado con BX! CX 0000 :100 ; Todo el código nuestro esta desde 100 (por defecto) hasta 200h – la longitud el de 100h bytes. Damos un nombre (see378.com) del fichero: -nsee378.com Escribimos el fichero: -w Salimos del DEBUG: -q Ahora tenemos el programa SEE378.COM, tal como empieza en 100h, es menos de 32K y el fichero tiene extensión .COM. El programa que escribe el contenido del puerto 378 en la pantalla. Ejecutamos: C:\>see378 5D Efectivamente. Si queremos volver a manejar este programa con DEBUG, podemos ejecutar: C:\>debug see378.com -u100. Lista de los comandos de DEBUG utilizados: -q – Salir del programa

Page 22: Tutorial Debug

Arquitectura y Tecnología de los Computadores. Departamento de Automática.

Universidad de Alcalá.

Laboratorio de Estructura de Computadores - 22-

-? – Pedir ayuda. -d – Dump de memoria. -e – Edit (cambio) de memoria. -a – ensamblador de lenguaje de maquina 8086 -u – Un - ensamblador de lenguaje de maquina 8086. -t – Ejecutar paso a paso -p – Ejecutar la siguiente instrucción sin entrar en ella (CALL o INT). -g – Ejecutar desde una dirección con paradas (breakpoints). -r – Ver/cambiar registro. -n – Dar nombre de fichero. -w – Escribir en un fichero.