Вы находитесь на странице: 1из 22

MANUAL BREVE DE DEBUG

Se trata de una utilidad muy poco amigable, sin mens y -slo en versiones recientes- con ayuda mnima, 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 parmetros, se carga y pasa a mostrar un lacnico guin, a la espera de rdenes del usuario. Todas -a excepcin de las relativas a operaciones con memoria expandida, que no se vern aqu- constan de una nica letra seguida o no de parmetros. Si se va a desensamblar un programa, se le puede indicar a debug que lo cargue tambin tras cargarse l escribiendo:
debug nombre-del-programa argumentos-del-programa

C:\> Debug [Enter] En la siguiente lnea aparecer un guin, ste es el indicador del Debug, en este momento se pueden introducir las instrucciones del Debug. Utilizando los comandos: A: ASSEMBLE Sin parmetros ensambla las instrucciones que se introduzcan, guardndolas en la direccin siguiente a la que se lleg en el ltimo "a". Cuando se utiliza este comando se le puede dar como parmetro la direccin donde se desea que se inicie el ensamblado, si se omite el parmetro el ensamblado se iniciar en la localizacin especificada por CS:IP, usualmente 0100H, que es la localizacin donde deben iniciar los programas con extensin .COM, y ser la localizacin que utilizaremos debido a que debug solo puede crear este tipo especfico de programas. Tambin se le puede decir qu zona se desea ver con a <direccion> pudiendo ser la direccin absoluta (a segmento:desplazamiento) o relativa al segmento de cdigo actual (a desplazamiento). Parmetros: <dir_comienzo> Resultados: se pueden escribir instrucciones en ensamblador a partir de la direccin de memoria CS:<dir_comienzo>, hasta que se pulse INTRO. Si no especificamos el parmetro <dir_comienzo> se toma como direccin de inicio CS:IP Ejemplo: Vamos a usar la instruccin MOV, que como veremos ms adelante, sirve para copiar datos de la memoria a los registros y viceversa, adems de copiar datos entre registros, que es justo lo que vamos a usar en el ejemplo. -a 2048:0106 mov ax,bx Laboratorio de Estructura de Computadores - 1-

2048:0108 mov bx,cx 2048:010A -u 106 108 2048:0106 89D8 MOV AX,BX 2048:0108 89CB MOV BX,CX Como veremos ms adelante, la instruccin 'U' sirve para hacer volcados de memoria, pero no viendo el contenido de la misma, sino interpretndola como instrucciones en lenguaje ensamblador. ; Ejemplo 2 -r cs CS 2048 :2050 -a 200 2050:0200 mov ax,bx 2050:0202 -u 200 200 2050:0200 89D8 MOV AX,BX

D: DUMP Muestra el contenido de una zona de memoria en hexadecimal y en ASCII. Sin parmetros muestra los primeros 128 bytes a partir de la posicin a la que se lleg en el ltimo "d". Si se le da un rango, mostrar ese rango. Parmetros: <dir_1> ; Direccin de comienzo del volcado [<dir_2>] ; Direccin 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 parmetro, nos hace un volcado desde <dir_1> Ejemplo: -d 100 2048:0100 2048:0110 2048:0120 2048:0130 2048:0140 2048:0150 2048:0160 2048:0170

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

Laboratorio de Estructura de Computadores

- 2-

