guía de laboratorio #3

14

Click here to load reader

Upload: jimmy-herrera

Post on 22-Dec-2015

21 views

Category:

Documents


5 download

DESCRIPTION

ASM

TRANSCRIPT

Page 1: Guía de Laboratorio #3

UNIVERSIDAD DE EL SALVADOR FACULTAD DE INGENIERIA Y ARQUITECTURA ESCUELA DE INGENIERIA ELECTRICA SISTEMAS DIGITALES PROGRAMABLES Guía de Laboratorio No. 3

Programación en Lenguaje Ensamblador 8086/88/286 en el ambiente DOS

Profesor: Ing. Ricardo E. Cortez Instructores:

3.0 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. 3.1 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. 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. 3.2 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.

Page 2: Guía de Laboratorio #3

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.

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

Page 3: Guía de Laboratorio #3

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: 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. 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é?

Page 4: Guía de Laboratorio #3

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 CALLEE PROC NEAR ……. ……. RET CALLEE 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,

Page 5: Guía de Laboratorio #3

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

Page 6: Guía de Laboratorio #3

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. 3.2.3 Directivas de Modo. El macroensamblador está diseñado para trabajar con lo 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. 3.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 [1] 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 [2]. Un programa .COM puede sobrepasar el limite 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 7: Guía de Laboratorio #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. 3.3.1 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 Poiner 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. 3.3.2 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 modulos se refieren. Ejemplo: Se puede tener dos archivos –llamados codigos o modulos fuente- con dos procedimientos, en eno 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 modulo fuente que hace la llamada le denominaremos modulo principal y al que es llamado le denominaremos modulo secundario. El formato para un modulo principal –el que contien el procedimiento principal a ejecutarse- , se muestra a ontinuacion: ; COMENTARIOS PAGE 50,132 ;OPCIONAL TITLE (INSERTE TITULO AQUI) ;OPCIONAL CSEG SEGMENT PARA PUBLIC `CODE`

Page 8: Guía de Laboratorio #3

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 observer lo siguiente: -Despues de la seccion de comentarios, una instrucción SEGMENT declara el inicio del segmento de codigo y el origen del programa se establece en la pocision 100H, se deja espacio dentro del segmento para el PSP del programa. Luego, con la instrucción ASSUME, se le dice al ensamblador que todos los segmentos del procesador estan referidos al segmento de codigo y dado que un segmento puede direcciopnar 64K, el programa efectivamente esta limitado a un espacio de 64K. Finalmente se crea el unico procedimiento del programa, que en este caso a sido denominado `codigo` , y se declara como procedimiento cercano (NEAR); todas las referncias se haran dentro del segmento. Por ultimo se escriben las instrucciones que le dan al final del programam. El formato para un modulo secundario tiene algunas diferncias y similitudes con el modulo prinipal. En primer lugar, el segmento debe tener el mismo nombre en ambos modulos y a diferncia del modulo principal, l modulo secundario no contendra en su directiva END, el inicio de la ejecución. Ademas de ello, el modulo secundario debe declarar como PUBLIC el procedimiento(ver seccion directivas). El formato para un modulo 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 3.4 Programa .EXE

Page 9: Guía de Laboratorio #3

Los programas .EXE son mas complejos y versatiles que los .COM ya que en vez de estar limitados a un unico segmento, los programas .EXE frecuentemente ocupan varios segmentos y pueden incluir mas de un segmento de codigo y de datos. El programa .EXE tiene un encabezamiento especial que es usado por la funcion 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 caracteristica, un programa EXE es almacenado como una imagen de memoria relocalisable. Los programas .EXE son mas flexibles que lños .COM y generalmente son mas grandes . Ellos tambien 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 De la comparacion de ambos formatos puede verse que el programa .EXE es mas complejo. En ambos el segmento de codigo es declarado de la misma forma; pero la instruccion ASSUME es diferente. En el formato .EXE se asignan diferentes valores para cada segmento. Cada registro apunta a una seccion 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 direccion en usualmete AX, el segundo paso es tranferir la direccion 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 direccion del segmento PSP. Las instrucciones. PUSH SD MOV AX,0 PUSH AX

Page 10: Guía de Laboratorio #3

Guardaran la direccion DS:00 en el stack. Ya que DS:00 es al direccion 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. 3.5 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 mas cortos que los archivo .EXE. b) Elos se cargan mas rapido que los archivos .EXE. c) Son mas faciles de escribir, debido a que no se inicializa el stack, el registro DS o ES.

Entre sus desventajas estan:

No pueden ser mas grandes que 64kbytes.

Pueden tener solo un segmento, y asi no proporcionan una separacion limpia entre datos e instrucciones.

No pueden acceder procedimientos o datos que esten en otros segmentos. Esto lo hace particularmente difícil al intentar usar modulos que fueron construidos por otros programadores.

3.6 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 interrumpio el programa que se estaba ejecutando. Existen tres tipos de interrupciones: RESET, interrupciones por hardware e interrupciones por software. Para los propositos 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 numero 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: 4.0 Coloca el contenido del registro de estado en el snack(la pila). 5.0 Limpia la bandera I y la bandera T. 6.0 Coloca el IP y el CS en el snack. 7.0 Carga el IP y el CS con los valores obtenidos del vector de interrupciones. Estas interrupciones por software pueden utilizarse a manera de subrutinas, donde la direccion de inicio de la subrutina, CS:IP, se esta almacenando en la tabla de vectores de interrupción. Es de sta 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 unicamente invocamos un servicio y este se encarga de controlar el hardware. Ademas, el uso de los servicios del sistema al proveer una interfaz entre el hardware y el software, permita una estandarisacion de los programas.

