guia 3
-
Upload
martin-cazun -
Category
Documents
-
view
214 -
download
0
description
Transcript of guia 3
![Page 1: guia 3](https://reader033.fdocuments.ec/reader033/viewer/2022042821/55cf8f09550346703b984d7f/html5/thumbnails/1.jpg)
Universidad de El Salvador
Facultad de Ingeniería y Arquitectura
Escuela de Ingeniería Eléctrica
Sistemas Digitales Programables I
Guía de laboratorio # 3
Docente: Ing. Ricardo E. Cortéz
Instructores: Br. Teddy Miguel Calderón Lopez
Br. Jose Miguel Carillo Aguirre
Objetivos:
1. Conocer las directivas más usadas del MASM.
2. Conocer los formatos que puede tomar un programa bajo el ambiente DOS: formatos
.COM y .EXE.
3. Identificar las características, ventajas y desventajas de estos dos formatos.
4. Crear programas en ambos formatos.
5. Mostrar las ventajas de utilizar las interrupciones por software tanto del BIOS como del
DOS.
Introducción
En esta práctica se busca que el estudiante tenga conocimientos de las formas que pueden
tomar los programas escritos para correr bajo el ambiente del sistema operativo DOS.
Se verá que, independientemente de la complejidad o simplicidad de un determinado programa,
este deberá cumplir con alguno de los formatos posibles. El que se tome uno u otro dependerá
de varios factores, entre ellos podemos mencionar el tamaño del programa, portabilidad,
interacción con otros programas, etc.
El otro tópico cubierto en esta práctica es el relativo al uso de las interrupciones por software.
Como se verá, al usar estos servicios proporcionados por el sistema se facilita la labor del
programador ya que se consigue una especie de aislamiento entre el programador y el hardware
de maquina. Otra ventaja del uso de las interrupciones es que al hacer los programas
independientes del hardware especifico, se consigue que estos se vuelvan más portables.
![Page 2: guia 3](https://reader033.fdocuments.ec/reader033/viewer/2022042821/55cf8f09550346703b984d7f/html5/thumbnails/2.jpg)
Al igual que en la práctica anterior, en esta se intenta que los conceptos se refuercen a partir de
ejemplos sencillos que ilustren los elementos básicos. La creación de programas complejos es
una tarea que cada quien debe experimentar por cuenta propia.
Directivas del MASM
Las directivas son comandos para el ensamblador y no, como muchos pensaran, instrucciones
para el microprocesador. Las directivas pueden ser usadas para definir símbolos, reservar
memoria para almacenamiento temporal y realizar una variedad de funciones que tienen validez
durante el tiempo de ensamble. A diferencia de las instrucciones en lenguaje ensamblador, la
mayoría de directivas no generan código objeto.
El macroensamblador tiene cerca de 60 directivas diferentes. En esta práctica discutiremos las
más comunes, las cuales las dividiremos en tres grupos:
1. Directivas de Datos.
2. Directivas de Listado.
3. Directivos de Modo.
Directivas de Datos. Estas a su vez se dividen en 5 grupos funcionales:
Directivas de definición de símbolos
Directivas de definición de datos (en memoria)
Referencias externas
Referencias de especificaciones de procedimiento/segmentos
Directivas de control de ensamble
Directivas de Definición de Símbolos
Estas asignan un nombre simbólico a una expresión. Esta puede ser una constante de 16 bits,
una referencia de dirección, otro nombre simbólico, un identificador de segmentos y un
operando o una etiqueta de instrucción.
EQU: Esta se usa para definir permanentemente un símbolo con un valor. Ejemplo:
K EQU 1024
TABLE EQU DS:[BP][SI]
SPEED EQU RATE
COUNT EQU CX
![Page 3: guia 3](https://reader033.fdocuments.ec/reader033/viewer/2022042821/55cf8f09550346703b984d7f/html5/thumbnails/3.jpg)
= : Esta se usa para definir un símbolo con un valor. A diferencia de EQU, un símbolo puede ser
redefinido al usar 0. Ejemplo:
CONST = 56
CONST = CONST + 1
Directivas de Definición de Datos (en memoria):
Muchos programas usan posiciones de memoria para mantener variables. Las directivas usadas
para localizar espacio para variables en memoria son DB (Define Byte), DW (Define Word) y DD
(Define Double Word).
DB: Se utiliza para definir un byte en memoria en la posición actual. Ejemplo:
DATO DB 255
TABLA DB 1, 2, 100, 5.3, 4H
STRING DB ‘Este es un string almacenado en STRING’
DW: Se utiliza para definir una palabra o Word (2 bytes) en memoria en la posición actual.
Ejemplo:
DATO DW 65535, 0EFAH
TABLA DW 34FAH, 0A125H
STRING DW ‘Este es un string almacenado en STRING’
DD: Se utiliza para definir una doble palabra o Doble Word ( 4 bytes) en memoria en la posición
actual. Ejemplo:
TABLA DD 435632FAH, 3435OF34EH
Muchas veces, se necesita tener un mismo valor en un bloque de memoria, esto se puede
especificar mediante el operando DUP. Ejemplo:
TABLA DB 4 DUP(0)
Con la anterior directiva, reservamos 4 bytes en memoria (comenzando en TABLA) que
contendrá el valor de 0. Además para definir una variable sin darle un valor inicial, se coloca un
signo de interrogación (?) en el campo de la expresión. Ejemplo:
![Page 4: guia 3](https://reader033.fdocuments.ec/reader033/viewer/2022042821/55cf8f09550346703b984d7f/html5/thumbnails/4.jpg)
ALTA_TEMP DB ?
ALTAS_TEMP DB 100 DUP(?)
Directivas de Especificaciones de Procedimientos/Segmentos:
Las directivas SEGMENT y ENDS dividen el programa fuente en segmentos. La directiva
SEGMENT puede tomar tres operandos: tipo de alineación (align-type), tipo de combinación
(combine-type) y clase (class).
El tipo de alineación define el límite en el cual comience el segmento. Por ejemplo BYTE
comenzará en cualquier parte, WORD comenzará el segmento a una dirección múltiplo de 2,
PARA lo alineará a una dirección múltiplo de 16 y PAGE lo alineará a una dirección múltiplo de
256.
El tipo de combinación especifica cómo un segmento será combinado con otros del mismo
nombre. Las opciones acá son PUBLIC, STACK, MEMORY y COMMON.
La clase afecta el orden en que los segmentos son almacenados. Los segmentos que tienen la
misma clase son almacenados consecutivamente.
Las combinaciones que se recomiendan usar son:
• Para segmentos de datos use: SEMENT PARA PUBLIC ‘DATA’
• Para segmentos de códigos use: SEGMENT PARA PUBLIC ‘CODE’
• Para segmentos extra use: SEGMENT PARA PUBLIC ‘EXTRA’
• Para segmentos de snack use: SEGMENT PARA STACK ‘STACK’
Las palabras SEGMENT y ENDS simplemente marcan el comienzo y el final de un segmento: ellos
no le dicen al ensamblador que tipos de segmentos están siendo definidos.
ASSUME ayuda al ensamblador a traducir rótulos a direcciones, diciéndole con que registros de
segmentos se planean utilizar estas direcciones lógicas (rótulos o viñetas). Ejemplo:
ASSUME DS:DSEG
Le dice al ensamblador “DSEG es mi segmento de datos. Yo prometo que DS apuntará al inicio
del segmento DS, y cualquier rótulo de éste, se usará como registro de segmento DS”.
La directiva ASSUME se coloca inmediatamente después de la definición del inicio del segmento
de código.
![Page 5: guia 3](https://reader033.fdocuments.ec/reader033/viewer/2022042821/55cf8f09550346703b984d7f/html5/thumbnails/5.jpg)
Ejemplo:
CSEG SEGMENT PARA PUBLIC ‘CODE’
ASSUME CS: CSEG, DS: DSEG
MOV AX, DSEG ;hace que DS apunte a DSEG
MOV DS, AX
…
CSEG ENDS
Note además, que explícitamente el programa se carga en DS la dirección del segmento de
datos, ya que la directiva ASSUME no lo hace. ¿Por qué?
Las directivas PROC y ENDP marcan el inicio y final de un procedimiento. Un procedimiento es
un bloque de instrucciones que puede ser ejecutado de varios lugares en un programa. De donde
sea que un programa llama a un procedimiento, el flujo de instrucciones retornará al lugar
donde la llamada fue hecha.
Cada procedimiento tiene que comenzar con un PROC y finalizar con un ENDP. Si este contiene
una instrucción RET, este será llamado subrutina. Un procedimiento siempre tiene uno de dos
atributos distancia: NEAR o FAR.
Un procedimiento NEAR, solo puede ser llamado de otro procedimiento que se encuentre en el
mismo segmento de código. Ejemplo:
CSEG SEGMENT PARA PUBLIC ‘CODE’
ASSUME CS:CSEG
CALLER PROC
…….
CALL CALLEE
…….
RET
CALLER ENDP
![Page 6: guia 3](https://reader033.fdocuments.ec/reader033/viewer/2022042821/55cf8f09550346703b984d7f/html5/thumbnails/6.jpg)
CALLED PROC NEAR
…….
…….
RET
CALLED ENDP
CSEG ENDS
Aquí el procedimiento llamado es definido en el mismo segmento donde se ejecuto CALL. Sin
embargo, los dos procedimientos podrían haber estado en módulos de programas diferentes
(dos archivos diferentes), siempre y cuando el segmento de código tenga el mismo nombre en
ambos archivos.
Un procedimiento FAR puede ser llamado de cualquier segmento de código. Ejemplo:
CSEG SEGMENT PARA PUBLIC ‘CODE’ ASSUME CS:CSEG CALLER PROC . . . CALL CALLEE . . . RET CALLER ENDP CSEG1 SEGMET PARA PUBLIC ‘CODE’ ASSUME CS:CSEG1 CALLEE PROC NEAR . . . . . . RET CALLEE ENDP CSEG1 ENDS
La diferencia entre un RET de un procedimiento NEAR y FAR es la siguiente: en NEAR, al
realizarse la llamada, se guardo el IP en la pila (snack), por tanto, RET solo posee el IP. En FAR, al
realizarse la llamada, se guarda el IP y el CS, por lo tanto RET recupera tanto el IP como el CS del
Stack. Por lo tanto, ambos RET, aunque tienen el mismo mnemónico, tienen diferente
traducción al lenguaje máquina.
![Page 7: guia 3](https://reader033.fdocuments.ec/reader033/viewer/2022042821/55cf8f09550346703b984d7f/html5/thumbnails/7.jpg)
Directivas de Referencia Externa:
Estas directivas permiten compartir información entre módulos que eventualmente serán
enlazados para formar un programa.
La directiva PUBLIC pone a disposición de otros módulos uno o más símbolos. Le dice al
enlazador: “Aquí hay una lista de ítems que tengo. Si alguien necesita accesarlos, tienes el
permiso de decirle donde están.” Una variable PUBLIC puede listar nombres de variables, rótulos
y nombres definidos a través de EQU o =.
EXTRN es la contraparte de PUBLIC. Esta le dice al enlazador: “Yo deseo usar estos ítems. No se
donde están o en que módulos hallarlos, pero necesito utilizarlos.”. Formato:
EXTERN name: type [. . .]
Donde “name” es el símbolo definido (y declarado PUBLIC) en algún otro módulo ensamblador
y “type” puede ser de los siguientes:
• Si “name” es un procedimiento, el tipo puede ser NEAR o FAR.
• Si “name” es una constante definida por EQU o =, el tipo puede ser ABS.
PUBLIC y EXTRN con frecuencia son usados para compartir procedimientos. Por ejemplo, para
correr un procedimiento llamado SORT de un programa principal, el módulo en que SORT es
definido debe incluir PUBLIC SORT y el módulo principal debe contener EXTRN SORT: NEAR o
EXTRN SORT: FAR.
Directivas de Control de Ensamble:
Las directivas de este tipo ampliamente usadas son END y ORG.
END: Esta directiva indica el final de ensamble y el inicio de la ejecución del programa.
Formato: END [punto de entrada]
ORG: Esta altera el valor del contador, haciendo que el ensamblador almacene datos o
instrucciones en algún lugar especificado por ORG. Ejemplo:
ORG 100H
Esta directiva es usada con frecuencia en programas .COM
![Page 8: guia 3](https://reader033.fdocuments.ec/reader033/viewer/2022042821/55cf8f09550346703b984d7f/html5/thumbnails/8.jpg)
Directivas de Listado
Estas se utilizan para indicarle al ensamblador cómo penetrar el listado de ensamble.
PAGE: se usa para indicar cuantas líneas y columnas tendrá el listado del programa fuente.
Formato:
PAGE [líneas], [columnas]
Ejemplo:
PAGE 72,132 ; imprime 72 líneas con 132 columnas
TITLE: se utiliza para colocar un título en la segunda línea de cada página.
Formato:
TITLE texto
SUBTTL: especifica un subtítulo para ser listado sobre la tercera línea de cada página
Formato:
SUBTTL texto
Los títulos y subtítulos pueden tener hasta 60 caracteres de longitud.
Directivas de Modo.
El macroensamblador está diseñado para trabajar con los microprocesadores 8086, 8088,
80286, 80386, 80486 y Pentium®. El 80286 y superiores incluyen todas las instrucciones
8086/8088. La directiva de modo le dice al ensamblador que conjunto de instrucciones del
microprocesador reconoce.
.286c: Le dice que acepte las instrucciones del 80286 como del 8086/88.
.8086: Le dice que solo acepte las instrucciones del 8088/8086. Este es el modo por defecto.
![Page 9: guia 3](https://reader033.fdocuments.ec/reader033/viewer/2022042821/55cf8f09550346703b984d7f/html5/thumbnails/9.jpg)
Programas COM
DOS puede trabajar con dos tipos diferentes de programa: los programas .EXE y los programas
.COM. En general, los programadores utilizan la técnica .EXE para programas grandes
(programas mayores de 64Kb.) y usan los .COM para programas pequeños. De hecho, los
programas .COM están limitados a 64Kb. Si el programa es mayor tiene que crearse en formato
.EXE.
Los programas .COM son los programas más simples y pequeños bajo el DOS; ellos son cargados
en segmentos de memoria de 64K. Aunque los programas .COM están pensados para existir
totalmente dentro de un segmento, ellos modifican algunas regiones de memoria. Ejemplo:
Los programas .COM que accedan directamente la memoria de video modifican memoria fuera
de su área asignada.
Los primeros programas para las PC y compatibles hacían mucho más que simplemente acceder
memoria de video: esto debido a que el resto de memoria se asumía disponible para su uso, un
programa podía manejar tablas, cargar programas ovelays o controlar memoria extra necesaria
para sus funciones. Algunos programas bastante buenos trabajan de esta forma.
Si DOS asumía que un programa .COM usaría solo la memoria asignada, otro programa
ejecutado por DOS fácilmente confundiría un programa que ya estuviera allí. Para eliminar el
problema, DOS da al programa .COM que se ejecuta, toda la memoria libre. La forma en que un
sistema operativo asigna memoria puede verse en el libro de Tannenbaum.
Un programa .COM puede sobrepasar el límite asumido del área de datos. Simplemente se
modifica el registro que corresponde al segmento. De esta manera se puede apuntar a áreas de
memoria que el programa necesita acceder.
Ejemplo:
Modificando un registro DS, un programa .COM puede manipular datos en cualquier parte de la
memoria.
Esta capacidad es necesaria si el programa va a modificar la memoria de video directamente en
vez de usar los servicios de DOS para salidas de video, porque la memoria de video no puede
estar dentro del segmento de datos.
![Page 10: guia 3](https://reader033.fdocuments.ec/reader033/viewer/2022042821/55cf8f09550346703b984d7f/html5/thumbnails/10.jpg)
Para evitar que un programa pueda modificar toda la memoria, DOS le asigna sólo la memoria
disponible al programa.
Si se desea programar en formato .COM y con funciones especiales, como la EXEC, puede
estudiarse un manual del DOS para programadores.
Reglas para crear programas .COM
En esta sección se darán el conjunto de reglas para crear archivos COM. Las más importantes se
describen a continuación:
1. Omitir todos los segmentos de pila, datos y extra.
2. Definir únicamente un segmento de código, y poner cualquier dato en éste.
3. En la directiva ASSUME, apuntar los cuatro registros de segmento a segmento de
código.
Ejemplo:
CSEG SEGMENT PARA PUBLIC `CODEC`
ASSUME CS : CSEG, DS : CSEG, ES : CSEG, SS : CSEG
4. El punto de entrada del porgrama debe ir precedido de ORG 100H
Esto le dice al computador que cargue el programa 256 bytes después del inicio del programa.
Esto es necesario porque, un programa .COM, los primeros 256 bytes son ocupados por el PSP
(Program Segment Prefix).
5. Poner cualquier dato antes de las instrucciones del programa, si hay datos incluidos,
el programa tiene que comenzar con la instrucción JMP saltando los datos, hasta
caer en la segunda instrucción del procedimiento (la primera fue JMP).
6. Definir todos los procedimientos como NEAR (cercano).
7. A continuación de las directivas END, se colocara el rotulo que corresponde a la
primera instrucción, como se muestra: END ENTRY.
![Page 11: guia 3](https://reader033.fdocuments.ec/reader033/viewer/2022042821/55cf8f09550346703b984d7f/html5/thumbnails/11.jpg)
Modelo para crear programas COM:
Mediante la utilización del ensamblador y enlazador, se pueden hacer muchas combinaciones
en lo que a creación de módulos se refieren.
Ejemplo:
Se puede tener dos archivos –llamados códigos o módulos fuente- con dos procedimientos, en
uno de los cuales se invoque un procedimiento que pertenece al otro modulo fuente. Ambos
son ensamblados independientemente, creando dos archivos objetos se pueden fusionar en un
solo archivo ejecutable.
Al módulo fuente que hace la llamada le denominaremos modulo principal y al que es llamado
le denominaremos modulo secundario.
El formato para un módulo principal –el que contiene el procedimiento principal a ejecutarse- ,
se muestra a continuación:
; COMENTARIOS PAGE 50,132 ;OPCIONAL TITLE (INSERTE TITULO AQUI) ;OPCIONAL CSEG SEGMENT PARA PUBLIC `CODE` ASSUME CS :CSEG,DS :CSEG,ES :CSEG,SS :CSEG ORG 100H ENTRY: JMP RPOG ;AQUI VAN LOS DATOS PROG PROC NEAR ; INSTRUCCIONES ACA RET PROG ENDP CSEG ENDS END PROG
De este formato podemos observar lo siguiente:
-Después de la sección de comentarios, una instrucción SEGMENT declara el inicio del segmento
de código y el origen del programa se establece en la posición 100H, se deja espacio dentro del
segmento para el PSP del programa.
![Page 12: guia 3](https://reader033.fdocuments.ec/reader033/viewer/2022042821/55cf8f09550346703b984d7f/html5/thumbnails/12.jpg)
Luego, con la instrucción ASSUME, se le dice al ensamblador que todos los segmentos del
procesador están referidos al segmento de código y dado que un segmento puede direccionar
64K, el programa efectivamente está limitado a un espacio de 64K.
Finalmente se crea el único procedimiento del programa, que en este caso ha sido denominado
`código`, y se declara como procedimiento cercano (NEAR); todas las referencias se harán
dentro del segmento. Por último se escriben las instrucciones que le dan al final del programa.
El formato para un módulo secundario tiene algunas diferencias y similitudes con el módulo
principal. En primer lugar, el segmento debe tener el mismo nombre en ambos módulos y a
diferencia del módulo principal, l modulo secundario no contendrá en su directiva END, el inicio
de la ejecución.
Además de ello, el modulo secundario debe declarar como PUBLIC el procedimiento (ver sección
directivas). El formato para un módulo secundario, teniendo dichas consideraciones queda
como sigue.
;COMENTARIOS PAGE 50,132 ;OPCIONAL TITLE (INSERTE TITULO AQUI) ;OPCIONAL PUBLIC PNAME CSEG SEGMENT PARA PUBLIC `CODE` ASSUME CS :CSEG,DS :CSEG,ES :CSEG,SS :CSEG ORG 100H ;AQUI VAN LOS DATOS PNAME PROC NEAR ; ; ;INSTRUCCIONES AQUI RET PNAME ENDP CSEG ENDS END
![Page 13: guia 3](https://reader033.fdocuments.ec/reader033/viewer/2022042821/55cf8f09550346703b984d7f/html5/thumbnails/13.jpg)
Programa .EXE
Los programas .EXE son más complejos y versátiles que los .COM ya que en vez de estar limitados
a un único segmento, los programas .EXE frecuentemente ocupan varios segmentos y pueden
incluir más de un segmento de código y de datos. El programa .EXE tiene un encabezamiento
especial que es usado por la función EXEC del DOS para cargar el programa. Este
encabezamiento contiene la información que el DOS necesita para cargar el archivo y determinar
los requisitos de la memoria. Debido a esta característica, un programa EXE es almacenado como
una imagen de memoria re localizable.
Los programas .EXE son más flexibles que los .COM y generalmente son más grandes. Ellos
también residen mejor en memoria porque pueden partirse en segmentos discretos y asignarse
a espacios disponibles.
El formato de un programa .EXE es:
;COMENTARIOS
CSEG SEGMENT PARA PUBLIC `CODE` ASSUME CS :CSEG,DS :CSEG,ES :CSEG,SS :CSEG
;COMENTARIOS CODIGO PROC FAR ; ; CODIGO ENDP CSEG ENDS
;COMENTARIO DSEG SEGMENT PARA STACK `STACK` ; ; STACK ENDS END CODIGO
![Page 14: guia 3](https://reader033.fdocuments.ec/reader033/viewer/2022042821/55cf8f09550346703b984d7f/html5/thumbnails/14.jpg)
De la comparación de ambos formatos puede verse que el programa .EXE es más complejo. En
ambos el segmento de código es declarado de la misma forma; pero la instrucción ASSUME es
diferente. En el formato .EXE se asignan diferentes valores para cada segmento. Cada registro
apunta a una sección diferente de programa. (Notar que SS apunta a un stack definido). El
procedimiento es declarado FAR, lo que indica que puede ser llamado desde otros programas.
Debido a que el programa .EXE tiene un segmento de datos, se debe entonces fijar
explícitamente el segmento de datos al principio del segmento de datos. El primer paso en este
proceso es poner la dirección en usualmente AX, el segundo paso es transferir la dirección a
DS.
Cuando un archivo .EXE es cargado en memoria para ser corrido, se crea un segmento, el PSP; y
se almacena en los 256 bytes que preceden al programa. Los primeros dos bytes del PSP
contiene la instrucción:
INT 20H
La cual ocasionara un retorno al DOS.
Cuando un programa .EXE es ejecutado, el segmento DS contiene la dirección del segmento PSP.
Las instrucciones.
PUSH DS
MOV AX,0
PUSH AX
Guardaran la dirección DS:00 en el stack. Ya que DS:00 es al dirección del inicio del PSP, cuando
una instrucción de retorno sea ejecutada (RET) el programa salta al inicio del PSP y la
interrupción 20H se ejecutara, lo que producirá un retorna al DOS.
Programas .EXE vrs. .COM
En resumen, el diseñar el programa como archivo .COM tiene ciertas ventajas sobre diseñarlos
como archivo .EXE y viceversa.
Entre las ventajas de archivos .COM estan:
a) Son inherentemente más cortos que los archivo .EXE.
b) Ellos se cargan más rápido que los archivos .EXE.
c) Son más fáciles de escribir, debido a que no se inicializa el stack, el registro DS o ES.
![Page 15: guia 3](https://reader033.fdocuments.ec/reader033/viewer/2022042821/55cf8f09550346703b984d7f/html5/thumbnails/15.jpg)
Entre sus desventajas están:
a) No pueden ser más grandes que 64kbytes.
b) Pueden tener solo un segmento, y así no proporcionan una separación limpia entre
datos e instrucciones.
c) No pueden acceder procedimientos o datos que estén en otros segmentos. Esto lo hace
particularmente difícil al intentar usar módulos que fueron construidos por otros
programadores.
Interrupciones.
Las interrupciones se usan para suspender la ejecución normal de un programa, generalmente
como respuesta a una señal externa. Cuando se da una interrupción, el control se transfiere a
una parte especial del programa denominado rutina. Cuando esta finaliza, el control regresa al
punto donde se interrumpió el programa que se estaba ejecutando.
Existen tres tipos de interrupciones: RESET, interrupciones por hardware e interrupciones por
software.
Para los propósitos de este documento nos limitaremos a examinar un poco las interrupciones
por software, las cuales ocurren cuando se ejecuta la instrucción INT.
El formato de esta instrucción es: INT tipo
Donde el tipo es el número de interrupción (00H -- FFH). Esta instrucción la cual no se ve afectada
por la bandera I del registro de estado, provoca la siguiente secuencia de eventos:
1. Coloca el contenido del registro de estado en el snack(la pila).
2. Limpia la bandera I y la bandera T.
3. Coloca el IP y el CS en el snack.
4. Carga el IP y el CS con los valores obtenidos del vector de interrupciones.
![Page 16: guia 3](https://reader033.fdocuments.ec/reader033/viewer/2022042821/55cf8f09550346703b984d7f/html5/thumbnails/16.jpg)
Estas interrupciones por software pueden utilizarse a manera de subrutinas, donde la dirección
de inicio de la subrutina, CS:IP, se está almacenando en la tabla de vectores de interrupción.
Es de esta forma (como subrutina haremos uso de las interrupciones por software), ya que
mediante ellas podemos acceder los distintos servicios accesador por el sistema: E/S de
impresora E/S de disco, etc.
Al usar los servicios del sistema (funciones del BIOS y del DOS) se facilita nuestro trabajo de
programación ya que no tenemos que preocuparnos por conocer detalladamente la forma en
que se realizan estas acciones, pues únicamente invocamos un servicio y este se encarga de
controlar el hardware. Además, el uso de los servicios del sistema al proveer una interfaz entre
el hardware y el software, permita una estandarización de los programas.
Para acceder los servicios del DOS y el BIOS a partir de un programa debe seguirse el siguiente
procedimiento:
1. Cargar los registros de la CPU con los valores apropiados.
2. Generar una interrupción por software para invocar el servicio deseado.
3. Interpretar los resultados (si los hay) devueltos en el registro de la CPU.
Por lo general, los valores cargados en los registros son valores numéricos de 8, 16 bits o las
direcciones de estructura de datos mayores de 16 bits.
Dependiendo de cuál servicio se quiera invocar, se podría necesitar de algún trabajo propio al
cargar los registros y generar la interrupción. Muchos servicios orientados a archivos, por
ejemplo, requieren que el programa cargue registros con la dirección segmento: offset
(desplazamiento) de una cadena de caracteres u otra estructura de datos antes de generar la
interrupción.
A manera de ejemplo del uso de interrupciones, a continuación se presenta un fragmento de
programa, el cual usa la interrupción 21H (servicios del DOS), funcion 02H para enviar un
carácter en pantalla:
![Page 17: guia 3](https://reader033.fdocuments.ec/reader033/viewer/2022042821/55cf8f09550346703b984d7f/html5/thumbnails/17.jpg)
MOV AH,2 ;FUNCION DE ENVIO DE CARÁCTER
MOV DL,`K` ;CARÁCTER K
INT 21H
La interrupción 21H, funcion 02H trabaja asi:
1. Carga los registros con los valores apropiados: en este caso el valor de 2 se carga en el
registro AH para seleccionar la función 2 (salida de carácter por pantalla). El carácter “K”
se carga en registro DL.
2. Generar la interrupción: el mnemónico INT es seguido por el valor 21H, el cual
corresponde a una interrupción para obtener servicios del DOS.
3. Dado que la función 02H de la interrupción 21H no retorna ninguna información, la
tercera parte del procedimiento para utilizar los servicios de BIOS y DOS no tiene
equivalente en el segmento anterior.
A fin de ejemplificar los tres pasos mencionados y también para ilustrar una de las formas para
obtener y pasar al DOS la dirección de elementos mayores de 16 bits se presenta el siguiente
fragmento de código.
;NOMBRE_ARCH contiene el camino (path) del archivo a abrir.
MOV AX,SEG NOMBRE_ARCH ;coloca la direccion del segmento
MOV DS:AX ;de nombre_arch en ds.
MOV DX,OFFSET NOMBRE_ARCH ;direccion offset de nombre_arch
MOV AL,C2H ;modo para apertura de archivo
MOV AH,3DH ;abrir el archivo
INT 21H ;interrupción del DOS
JC ERROR ;si carry=1, hubo algun error.
![Page 18: guia 3](https://reader033.fdocuments.ec/reader033/viewer/2022042821/55cf8f09550346703b984d7f/html5/thumbnails/18.jpg)
Este fragmento de código utiliza la interrupción 21H, función 3DH para abrir un archivo. Esta
función requiere que DS y DX contengan el segmento y el desplazamiento (offset),
respectivamente, de la ruta del archivo a abrir. Las primeras tres líneas del fragmento de código
cargan los registros de acuerdo a lo anterior. La siguiente línea coloca el valor de C2H en el
registro AL; este valor especifica el modo en el cual se abrirá el archivo. Ya con los registros
apropiadamente cargados, la interrupción es generada.
Al igual que muchos servicios del DOS, este pone a uno la bandera de acarreo (carry) si el servicio
fallo; el código entonces salta a una rutina de manejo de error si la bandera esta en 1 (JC ERROR).
Si la bandera esta en 0, indicando que se tuvo éxito, el indicador, devuelto en AX, es guardado
en un byte de datos reservado para este propósito.
Entre los servicios más utilizados en todos los programas están los que tiene que ver con la E/S
a través de la pantalla. Tanto el BIOS como el DOS proporcionan estos servicios.
La interrupción 10H tiene 16 opciones básicas, las cuales son controladas por el registro AH en
el momento de generar una interrupción. La opción de modo (AH=0) determina tanto la
resolución de la pantalla como el modo grafico disponible.
Una de las formas más eficientes de utilizar estas interrupciones es colocándolas como macros
en una librería de macros. De esta forma nuestros programas fuente serán compactos y legibles,
lo cual facilita su posterior depuración y modificación.
Procedimiento de la práctica
1. Escriba el programa .COM, ensámblelo y enlácelo según el procedimiento escrito en la
práctica anterior.
a) Cree el programa con extensión .COM para crear un programa .COM a partir
de uno .EXE usando el programa BIN del DOS el formato general a seguir es:
BIN2EXE PROGR.EXE
b) Imprima el código fuente y el archivo .LST creado por el ensamblador.
c) Ejecute el programa.
![Page 19: guia 3](https://reader033.fdocuments.ec/reader033/viewer/2022042821/55cf8f09550346703b984d7f/html5/thumbnails/19.jpg)
2. Escriba el programa .EXE , ensamblelo y enlacelo según el procedimento escrito en la
practica anterior. Ademas pruebe diferentes posibilidades de indicaciones al
ensamblador para la guia “CSEG SEGMENT PARA…”. Haga pruebas tambien sin definir
segmentos explicitos de pila (stack) ni de datos, pero siempre logrando que el programa
muestre el mensaje requerido.
Asignación
Contenido de la tarea:
1. Listado de ambos programas.
2. Escriba un programa equivalente en formato .EXE el programa mostrara un mensaje en
pantalla conteniendo los nombres de los autores en renglones a parte utilizando
interrupciones (sin acceder diretamente los chips de video).
3. Escriba el ejemplo .EXE en el formato de modelo pequeño para el programa
ensamblador turbo assambler TASM. Ensamble enlace y ejecute el programa.
4. Investigue como se han creado programas .COM en distintas versiones de DOS, corra
un ejemplo y muestre la ventanas en la cual se muestra la version de DOS y la corrida del
programa una sola, y comente los cambios si es que los hay.