Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Tutorial Debug
Tutorial Debug
Departamento de Automtica.
Universidad de Alcal.
- 1-
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.........
- 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-
- 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.
- 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.
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.
- 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
- 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
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
- 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
- 12-
106E:0108
-a104
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
BA7803
EC
BF0002
E83600
BA0002
B409
CD21
CC
2BC6
MOV
IN
MOV
CALL
MOV
MOV
INT
INT
SUB
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
8BC8
E87BF4
83F97F
3400
5D
1000
MOV
CALL
CMP
XOR
POP
ADC
FC
E80000
D0C0
D0C0
D0C0
D0C0
50
240F
3C0A
7602
0406
040A
AA
58
C3
215F5E
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
- 14-
- 15-
106E:014C 50
-t
PUSH
AX
(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.
- 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..........=
- 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
-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.
- 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.
- 22-