guia 3

19
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.

description

programables

Transcript of guia 3

Page 1: guia 3

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

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

= : 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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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.