Page 11: Guía de Laboratorio #3

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 numericos de 8, 16 bits o las direcciones de estructura de datos mayores de 16 bits. Dependiendo de cual servicio se quiera invocar, se podria necesitar de algun 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 direccion segmento: offset (desplazamiento) de una cadena de caracters 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: 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:

Carga los registros con los valores apropiados: eneste caso el valor de 2 se carga en el registro AH para seleccionar la funcion 2 (salida de carácter por pantalla). El carácter “K” se carga en registro DL.

Generar la interrupción: el mnemonico INT es seguido por el valor 21H, el cual corresponde a una interrupción para obtener servicios del DOS.

Dado que la funcion 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 tambien para ilustrar una de las formas para obtener y pasar al DOS la direccion de elementos mayores de 16 bits se presenta el siguiente fragmento de codigo. ;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. Este fragmento de codigo utiliza la interrupción 21H, funcion 3DH para abrir un archivo. Esta funcion requiere que DS y DX contengan el segmnto y el desplazamiento (offset), respectivamente, de la ruta del archivo a abrir. Las primeras tres lineas del fragmento de codigo cargan los registros de acuerdo a lo anterior. La siguiente linea coloca el valor de C2H en el registro AL; este valor especifica el modo en elcual se abrira 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 codigo 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 proposito.

Page 12: Guía de Laboratorio #3

Entre los servicios mas utilizados en todos los programas estan los que tiene que ver con la E/S a travez de la pantalla. Tanto el BIOS como el DOS proporcionan estos servicios. La interrupción 10H tiene 16 opciones basicas, las cuales son controladas por lel registro AH en el momento de generar una interrupción. La opcion de modo (AH=0) determina tanto la rsolucion de la pantalla como el modo grafico disponible. Para una mejor descripción de cada funcion de la interrupción 10H y otras interrupciones del BIOS y el DOS consultar los libros 3,4,5 de la bibliografía. Una de las formas mas eficientes de utilizar estas interrupciones es colocandolas como macros en una librería de macros. De esta forma nuestros programas fuente seran compactos y legibles, lo cual faciulita su posterior depuración y modificacion.

3.7 Procedimiento de la practica

1.Escriba el programa .COM, ensamblelo y enlacelo según el procedimento escrito en la practica 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:

BIN PROGR.EXE PROGR.COM b) Imprima el codigo fuente y el archivo .LST creado por el ensamblador. c) Ejecute el programa.

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.

Contenido de la tarea: 1.Listado de ambos programas. 2.Escriba un programa equivalente en formato .EXE el programa mostrara un mensje 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.

Page 13: Guía de Laboratorio #3

3.8 Referncias Bibliograficas

Detman, therry: “DOS programers refernce”. Tannehaum a. s. ; “Sistemas operativos” Penn and Don Bruma: “80386 macroassembler and toolkit” Godfrey, Terry: “Lenguaje Ensamblador para computadoras IBM” Haskell, Richard E. : “IBM-PC 8088 assambly lenguaje programming”

APENDICE A

;PROGRAMA.EXE: NAME PRUEBA ;version de un archivo .EXE para una simple impresion CSEG SEGMENT PARA PUBLIC `CODE` ASSUME CS:CSEG,DS:DSEG,SS:STACK ;-------------------------------------Segmento de codigo------------------------------------------------------ CODIGO PRAC FAR MOV AX,DSEG ;Fijar segmento de datos MOV DS,AX MOV DX,OFFSET MENSAJE ;obtener posicion del mensaje MOV AH,9 ;mostrar el mensaje INT 21H CODIGO ENDP CSEG ENDS ;---------------------------------------Segmento de datos------------------------------------------------------ DESG SEGMENT PARA `DATA`

MENSAJE DB 'Experimento del programador' , 0DH, 0AH, '$'

DSEG ENDS ;---------------------------------------segmento de fila--------------------------------------------------------- STACK SEGMENT PARA STACK 'STACK' DB 20 DUP ('STACK') STACK ENDS END CODIGO

Page 14: Guía de Laboratorio #3

APENDICE B

;PROGRAMA.COM: NAME PRUEBA ;version de un archivo .COM para una simple impresion CSEG SEGMENT PARA PUBLIC `CODE` ORG 100H ;origen del programa ASSUME CS:CSEG,DS:CSEG,SS:CSEG,ES:CSEG ;----------------------------------procedimiento------------------------------------------------------ CODIGO PRAC NEAR MOV DX,OFFSET MENSAJE ;obtener posicion del mensaje MOV AH,9 ;mostrar el mensaje INT 21H MOV AL,0 ;codigo de retorno MOV AH,4CH ;terminar INT 21H CODIGO ENDP ;---------------------------------------Fin del procedimiento--------------------------------------------------------- MENSAJE DB 'Experimento del programador',0DH,0AH,'$' CSEG ENDS END CODIGO