BENEMÉRITA UNIVERSIDAD AUTÓNOMA DE PUEBLA FACULTAD DE CIENCIAS DE LA COMPUTACIÓN PRÁCTICA DE LABORATORIO No II NOMBRE DE LA PRÁCTICA: COMANDOS BÁSICOS DE DEBUG( PARTE II) OBJETIVO: APRENDER A EJECUTAR INTERRUPCIONES, ASÍ COMO A ENSAMBLAR Y DESENSAMBLAR. DESARROLLO DE LA PRÁCTICA: A ¿qué se denomina interrupciones? Se denomina interrupción a una operación que suspende la ejecución de un programa de modo que el sistema pueda realizar una acción especial. La rutina de interrupción ejecuta y por lo regular regresa el control al procedimiento que fue interrumpido, el cual entonces reasume su ejecución. ¿Qué interrupciones están reservadas para el DOS? Las interrupciones desde la 20H hasta la 3FH están reservadas para operaciones del DOS. Algunas de estas interrupciones son: INT 20H: Termina el programa. INT 21H: Petición de función al DOS. INT 22H: Dirección de terminación. INT 23H: Dirección de Cltr + Break (para transferir el control a una rutina) INT 24H: Manejador de error critico. INT 25H: Lectura absoluta de disco. INT 26H: Escritura absoluta de disco. INT 27H: Termina pero permanece residente (reside en memoria). INT 2FH: Interrupción de multiplexion. INT 33H: Manejador del ratón. ¿Cuál es la función de la Interrupción 21 y con qué registros trabaja? Lo que realiza la interrupción 21 es una petición de función al DOS. La principal operación del DOS necesita una función en el AH (trabaja con el registro de propósito general AX). ¿Cuál es la función de la interrupción 20? Su función es terminar el programa. Finaliza la ejecución de un programa .COM, restaura las direcciones para Cltr + Break y errores críticos, limpia los bufer de registros y regresa el control al DOS. Esta función por lo regular seria colocada en el procedimiento principal y al salir de el, CS contendría la dirección del PSP. La terminación preferida es por medio de la función 4CH de la INT 21H. El comando 'G' ( Go to o ir ) 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 les 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. Ejemplo: Voy 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. Ejecuta con G 102 [Enter] Otro ejemplo: Ejecuta G [Enter] Si estas seguro que hay una int 20h en tu programa Ejemplo insertar el código de máquina cd20H al programa anterior El Comando '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: -r 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 CD21 INT 21 -p El Comando A El comando A(Assemble, ensamblar) le dice a DEBUG que acepte instrucciones simbólicas en ensamblador y las convierta a lenguaje de máquina. Mi primeros pasos en ensamblador a). Inicialice la dirección de inicio en el segmento de código con desplazamiento 100h para sus instrucciones como A 100h [Enter] DEBUG muestra el valor del segmento de código y el desplazamiento como xxxx:0100. b). Ingrese el siguiente programa: MOV AH,02 [Enter] MOV DL,41 [Enter] INT 21 [Enter] INT 20 [Enter] NOP [Enter, Enter] Nota: El segundo [Enter] de la última instrucción(NOP), indica a DEBUG que ya no hay mas instrucciones por ingresar. Al terminar DEBUG debe mostrar lo siguiente: xxxx:0100 MOV AH,02 xxxx:0102 MOV DL,41 xxxx:0104 INT 21 xxxx:0106 INT 20 xxxx:0108 c). Examinar el lenguaje máquina generado. Usando el comando U (unassemble, desensamblar), indicar a DEBUG las localidades de la primera y última instrucción que quiere ver, en este caso, 100h y 106 h. Teclee : U 100,106 [Enter] Nota : 100 indica en donde inicia el programa, y 106 indica en donde está la ultima instrucción (xxxx:108 NOP) La pantalla debe mostrar columnas para la localidad, el código de máquina y el código simbólico: xxxx:0100 xxxx:0102 xxxx:0104 xxxx:0106 xxxx:0108 MOV AH,02 MOV DL,41 INT 21 INT 20 NOP Uso de la instrucción INT Los tres ejemplos siguientes muestran cómo accesar el DOS y el BIOS para enviar información acerca del sistema. Para este fin. se utiliza la instrucción INT(interrupción), la cual sale de su programa, ingresa una rutina del DOS o de BIOS. Realiza la función solicitada y regresa a su programa. En lugar de avanzar un solo paso, usaremos el comando P (Proced, proceder) de DEBUG para ejecutar toda la rutina de interrupción. Cómo obtener el número de versión del DOS La instrucción que entrega el número de versión es INT 21h del DOS, función 30h; esto es, cargue 30h en el registro AH y solicite INT 21h. a). Ingrese el comando A 100 (de DEBUG ) b). Ingrese las instrucciones en ensamblador: MOV AH, 30 INT 21 NOP (seguido por un [enter] adicional ) Para rastrear la ejecución de las instrucciones, primero ingrese R para ver los registros y T para rastrear MOV. En lugar de rastrear la instrucción INT, ingrese P(proced, proceder) para ejecutar toda la rutina del DOS. El proceso termina con la instrucción NOP. Ahora puede ver en AL el número principal de la versión del DOS, como X en DOS X.20, y en AH el número secundario de la versión, como 14H(o 20) en DOS X.20. Presione Q para salir. Cómo obtener la fecha actual( INT 21h, función 2Ah) El valor de la función debe ser asignado a: AH MOV AH,2A INT 21 NOP Ingrese R para mostrar los registros, T para ejecutar MOV, y P(proced) para INT, la opearción se detiene en NOP. Los registros muestran esta información: AL : Día de la semana(0=Domingo) CX : Año(en hexadecimal, por ejemplo, 07DH = 1997) DH : Mes (01 a 12) DL : Día del mes (01 a 31) Presione Q, para salir. Ejercicios: 1.-Hacer un programa que escriba su nombre en la pantalla 2.-Hacer un programa que escriba en pantalla su nombre y apellido, tal como se indica JUAN PÉREZ ; es decir que incluya un ENTER.