-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 posicin 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 edicin se pulsa INTRO. Parmetros: <dir_comienzo> [lista de palabras a escribir] Resultados: Se escribe a partir de la direccin de memoria DS:<dir_comienzo> la lista de palabras (dos dgitos hexadecimales) del segundo parmetro. Si no se especifica un segundo parmetro entonces DEBUG no permite introducir palabra a palabra los datos que queramos, a partir de la direccin 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 102 2048:0100 00 01 02 ... ; Ejemplo 2 -e 100 2048:0100 00. 01.04 02.05 64. -d 100 103 2048: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 resida no se borra (ponindola 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. Parmetros: <dir_comienzo> <dir_final> <patrn> ; Palabra con la que queremos rellenar Resultados: Rellenamos las direcciones de memoria entre DS:<dir_comienzo> y DS:<dir_final> con el patrn especificado Laboratorio de Estructura de Computadores - 3-

Ejemplo: -f 100 105 66 -d 100 105 2048:0100 66 66 66 66 66 66 ffffff Ejemplo: -f 100 FFFF 0 Llena de ceros lo que hay desde la posicin 100 (hexadecimal) hasta el final del segmento.

G: GO Sin parmetros, empieza a ejecutar desde la posicin cs:ip hasta que se acabe el programa. Si la orden es "g <direccion>", la ejecucin empieza en cs:ip y termina (debug pone un break point) justo antes de ejecutar la instruccin que se encuentra en <direccion>. Parmetros: [<=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 direccin origen, se toma como direccin origen CS:IP. Por cierto no se os ocurra ejecutar el comando 'G' a secas, porque podis parar en alguna instruccin que no tiene sentido o podis obtener un bonito cuelgue de la ventana MS-DOS o un bloqueo del sistema, si lo ests 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 interrupcin de MS-DOS para presentar una letra por pantalla, esta subrutina es el servicio 02h de la interrupcin 21h, y pasndole como parmetro el valor hexadecimal del carcter ASCII a. -r AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=2048 ES=2048 SS=2048 CS=2048 IP=0100 NV UP EI PL NZ NA PO NC 2048:0100 92 XCHG DX,AX -a 100 2048:0100 mov ax,0200 2048:0103 mov dl,61 2048:0105 int 21 2048:0107 -g 107

a AX=0261 BX=0000 CX=0000 DX=0061 SP=FFEE BP=0000 SI=0000 DI=0000 DS=2048 ES=2048 SS=2048 CS=2048 IP=0107 NV UP EI PL NZ NA PO NC Laboratorio de Estructura de Computadores - 4-

2048:0107 3D5000 CMP AX,0050 -g =100 107 a AX=0261 BX=0000 CX=0000 DX=0061 SP=FFEE BP=0000 SI=0000 DI=0000 DS=2048 ES=2048 SS=2048 CS=2048 IP=0107 NV UP EI PL NZ NA PO NC 2048:0107 3D5000 CMP AX,0050 H NUM1 NUM2: HEX Muestra por pantalla el resultado (en hexadecimal) de las operaciones num1+num2 y num1num2. Parmetros: 2 nmeros hexadecimales de 4 dgitos ( mximo ) Uso: la instruccin "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 0002 0005 0001 -h 0000 0001 0001 FFFF Como se observa, el resultado de la segunda operacin 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 parmetros lee de la unidad dada, empezando en el sector indicado, tantos sectores como determine "nsectores" y los guarda en la posicin de memoria especificada por "direccin". Poniendo slo l direccin intenta cargar el fichero definido con la orden n (ver abajo) en esa posicin. Parmetros: <direc_destino> <unidad> <primer_sector> <numero> Resultados: Esta instruccin carga en comenzando en la direccin 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 direccin DS:100, ( ESTO NO QUIERE DECIR QUE OS TENGA QUE SALIR LO MISMO EN VUESTRO VOLCADO )

Laboratorio de Estructura de Computadores

- 5-

-l 100 0 0 1 -d 100 300


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

M RANGO DIRECCION: MOVE Mueve la zona de memoria delimitada por "rango" a la direccin "direccin".

N NOMBRE: NAME Da un nombre de fichero sobre el que actan l y w. P: STEP Trace puede ser incmodo si no se quiere depurar el cdigo de las rutinas de interrupcin , o si ya se sabe el cdigo que hay en las subrutinas y tan slo interesa seguir avanzando sin entrar en ellas. En estos casos se usa p. Parmetros: <=dir_origen> <NUM_instrucciones> Resultados: es como el comando 'T' sin embargo si llamamos a una subrutina y usramos el comando 'T' entraramos dentro del cdigo de la subrutina, por lo que si ejecutamos una interrupcin de MS-DOS no sabramos que estamos haciendo Ejemplo:

Laboratorio de Estructura de Computadores

- 6-

-r AX=0261 BX=0000 CX=0000 DX=0061 DS=2048 ES=2048 SS=2048 CS=2048 2048:0107 3D5000 CMP AX,0050 -a 100 2048:0100 mov ax,0200 2048:0103 mov dl,61 2048:0105 int 21 2048:0107 -p =100 3 AX=0200 BX=0000 CX=0000 DX=0061 DS=2048 ES=2048 SS=2048 CS=2048 2048:0103 B261 MOV DL,61 AX=0200 BX=0000 CX=0000 DX=0061 DS=2048 ES=2048 SS=2048 CS=2048 2048:0105 CD21 INT 21 a AX=0261 BX=0000 CX=0000 DX=0061 DS=2048 ES=2048 SS=2048 CS=2048 2048:0107 3D5000 CMP AX,0050 Q: QUIT Salir de debug y volver al DOS.

SP=FFEE BP=0000 SI=0000 DI=0000 IP=0107 NV UP EI PL NZ NA PO NC

SP=FFEE BP=0000 SI=0000 DI=0000 IP=0103 NV UP EI PL NZ NA PO NC SP=FFEE BP=0000 SI=0000 DI=0000 IP=0105 NV UP EI PL NZ NA PO NC

SP=FFEE BP=0000 SI=0000 DI=0000 IP=0107 NV UP EI PL NZ NA PO NC

R: REGISTERS Sin parmetros, muestra el contenido de los registros de la CPU, as como la prxima instruccin 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 ms lo deja como estaba. Parmetros: [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, adems nos muestra la instruccin 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.

Laboratorio de Estructura de Computadores

- 7-

Desbordamiento ( si/no) Poner: OV Quitar: NV Direccion(reduccin / incremento) poner: DN quitar UP Interrupcin(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: -r AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=2048 ES=2048 SS=2048 CS=2048 IP=0100 NV UP EI PL NZ NA PO NC 2048: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=0000 DS=2048 ES=2048 SS=2048 CS=2048 IP=0100 NV UP EI PL NZ NA PO NC 2048:0100 92 XCHG DX,AX

S: SEARCH

Laboratorio de Estructura de Computadores

- 8-

Busca una secuencia de bytes o una cadena en el rango especificado, mostrando la direccin en que aparece en pantalla. s 100 500 cd 13 Busca todas las llamadas a la interrupcin 13h (cdigo mquina 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 instruccin apuntada por cs:ip y vuelve a debug. Permite ejecutar paso a paso un programa y observar en cada instruccin el efecto producido. Si haciendo "trace" se llega a una subrutina (CALL) o a una interrupcin (INT) la siguiente instruccin que se ejecutar ser la primera de la subrutina o la primera de la rutina de atencin de la interrupcin correspondiente. Parmetros: [< =direccin>] ; Direccin a partir de la cual se quiere que se tracee (OJO: HAY QUE PONER EL '=' ) <num_instrucciones> ; Nmero 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 parmetro <NUM_instrucciones> se ejecuta una nica instruccin Ejemplo: -r AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=2048 ES=2048 SS=2048 CS=2048 IP=0100 NV UP EI PL NZ NA PO NC 2048:0100 3D0000 CMP AX,0000 -r bx BX 0000 :2 -a 100 2048:0100 mov ax,bx 2048:0102 -t AX=0002 BX=0002 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=2048 ES=2048 SS=2048 CS=2048 IP=0102 NV UP EI PL NZ NA PO NC 2048:0102 00AC01D8 ADD [SI+D801],CH DS:D801=74 ; Ejemplo 2 -r AX=0000 BX=0007 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=2048 ES=2048 SS=2048 CS=2048 IP=0100 NV UP EI PL NZ NA PO NC 2048:0100 3D0000 CMP AX,0000 -a 100 2048:0100 mov ax,bx 2048:0102 mov cx,bx Laboratorio de Estructura de Computadores - 9-

2048:0104 -t 2 AX=0007 BX=0007 CX=0000 DX=0000 DS=2048 ES=2048 SS=2048 CS=2048 2048:0102 89D9 MOV CX,BX AX=0007 BX=0007 CX=0007 DX=0000 DS=2048 ES=2048 SS=2048 CS=2048 2048:0104 01D8 ADD AX,BX

SP=FFEE BP=0000 SI=0000 DI=0000 IP=0102 NV UP EI PL NZ NA PO NC SP=FFEE BP=0000 SI=0000 DI=0000 IP=0104 NV UP EI PL NZ NA PO NC

U : UNASSEMBLE Desensambla una zona de memoria. Si no se le dan parmetros empieza a hacerlo en la direccin apuntada por cs:ip. Tambin se le puede decir qu zona se quiere ver con u <direccin> pudiendo ser la direccin absoluta (u segmento:desplazamiento) o relativa al segmento de cdigo actual (u desplazamiento). Si se da un rango de direcciones desensamblar esa zona: u 1000 2000 desensambla el cdigo que haya desde cs:1000 a cs:2000. Todos los nmeros son tratados como hexadecimales, as que u 1000 empieza a desensamblar desde la posicin 4096 (decimal) del segmento de cdigo. Parmetros: <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 11e 2050:0100 7403 JZ 0105 2050:0102 E97F00 JMP 0184 2050:0105 8B4EFA MOV CX,[BP-06] 2050:0108 E303 JCXZ 010D 2050:010A B90200 MOV CX,0002 2050:010D 83C108 ADD CX,+08 2050:0110 B82871 MOV AX,7128 2050:0113 50 PUSH AX 2050:0114 51 PUSH CX 2050:0115 9A1A025D2F CALL 2F5D:021A 2050:011A 0BC0 OR AX,AX 2050:011C 7463 JZ 0181 2050:011E 8B3E2A71 MOV DI,[712A] ; Ejemplo 2

Laboratorio de Estructura de Computadores

- 10-

-u 100 2050:0100 2050:0102 2050:0105 2050:0108 2050:010A 2050:010D 2050:0110 2050:0113 2050:0114 2050:0115 2050:011A 2050:011C 2050:011E

7403 JZ 0105 E97F00 JMP 0184 8B4EFA MOV CX,[BP-06] E303 JCXZ 010D B90200 MOV CX,0002 83C108 ADD CX,+08 B82871 MOV AX,7128 50 PUSH AX 51 PUSH CX 9A1A025D2F CALL 2F5D:021A 0BC0 OR AX,AX 7463 JZ 0181 8B3E2A71 MOV DI,[712A]

W: WRITE La sintaxis completa es w [direccin] [unidad] [sector] [n sectores] Con todos los parmetros escribe en la unidad y sectores dados el contenido de la direccin de memoria. Pasndole slo la direccin escribe en el fichero definido con n tantos bytes como determinen el par de registros BX:CX a partir de la posicin 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 ms para tratar con memoria expandida y otras operaciones que no sern 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 continuacin describe el valor de cada bit, tanto apagado como prendido y su relacin con las operaciones del procesador: Overflow NV = no hay desbordamiento; OV = s lo hay Direction UP = hacia adelante; DN = hacia atras; Interrupts DI = desactivadas; Laboratorio de Estructura de Computadores - 11-

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. Todos los nmeros en DEBUG son en HEX.

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 (dgitos hex). 106E:0107 int 3 Este es un punto de parada (interrupcin 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 instruccin.

106E:0100 mov dx,378 106E:0103 in al,dx 106E:0104 call 140

Laboratorio de Estructura de Computadores

- 12-

106E:0108

Salimos del ensamblador con entrada de una lnea vaca.

-a104

Ensamblador de nuevo a partir de la direccin 104 (mirar arriba) ; seria la direccin donde se encuentra la cadena de salida. ; el programa que convierte AL a cadena de dos caracteres ; Escribimos en CON: sea lo que sea CON:

106E:0104 mov di,200 106E:0107 call 140 106E:010A mov dx,200 106E:010D mov ah,9 106E:010F int 21 106E:0111 int 3

; La parada cmoda de DEBUG. Por la diferencia de INT 20h escribe el contenido de los registros.

106E:0112 -a140 ; Esto seria el programa de conversin de AL en HEX 106E:0140 cld 106E:0141 call 143 ; Supongamos que a partir de la siguiente instruccin hay un programa que convierte la parte alta de al a carcter ASCII (HEX). Calculamos y es errneo, la direccin de la siguiente instruccin no esta en 141+2-> 143). 106E:0144 rol al,1 ; Nos hemos equivocado la siguiente instruccin 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 sentndose ante un ordenador, pero sabemos que esta cerca de esta direccin. Apostamos por 156 106E:0153 add al,6 ; tenemos de aadir 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 instruccin equivocada (la direccin no es 156 pero 155). -a151 106E:0151 jna 155 106E:0153 Todo esta listo para ejecutar: Ultima mirada antes de ejecutar: -u100 Laboratorio de Estructura de Computadores - 13-

106E:0100 106E:0103 106E:0104 106E:0107 106E:010A 106E:010D 106E:010F 106E:0111 106E:0112 106E:0114 106E:0116 106E:0119 106E:011C 106E:011E 106E:011F -u140 106E:0140 106E:0141 106E:0144 106E:0146 106E:0148 106E:014A 106E:014C 106E:014D 106E:014F 106E:0151 106E:0153 106E:0155 106E:0157 106E:0158 106E:0159 106E:015A

BA7803 EC BF0002 E83600 BA0002 B409 CD21 CC 2BC6 8BC8 E87BF4 83F97F 3400 5D 1000 FC E80000 D0C0 D0C0 D0C0 D0C0 50 240F 3C0A 7602 0406 040A AA 58 C3 215F5E

MOV IN MOV CALL MOV MOV INT INT SUB MOV CALL CMP XOR POP ADC CLD CALL ROL ROL ROL ROL PUSH AND CMP JBE ADD ADD STOSB POP RET AND

DX,0378 AL,DX DI,0200 0140 DX,0200 AH,09 21 3 AX,SI ; Esto es basura. Puede ; ser muy distinto CX,AX F594 CX,+7F AL,00 BP [BX+SI],AL

0144 AL,1 AL,1 AL,1 AL,1 AX AL,0F AL,0A 0155 AL,06 AL,0A AX [BX+5E],BX ; basura

Ejecutamos paso a paso a partir de CS:100 -t=100 Significa Trace ejecutar la siguiente instruccin (con el flag T de 8086 a partir de la direccin 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 Despus de ejecutar la instruccin en 100 (mov dx,378) el DEBUG escribe el contenido de los registros y la siguiente instruccin de ejecutar (IN AL,DX). Notar que DX tiene valor 378. -t ; Sin direccin significa que se ejecuta la siguiente instruccin AX=0000 BX=0000 CX=0000 DX=0378 SP=FFEE BP=0000 SI=0000 DI=0000

Laboratorio de Estructura de Computadores

- 14-

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 haba 00 (AL=00). Seria mucho mas instructivo si haba 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 carcter 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 Laboratorio de Estructura de Computadores - 15-

106E:014C 50 -t

PUSH

AX

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 dgito 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 errneo! Queremos que escriba B de B5. Nos hemos equivocado con la instruccin ADD AL,6, que tiene que estar ADD AL,7. Corregimos. Buscamos la instruccin: -u140 (como antes) Laboratorio de Estructura de Computadores - 16-

-a153 106E:0153 add al,7 -u140 (por sea caso). . (con instruccin 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,1 106E:0146 D0C0 ROL AL,1 106E:0148 D0C0 ROL AL,1 106E:014A D0C0 ROL AL,1 106E:014C 50 PUSH AX 106E:014D 240F AND AL,0F 106E:014F 3C0A CMP AL,0A 106E:0151 7602 JBE 0155 106E:0153 0407 ADD AL,07 106E:0155 0430 ADD AL,30 106E:0157 AA STOSB 106E:0158 58 POP AX 106E:0159 C3 RET ; Notar que se desensambla (u de un-assembly) desde la posicin 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 despus ejecuta el programa desde la direccin actual (CS:IP). Notar que la parada del programa no se garantiza (si el programa no ejecuta la instruccin de CS:159 no hay garanta que va a parar. Adems 159 puede estar incluso en la mitad de una instruccin. 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 direccin 200 hasta direccin 201.

Laboratorio de Estructura de Computadores

- 17-

106E:0200 41 35 A5 Menos mal el segundo carcter 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 106E:0210 106E:0220 106E:0230 106E:0240 106E:0250 106E:0260 106E:0270 41 00 3B D2 0B D5 2F D8 35 03 75 80 00 E2 E7 B0 D7 F1 F6 3E E8 00 BB FF D7 E8 4E 43 59 74 40 86 C3 03 C3 04 00 F7 00 47 BE 00 1E 00 5F 1E BA 18 BC 3C 52 75 5E 0E 01 A2 DB-8B 0D-C3 50-53 0D-F6 59-5B 1F-BE 00-33 18-00 4C AC 51 06 58 D5 FF C3 05 E8 56 21 5A E2 CD 0E 8B 04 57 04 1F E8 21 1F 74 F9 2E FF C3 98 1F E8 09 75 8E 75 2E 02 72 D2 E8 04 1E 06 80 2E 0B 00 08 3C FE E8 3E A1 8B 3D A5.......L..t... ......<......u.< ;u.N..RPSQVW.... ..>C..u...!..u.. ...Y._^Y[XZ....> ...t............ /..@....3..!.r.. ....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. Aadimos CR LF y $. -e202 106E:0202 0D.0d 0A.a Despus de 0d tenemos de teclear espacio. Despus del ultimo byte tenemos de teclear salto de linea. Entramos $ como smbolo: -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

Laboratorio de Estructura de Computadores

- 18-

Estamos antes de ejecutar INT 21h con AH=9 y DX=200. Tenemos que ejecutar esta instruccin pero no nos interesa entrar en DOS. Por esto ejecutamos INT 21 no con t pero con p. El comando p sustituye la siguiente instruccin con INT 3 (que en este caso es tambin 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 (despus de la lnea 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 aadiendo 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 Laboratorio de Estructura de Computadores - 19-

106E:0180 1E -t

PUSH

DS

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 Laboratorio de Estructura de Computadores - 20-

-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 direccin 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 cdigo 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 extensin .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 Laboratorio de Estructura de Computadores - 21-

-? 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 instruccin sin entrar en ella (CALL o INT). -g Ejecutar desde una direccin con paradas (breakpoints). -r Ver/cambiar registro. -n Dar nombre de fichero. -w Escribir en un fichero.

Laboratorio de Estructura de Computadores

- 22-

Вам также может понравиться