Debug
Debug
Debug
C:\>debug
Ya estamos posicionados en el DEBUG y ste est preparado para recibir
instrucciones en ASSEMBLER.
Ejemplo 1: Ver las instrucciones permitidas en el ASSEMBLER bsico.
Tipeamos lo siguiente:
-??
Y nos mostrar la informacin que sigue. Tipee y compruebe
ensamblar A [direccin]
comparar
C direccin de intervalo
volcar
D [intervalo]
escribir
E direccin [lista]
llenar
F lista de intervalos
ir
G [=direccin] [direcciones]
hex
H valor1 valor2
entrada
I puerto
cargar
L [direccin] [unidad] [primer_sector] [nmero]
mover
M direccin de intervalo
nombre
N [nombre_ruta] [lista_argumentos]
salida
O byte de puerto
proceder
P [=direccin] [nmero]
salir
Q
registrar
R [registrar]
buscar
S lista de intervalos
seguimiento T [=direccin] [valor]
desensamblar U [intervalo]
escribir W [direccin] [unidad] [primer_sector] [nmero]
asignar memoria expandida
XA [#pginas]
desasignar memoria expandida
XD [identificador]
asignar pginas de memoria expandida XM [Lpgina] [Ppgina] [identificador]
mostrar estado de la memoria expandida XS
Note que al terminar aparece el guin que nos indica que el DEBUG tiene
nuevamente el control de las operaciones, con lo cual Uds. podrn ingresar ms
comandos
Cada una de la instrucciones que se mostraron anteriormente se irn explicando a lo largo de este
apunte, donde aplicaremos un ejercicio especfico para cada una de ellas incrementando las
posibilidades, desde las ms simples hasta las ms complejas, para perfeccionar nuestro dominio de la
programacin.
Versin 2.0
Pgina 1
U.T.N.
BX
Registro Base
CX
Registro Contador
DX
Registro de Datos
DS
Registro de segmento de
datos
Segmento extra para datos
ES
SS
CS
BP
SI
Registro de segmento de
pila
Registro de segmento
cdigo
Puntero del STACK
DI
Registro de Indice de
segmento
Indice destino
SP
Puntero de Pila
IP
Apuntador de la siguiente
instruccin
Versin 2.0
Pgina 2
U.T.N.
REF
NV
UP
DI
PL
NZ
NA
Funcin
No hay
Hacia adelante
Desactivadas
Valor positivo
No es cero
No hay acarreo
REF
OV
DN
EI
NG
ZR
AC
Funcin
Hay
Hacia atrs
Desactivadas
Valor negativo
Es cero
Hay acarreo
PO
NC
Paridad impar
No hay acarreo
PE
CY
Paridad Par
Se produjo acarreo
El comando r (registro) nos permite interactuar con los registros de la CPU, posibilitando modificar sus
contenidos.
Cuando tipeamos r sin ningn otro parmetro nos muestra todos los registros con sus respectivos
contenidos, pero si agregamos un parmetro nos va a mostrar solo el contenido del registro que nosotros
mencionamos:
-r bx
BX 0000
:
Como podemos observar no nos devuelve el signo sino que ahora nos muestra : para que
ingresemos el valor que queremos que sea almacenado en el registro BX.
En el ejemplo vemos que BX tiene un valor 0000. Si ingresamos 5555 en : tendremos:
-r bx
BX 0000
:5555
-r
AX=0000 BX=5555 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1987 ES=1987 SS=1987 CS=1987 IP=0100 NV UP EI PL NZ NA PO NC
1987:0100 8936C7DE
MOV [DEC7],SI
DS:DEC7=0000
En negrilla vemos que el registro BX qued modificado con el nuevo valor tipeado.
Suma y Resta.
Ejemplo S1: Se pide sumar dos valores (200 y FFF) .
Vamos a ingresar las siguientes instrucciones en el orden como se dan.
Los nmeros indicados
- a 100
XXXX: 0100
XXXX: 0103
XXXX: 0106
XXXX: 0108
XXXX: 010A
-
-a
Versin 2.0
Pgina 3
U.T.N.
MOV
MOV
ADD
INT
MOV
JZ
MOV
OR
JNZ
CMP
JZ
STOSB
MOV
ADD
AX,0200
BX,0FFF
AX,BX
20
DL,E8
01,2F
AL,[DEC9]
CL,CL
011A
AL,[DI-01]
011B
SI,[SI]
[BP+19],DH
MOV
MOV
ADD
INT
AX,0200
BX,0FFF
AX,BX
20
Versin 2.0
Pgina 4
U.T.N.
B8 00 02 BB FF 0F 01 D8 - CD 20 B2 E8 74 21 A0 C9
DE 0A C9 75 05 3A 45 FF - 74 01 AA 8B 34 00 76 19
C0 75 FA BA B2 E8 C7 06 - 19 DF CA 83 E8 10 00 0A
DB 74 04 9D F8 EB 02 9D - F9 5E 5F 5A 59 5B C3 51
52 57 56 9C 8B FA 8B F2 - E8 6B F4 A2 DB E2 BF 98
DE 0A C0 74 03 BF F3 E5 - B9 13 00 E8 1E F5 72 65
C7 06 CA DE 00 00 C6 06 - CC DE 00 80 3E DB E2 00
74 07 81 C6 04 01 E8 A8 - F5 E8 52 00 3B 06 CA DE
......... ..t!..
...u.:E.t...4.v.
.u..............
.t.......^_ZY[.Q
RWV......k......
...t..........re
...........>...
t.........R.;...
El resto es basura que no nos pertenece. Si nosotros podemos leer esa basura, se
pueden imaginar que importante puede ser todo esta que queda en la memoria para
un HACKER.
Ejercicio 5: Se pide sumar dos direcciones.
Para este ejercicio nos falta conocer como se informan las direcciones. La manera es simple, entre
Corchetes [ ]. Ingrese las instrucciones que se dan a continuacin.
-a
1987:0100 mov ax,[0200]
1987:0103 mov cx,[0FFF]
1987:0107 add ax,cx
1987:0109 int 20
1987:010B
Versin 2.0
Pgina 5
U.T.N.
Versin 2.0
Pgina 6
U.T.N.
-t
AX=825A BX=0000 CX=DB52 DX=0000 SP=FFE8 BP=0000 SI=0000 DI=0000
DS=1987 ES=1987 SS=1987 CS=00CA IP=0FA8 NV UP DI NG NZ NA PE CY
00CA:0FA8 90
NOP
Observemos que la nueva instruccin que aparece es un NOP (NO OPERATION) indicndonos que el
programa ha terminado.
NOTA: Podemos ejecutar directamente (t) pero nos mostrar la segunda instruccin a
ejecutarse y la primera ya ejecutada. Tipee q en la lnea de comando, vuelva a tipear DEBUG
y cargue nuevamente el programa, posteriormente empiece directamente con el TRACE.
Resolver e informar.
Utilice el comando TRACE (t) para ejecutar el programa.
Ejercicio 1. Sumar el contenido de una direccin y de una constante.
Ejercicio 2: Reste dos nmeros utilizando registros. El primero menor que el segundo.
La instruccin para restar es SUB.
Verifique el valor de los bits del STATUS REGISTER
Ejercicio 3: Suma y resta. Sume dos nmeros y reste otro. Utilice constantes, no direcciones.
Verifique el valor de los bits del STATUS REGISTER
Ejercicio 4: Sume dos nmeros y reste una direccin.
Versin 2.0
Pgina 7
U.T.N.
Pgina 8
U.T.N.
1987:0104
-r
AX=03FF BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1987 ES=1987 SS=1987 CS=1987 IP=0100 NV UP EI PL NZ NA PO NC
1987:0100 B0BB
MOV AL,BB
-t
AX=03BB BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1987 ES=1987 SS=1987 CS=1987 IP=0102 NV UP EI PL NZ NA PO NC
1987:0102 CD20
INT 20
-t
AX=03BB BX=0000 CX=0000 DX=0000 SP=FFE8 BP=0000 SI=0000 DI=0000
DS=1987 ES=1987 SS=1987 CS=00CA IP=0FA8 NV UP DI PL NZ NA PO NC
00CA:0FA8 90
NOP
Ahora vamos a sumar las dos partes que componen el acumulador (AX). Para eso hacemos el siguiente
programa.
-a100
00CA:0100 add ah,al
00CA:0102 int 20
00CA:0104
y lo ejecutamos.
-r
AX=03BB BX=0000 CX=0000 DX=0000 SP=FFE8 BP=0000 SI=0000 DI=0000
DS=1987 ES=1987 SS=1987 CS=00CA IP=0100 NV UP DI PL NZ NA PO NC
00CA:0100 00C4
ADD AH,AL
-t
AX=BEBB BX=0000 CX=0000 DX=0000 SP=FFE8 BP=0000 SI=0000
DI=0000
DS=1987 ES=1987 SS=1987 CS=00CA IP=0102 NV UP DI NG NZ NA PE NC
00CA:0102 CD20
INT 20
Podemos realizar la comprobacin del resultado muy fcilmente.
Multiplicacin y divisin.
En lo referente a la multiplicacin podemos determinar dos tipos de instrucciones:
MUL multiplica valores sin signo.
IMUL multiplica valores con signo.
Aqu tenemos algunas variantes que no se observaron el la suma y en la resta.
Podemos multiplicar entidades de 8 bites y de 16 bits (una palabra) o 16 y 32 o... dependiendo del
tamao de la palabra y del procesador que estamos utilizando. Independientemente si queremos
multiplicar por media palabra el valor debe estar en la parte baja del registro que vamo a utilizar, por
ejemplo en AL y si queremos multiplicar por la palabra deber ocupar todo el registro, es decir que
deber estar en AX por ejemplo.
Ejemplo M1: Multiplicar valores de 8 bits sin signo
Versin 2.0
Pgina 9
U.T.N.
Ingresamos el programa:
C:\>debug
-a
1987:0100 mov al,4
1987:0102 mov cl,5
1987:0104 mul al,cl
1987:0106 int 20
1987:0108
-g106
AX=0010 BX=0000 CX=0005 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1987 ES=1987 SS=1987 CS=1987 IP=0106 NV UP EI PL NZ NA PO NC
1987:0106 CD20
INT 20
Dos cosas importantes. La primera es que el programa se ha ejecutado y vemos el resultado en AX y
podemos comprobar que est correcto y la segunda es que estamos usando un nuevo comando que es g
que nos permite ejecutar completamente el programa que nosotros cargamos y nos muestra el resultado.
Este tiene dos opciones:
En el ejemplo M1 hemos ejecutado el programa parcialmente puesto que apuntamos hasta la
instruccin almacenada en 0106 que es int 20, pero podemos ejecutar el programa hasta la 108
o 0108 ysucedera esto:
-g108
El programa ha finalizado con normalidad
-r
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1987 ES=1987 SS=1987 CS=1987 IP=0100 NV UP EI PL NZ NA PO NC
1987:0100 B004
MOV AL,04
Se ejecut el programa totalmente y nos informa su correcta terminacin pero no se muestran las
variaciones de los registros.
Ejecicio M2: Multiplicacin de valores que provoquen un desbordamiento.
En este caso vamos a utilizar dos valores que multiplicados superen la capacidad de almacenamiento de
la parte baja del registro.
-a
1987:0100 mov al,bb
1987:0102 mov cl,aa
1987:0104 mul al,cl
1987:0106 int 20
1987:0108
-g108
El programa ha finalizado con normalidad
-r
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1987 ES=1987 SS=1987 CS=1987 IP=0100 NV UP EI PL NZ NA PO NC
1987:0100 B0BB
MOV AL,BB
En este caso no nos sirve de mucho, porque no nos deja ver nada, no muestra los resultados y
solo podemos saber que el programa hace algo y que no da error, pero nada ms. Por lo tanto
siempres es preferible ingresar por el TRACE (t) para ver paso a paso que sucede.
-r
Versin 2.0
Pgina 10
U.T.N.
MOV
MOV
IMUL
INT
INT
AL,08
CL,FE
CL
20
3
Observemos que ya hay modificaciones . Determine cuales y que es lo que sucedi y porqu?
Ejecutamos el programa paso a paso.
-r
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFE2 BP=0000 SI=0000 DI=0000
DS=1987 ES=1987 SS=1987 CS=1987 IP=0100 NV UP DI PL NZ NA PO NC
1987:0100 B008
MOV AL,08
-t
AX=0008 BX=0000 CX=0000 DX=0000 SP=FFE2 BP=0000 SI=0000 DI=0000
DS=1987 ES=1987 SS=1987 CS=1987 IP=0102 NV UP DI PL NZ NA PO NC
1987:0102 B1FE
MOV CL,FE
-t
AX=0008 BX=0000 CX=00FE DX=0000 SP=FFE2 BP=0000 SI=0000 DI=0000
DS=1987 ES=1987 SS=1987 CS=1987 IP=0104 NV UP DI PL NZ NA PO NC
1987:0104 F6E9
IMUL CL
-t
AX=FFF0 BX=0000 CX=00FE DX=0000 SP=FFE2 BP=0000 SI=0000 DI=0000
DS=1987 ES=1987 SS=1987 CS=1987 IP=0106 NV UP DI PL NZ NA PO NC
1987:0106 CD20
INT 20
Analicen que sucedi. Qu pasa si tomamos AX en lugar de AL? Qu sucedi con los bits de
bandera? Estn correctos o hay errores en ellos? Realicen el informe correspondiente.
Realice el mismo programa con la diferencia de la siguiente instruccin
Mov cl,-1
e informe el anlisis particular y comparativo
Versin 2.0
Pgina 11
U.T.N.
Realizados los ejemplos anteriores y convenientemente analizados podemos pasar a realizar ejercicios
con registros completos.
Informe cada uno de los ejercicios.
Ejercicio M1: Multiplique dos nmeros.
Ejercicio M2: Multiplique un nmero positivo por un nmero negativo
a) Con valores pequeos.
b) Con valores grandes.
Ejercicio M3: Multiplique dos nmeros con signo negativo.
Ejercicio M4: Ingrese el siguiente programa y analice los resultados
-a 100
1987:0100 mov bx,ffff
1987:0103 mov cx,-1
1987:0106 imul cx
1987:0108 imul bx
1987:010A int 20
1987:010C
-
Versin 2.0
Pgina 12
U.T.N.
Divisin.
Tambin est compuesta por dos instrucciones:
DIV que divide dos valores sin signo.
IDIV que divide dos valores con signo.
En una divisin de valores enteros vamos a suponer que el dividendo siempre ser mayor que el divisor,
por lo menos para esta primera parte de nuestro estudio.
De acuerdo a lo expresado pasemos a realizar nuestro primer ejemplo.
Ejemplo D1: Dividir dos nmero enteros.
Aclaraciones: Para un divisor de 8 bits el dividendo ser de 16 bits, por lo tanto el dividendo
lo ubicaremos en AX (16 bits) y el divisor en CL (8bits)
El programa es:
-a
1987:0100 mov ax,8
1987:0103 mov cl,4
1987:0105 div cl
Dara lo mismo escribir div ax,cl
1987:0107 int 20
1987:0109
-t
AX=0008 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1987 ES=1987 SS=1987 CS=1987 IP=0103 NV UP EI PL NZ NA PO NC
1987:0103 B104
MOV CL,04
-t
AX=0008 BX=0000 CX=0004 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1987 ES=1987 SS=1987 CS=1987 IP=0105 NV UP EI PL NZ NA PO NC
1987:0105 F6F1
DIV CL
-t
AX=0002 BX=0000 CX=0004 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1987 ES=1987 SS=1987 CS=1987 IP=0107 NV UP EI NG NZ AC PE CY
1987:0107 CD20
INT 20
Ejercicio D1: Realicen un programa utilizando dos nmeros que no sean mltiplos y analaice el
registro AX.
Ejercicio D2: Realice un programa cuyo divisor sea cero e informe que sucede y porqu.
Ejercicio D3: Realice un programa que permita dividir los siguientes valores FFFF y 2, pero en ste
caso el divisor ser BX. Observe todos los registros e informe.
Ejercicio D4: Realice un programa que permita la diviidr FFFF por 1 y analice.
Versin 2.0
Pgina 13
U.T.N.
EB11
53
61
6C
7461
6D
6F
7320
7661
7269
61
7320
69
BA0201
B409
CD21
CD20
JMP
PUSH
DB
DB
JZ
DB
DB
JNB
JBE
JB
DB
JNB
DB
MOV
MOV
INT
INT
0113
BX
61
6C
0168
6D
6F
012B
016E
0178
61
0132
69
DX,0102
AH,09
21
20
En negrilla todas las instrucciones que saltamos, que por supuesto no son de nuestro programa.
Otra manera de v
er la ejecucin de nuestro programa es utilizando el comando p.
En este caso aconsejamos hacerlo indicando adems la instruccin desde donde debe comenzar como en
la secuencia que sigue.
Versin 2.0
Pgina 14
U.T.N.
-p 100
AX=0000 BX=0000 CX=0000 DX=0102 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1987 ES=1987 SS=1987 CS=1987 IP=0116 NV UP EI PL NZ NA PO NC
1987:0116 B409
MOV AH,09
AX=0900 BX=0000 CX=0000 DX=0102 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1987 ES=1987 SS=1987 CS=1987 IP=0118 NV UP EI PL NZ NA PO NC
1987:0118 CD21
INT 21
HEMOS SALTADO VAR -! UCCIONES VERDAD
AX=0924 BX=0000 CX=0000 DX=0102 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1987 ES=1987 SS=1987 CS=1987 IP=011A NV UP EI PL NZ NA PO NC
1987:011A CD20
INT 20
El programa ha finalizado con normalidad
-
Versin 2.0
Pgina 15
U.T.N.
Versin 2.0
Pgina 16
U.T.N.
Versin 2.0
Pgina 17
U.T.N.
Comando
??
a
g
r
t
Versin 2.0
Significado
Permite ver el set de instrucciones bsico
del Assembler
Abre el DEBUG para ingresar sentencias
Permite la ejecutar un programa en forma
completa o parcial
Permite ver el estados de los registros
Muestra paso a paso la ejecucin.
Corresponde al comando TRACE.
Pgina 18