Resumen y ejercicios del Debug
chivan1908Tutorial25 de Noviembre de 2012
7.080 Palabras (29 Páginas)712 Visitas
Resumen y ejercicios del DEBUG
Uso del DEBUG.
Ingreso: Tipeamos la instrucción que se menciona seguidamente desde el prompt.
C: \ > DEBUG Después de dar enter aparecerá un guión
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 básico.
Tipeamos lo siguiente:
-??
Y nos mostrará la información que sigue. Tipee y compruebe
ensamblar A [dirección]
comparar C dirección de intervalo
volcar D [intervalo]
escribir E dirección [lista]
llenar F lista de intervalos
ir G [=dirección] [direcciones]
hex H valor1 valor2
entrada I puerto
cargar L [dirección] [unidad] [primer_sector] [número]
mover M dirección de intervalo
nombre N [nombre_ruta] [lista_argumentos]
salida O byte de puerto
proceder P [=dirección] [número]
salir Q
registrar R [registrar]
buscar S lista de intervalos
seguimiento T [=dirección] [valor]
desensamblar U [intervalo]
escribir W [dirección] [unidad] [primer_sector] [número]
asignar memoria expandida XA [#páginas]
desasignar memoria expandida XD [identificador]
asignar páginas de memoria expandida XM [Lpágina] [Ppágina] [identificador]
mostrar estado de la memoria expandida XS
-
Note que al terminar aparece el guión que nos indica que el DEBUG tiene nuevamente el control de las operaciones, con lo cual Uds. podrán ingresar más comandos
Cada una de la instrucciones que se mostraron anteriormente se irán explicando a lo largo de este apunte, donde aplicaremos un ejercicio específico para cada una de ellas incrementando las posibilidades, desde las más simples hasta las más complejas, para perfeccionar nuestro dominio de la programación.
Ejemplo 2: Ver los registros.
Este ejercicio nos permite que miremos el valor de varios registros y del registro de estado de la ALU (STATUS REGISTER). Para eso tipeamos:
-r
Y no muestra lo que sigue:
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 8936C7DE MOV [DEC7],SI DS:DEC7=0000
-
El significado de los diferentes registros se da en la tabla siguiente.
REF Nombre Que es lo que hace
AX Acumulador Almacena el resultado de operaciones matemáticas; lectura / escritura (I/O) dede/hacia los puertos que están conectados con los periféricos; almacena también un área de memoria temporal.
BX Registro Base Alacena direcciones o valores y puede interactuar con el Acumulador.
CX Registro Contador Utilizados para la ejecución de LOOPS y puede ser incrementado o decrementado según la instrucción que sea necesaria
DX Registro de Datos De acuerdo a la estructura de computadores analizada por nosotros corresponde al MDR (MEMORY DATA RGISTER) y es el paso intermedio para el ingreso de datos.
DS Registro de segmento de datos Es un puntero que nos indica la dirección donde se encuentran los datos.
ES Segmento extra para datos Igual que el anterior pero apuntando a una dirección mayor.
SS Registro de segmento de pila Indica donde se encuentra el STACK.
CS Registro de segmento código Indica donde esta almacenado el código para la ejecución del programa.
BP Puntero del STACK Registro complementario para no modificar el SS.
SI Registro de Indice de segmento Alacena una dirección que nos indica donde se encuentra el vector de datos.
DI Indice destino Contiene una dirección donde se copiara el vector de datos indicado por SI.
SP Puntero de Pila (STACK POINTER) Permite saber donde se encuentra el último dato almacenado en el STACK. Siempre debe ser mayor o igual al SS o BP
IP Apuntador de la siguiente instrucción (INSTRUCTION POINTER) También llamado PROGRAM COUNTER. Tiene almacenada la dirección de la próxima instrucción a ser ejecutada.
Ahora pasemos al registro bandera o STATUS REGISTER, que nos da el resultado de la actuación de la ALU
Señal REF Función REF Función
Overflow NV No hay OV Hay
Direction UP Hacia adelante DN Hacia atrás
Interrupts DI Desactivadas EI Desactivadas
Sign PL Valor positivo NG Valor negativo
Zero NZ No es cero ZR Es cero
Auxiliary Carry NA No hay acarreo AC Hay acarreo
Parity PO Paridad impar PE Paridad Par
Carry NC No hay acarreo CY Se produjo acarreo
El comando r (registro) nos permite interactuar con los registros de la CPU, posibilitando modificar sus contenidos. Cuando tipeamos r sin ningún otro parámetro nos muestra todos los registros con sus respectivos contenidos, pero si agregamos un parámetro 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 números indicados
- a 100 Indica que se debe comenzar a ingresar datos a partir de la posición 100
XXXX: 0100 MOV AX, 200 Mover 200 al acumulador (AX)
XXXX: 0103 MOV BX, FFF Mover FFF al Registro Base (BX)
XXXX: 0106 ADD AX, BX Sumar BX a AX
XXXX: 0108 INT 20
XXXX: 010A Dar enter
- Aparece el signo del DEBUG que tiene el control.
-a
1987:0100 mov ax,200
1987:0103 mov bx,FFF
1987:0106 add ax,bx
1987:0108 int 20
1987:010A
-
Ingresemos ahora el comando –r
-u
Este comando nos muestra nuestro programa compilado y muchas otras instrucciones que se encuentran en máquina pero que a nosotros no os interesan y que solo sirven para ensuciar nuestro razonamiento, por ello es preferible el comando
–u XXXX XXXX (desde-hasta).
1987:0100 B80002 1987:0103 BBFF0F
1987:0106 01D8 1987:0108 CD20
1987:010A B2E8
1987:010C 7421
1987:010E A0C9DE
1987:0111 0AC9
1987:0113 7505
1987:0115 3A45FF
1987:0118 7401
1987:011A AA
1987:011B 8B34
1987:011D 007619
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
-
por ello es preferible el comando
–u XXXX XXXX (desde-hasta).
Si ingresamos el comando –u0100 0108 nos muestra el programa compilado. No tipeamos hasta 010A porque esta posición de memoria no la utilizamos y aparece instruccines que nosotros no hemos introducido en el sistema.
-u 0100 0108
1987:0100 B80002 MOV AX,0200
1987:0103 BBFF0F MOV BX,0FFF
1987:0106 01D8 ADD AX,BX
1987:0108 CD20 INT 20
-
Hagamos un alto y veamos como queda nuestro programa.
En la primer columna tenemos las posición de nuestras instrucciones comenzando desde la posición 0100 (las 4 primeras indican también la posición pero a ellas no nos referiremos por el momento).
En la segunda aparece la compilación.
Aquí hay algo realmente curioso:
B80002 – El primer byte es el código de operación. Fácil de entender.
El segundo corresponde a los dos últimos dígitos del número que nosotros queremos cargar en el acumulador.
El tercer byte tiene los dos primeros número del número que nosotros ingresamos.
Es decir que
...