Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

Unidad 3 PDF

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 269

Tabla de contenido

Contenido
Programación del microprocesador (primera parte)
Lenguajes de programación
Lenguajes de nivel bajo
Lenguajes de nivel medio
Lenguajes de alto nivel
Obtención de código objeto

Tipos de programación
Programación modular
Características de la programación modular
Ventajas de la programación mofdular
Programación estructurada
Programación concurrente
Programas concurrentes Programas
paralelos
Repertorio de instrucciones del lenguaje ensamblador
Instrucciones aritméticas
Instrucciones lógicas
Instrucciones de transferencia de datos
Instrucciones de bifurcación
Instrucciones de llamada a subrutina
Instrucciones misceláneas
Resumen
Bibliografía recomendada
Párrafo nexo
Autoevaluación formativa
Programación del Microprocesador (Primera parte)

Uno de los objetivos principales del curso de Lenguaje de Máquina es el desarrollo


de programas en lenguaje de máquina; este tipo de herramientas de desarrollo le
brindan al programador la posibilidad de obtener código eficiente cuando requiera
el control directo del hardware del sistema. El ingeniero puede optar por
desarrollar varios programas de un proyecto en lenguaje de máquina para obtener
eficiencia y, posteriormente, usar estos programas con aplicaciones desarrolladas
en lenguajes de alto nivel.

Aunque en el sentido estricto del término técnico, lenguaje de máquina se refiere a


codificar las órdenes del microprocesador directamente de la manera como son
entendidas por el dispositivo, para un ser humano es bastante complejo el
desarrollar aplicaciones usando esos códigos, por lo tanto el proceso que se sigue
es codificar las órdenes del microprocesador mediante símbolos que son más
asimilables por el programador y de esta manera obtener un código fuente
compuesto de fácil entendimiento. Este código fuente necesita ser ensamblado
para obtener el programa en lenguaje de máquina y así poder ser ejecutado por el
microprocesador.

En el presente fascículo veremos diferentes formas de crear programas, su


estructura y la forma como se obtiene el código objeto que será ejecutado por el
microprocesador. De las posibles formas de crear programas haremos énfasis
especial en el lenguaje ensamblador, ya que corresponde a la herramienta central
de este curso.
Indicadores de logro

Al terminar el estudio del presente fascículo, el estudiante:

• Determina los diferentes lenguajes en que es posible crear programas para


sistemas basados en microprocesadores y describe sus características.
• Describe los diferentes tipos de programación, determinando en qué caso o
para qué aplicación es factible usar cada uno.
• Determinar los tipos de instrucciones que se emplean en el lenguaje
ensamblador, e identificarlos en el repertorio de instrucciones del ensamblador
para microprocesadores INTEL 8086.

Lenguajes de programación

Un lenguaje de programación, corresponde a un conjunto de símbolos y reglas


que permiten crear estructuras complejas de órdenes que serán ejecutadas por un
sistema de cómputo. En este entorno existe un espectro de lenguajes que
disponen de diferentes características funcionales y brindan, al programador,
herramientas de desarrollo para aplicaciones específicas. En este espectro se
encuentran lenguajes de bajo nivel, lenguajes de nivel medio y lenguajes de alto
nivel.

Lenguajes de bajo nivel

Como se mencionó antes, estos lenguajes trabajan directamente con las


instrucciones del microprocesador pero codificadas en símbolos de fácil
entendimiento para el programador. A este tipo pertenece el lenguaje
ensamblador. Hay un lenguaje diferente para cada microprocesador, ya que
depende del repertorio de instrucciones que cada dispositivo tenga. Un programa
desarrollado en ensamblador es bastante eficiente, tanto en tiempo de ejecución
como en tamaño; por ello es usado en control de hardware y en sistemas de
tiempo real. Los primeros sistemas operativos eran desarrollados en ensamblador.

Lenguajes de nivel medio

Un lenguaje de nivel medio tiene la funcionalidad de un lenguaje de bajo nivel y la


facilidad de uso de un lenguaje de alto nivel. A este tipo pertenece el lenguaje C,
FORTH y los Macro ensambladores. Aunque también es catalogado como
lenguaje de alto nivel y como lenguaje de nivel medio, C permite la manipulación
de bytes y direcciones como si se tratara de ensamblador. El código de C es muy
portable y eficiente, por ello es usado actualmente para el desarrollo de sistemas
operativos y para la creación de interfaces de control de hardware.

Ladillo
La portabilidad significa que es posible adaptar el software escrito para un
tipo de computador a otro tipo de computador, es decir con ninguno o con
mínimos cambios es posible obtener código objeto para diferentes
arquitecturas con la misma funcionalidad.

Los macroensambladores permiten crear estructuras de control de manera similar


a lenguajes de alto nivel; estas estructuras se denominan macros; una macro
encapsula lenguaje ensamblador para brindar una mayor facilidad al programador
de crear y mantener código.
Lenguajes de alto nivel

Un lenguaje de alto nivel proporciona la mayor facilidad al programador para


desarrollar y mantener programas y la interfaz de usuario es bastante amigable;
en este tipo se encuentran lenguajes como Pascal, Fortran, Basic y Java.
Adicionalmente, se han desarrollado herramientas visuales que permiten un mejor
manejo del lenguaje, entre estas herramientas están Visual C++, Delphi, Visual
Basic, entre otras. Todos los lenguajes de alto nivel soportan el concepto de tipos
de datos; los tipos de datos más comunes son los enteros, los caracteres y los
reales.

Ladillo
Un tipo de datos define un conjunto de valores que puede tener una variable
junto con un conjunto de operaciones que se pueden realizar sobre esta
variable.

Obtención de código objeto

En cualquier lenguaje de programación se genera un archivo con las instrucciones


a ejecutar por el sistema de cómputo (código fuente); es necesario traducir estas
instrucciones a lenguaje de máquina (código objeto); este proceso se desarrolla de
manera diferente dependiendo del tipo de lenguaje con el que se haya
desarrollado el código fuente. A continuación vemos algunas herramientas
utilizadas para la de obtención de código objeto.
• Ensambladores: los símbolos de código en ensamblador contenidos en un
archivo fuente (*.ASM), deberán ser traducidos a lenguaje de máquina, para lo
cual usa un programa ensamblador, cuya función es convertir uno a uno cada
símbolo en su correspondiente instrucción de lenguaje de máquina; en este
paso se obtiene un archivo con código en hexadecimal (*.OBJ), el cual es
necesario encadenar mediante el programa correspondiente para obtener el
archivo ejecutable.

Figura 4.1, Proceso de ensamblado

Por lo general, en un proyecto de desarrollo en ensamblador, se generan


varios archivos ASM para brindar independencia a los módulos de software
que se definan en la arquitectura; cada archivo de código ASM se ensambla
por separado y posteriormente se encadenan todos los archivos OBJ para
obtener el programa ejecutable. En la figura 4.1 se ilustra este proceso.

Cada arquitectura de un sistema de cómputo tiene herramientas de


ensamblado y encadenado correspondientes, en el caso de la arquitectura de
PC, se dispone de las siguientes herramientas:

Ensambladores:
TASM: Turbo Assembler.
MASM: Macro Assembler.
Encadenadores:
TLINK: Turbo Linker.
LINK: Linker.

Si el código fuente se hace con macro (Nivel medio), se debe usar


necesariamente el ensamblador de macros (MASM), de lo contrario es
suficiente con el TMASM.

• Compiladores e Intérpretes: los términos compilador e intérprete se refieren a


la forma como se ejecuta un programa. En teoría, cualquier lenguaje de
programación puede ser compilado o interpretado, pero algunos se suelen
ejecutar en una forma o en la otra. Por ejemplo, BASIC normalmente es
interpretado y C normalmente es compilado. La forma como se ejecuta un
programa no viene definida por el lenguaje en el que fue escrito; los intérpretes
y los compiladores son programas que permiten ejecutar un programa fuente
de una manera determinada.

Un intérprete lee el código fuente línea a línea, ejecutando las instrucciones


específicas contenidas en esa línea. Un compilador lee el archivo completo de
código fuente y genera un archivo con código objeto. Cuando se usa un
intérprete, el código fuente debe estar presente cada vez que se quiere
ejecutar el programa, al igual que el interpretador, este proceso hace algo lento
el programa en ejecución. Cuando se usa un compilador, una vez generado el
código objeto ya no es necesario ni el código fuente ni la herramienta de
compilado para poder ejecutar el programa.
Tipos de programación

El desarrollo de programas para sistemas de cómputo implica técnicas de diseño,


con el objeto de facilitar su programación y depuración, así como el mantenimiento
correspondiente. A continuación veremos las técnicas de diseño de software más
usadas en el desarrollo de programas en ensamblador.

Programación modular

Se emplean una serie de técnicas para descomponer un programa grande,


complejo, en una serie de unidades más pequeñas llamadas módulos. Es la
técnica más usada en el desarrollo de programas en ensamblador.

Ladillo
Un módulo generalmente corresponde a funciones específicas de un
programa; cada función podrá probarse y codificarse individualmente
constituyendo un módulo.

La modularización se puede hacer bajo dos esquemas, en módulos unifuncionales


y en módulos multifuncionales.

• Modularización unifuncional: consiste en dividir el problema en módulos


funcionales (un módulo por función), procurando la independencia de los
módulos y que sea fácil de percibir la forma como ejecuta algo.

• Modularización multifuncional: consiste en definir unidades que agrupan varias


funciones.
Características de la programación modular

• Cada módulo tiene un solo punto de entrada y de salida.


• Los módulos se determinan sobre bases funcionales.
• No existe restricción sobre el uso de instrucciones de salto dentro de un
módulo.
• Un módulo puede ser de cualquier tamaño aunque, en la práctica, rara vez
tiene más de 400 instrucciones.

Ventajas de la programación modular

• Partición de un programa en partes independientes.


• Distribución de las tareas resultantes entre varios programadores.
• Facilidad para el desarrollo del producto final.
• Reducción del tiempo de desarrollo.
• Incremento en la productividad.
• Obtención de sistemas más flexibles.

Programación estructurada

Se emplea la misma técnica de descomposición modular, pero en este código se


evita el uso de saltos directos que rompen la secuencia normal del programa
(equivalente al "go to" en BASIC). En este caso se hacen siempre llamados a
subrutinas.
Se ha establecido, que cualquier programa con una entrada y una salida puede
escribirse usando las tres estructuras siguientes posibilitando eliminar la
instrucción de salto "goto".

• Secuencial: las instrucciones se ejecutan en el orden escrito.


• Alternativa: se usan instrucciones de decisión con condicionales.
• Repetitiva: se hace uso de ciclos con finalización condicionada.

Programación concurrente

Es una técnica aplicada para el desarrollo de programas en sistemas de tiempo


real, los cuales presentan muchos puntos de entrada y salida. También pueden
implicar más de un procesador realizando tareas compartidas.

Ladillo
Se entiende un sistema de tiempo real, como aquel compuesto por un
conjunto hardware y software que se relaciona y responde a ciertos cambios
en el mundo real que interactúa con éste, a una escala temporal dictada por
sus necesidades. La velocidad de respuesta es tal, que el sistema puede
afectar sensiblemente el equipo controlador.

Se entiende por concurrencia la invocación simultánea real o aparente de una


misma función. Un sistema admite concurrencia a nivel de procesos cuando es
posible conmutar la ejecución de código de uno a otro proceso sin que el primero
haya finalizado, pero en cualquier instante de tiempo sólo se ejecuta código de un
proceso.
Otro concepto importante involucrado en programación concurrente es el de
paralelismo, que implica la posibilidad de ejecutar varios procesos en un mismo
instante (simultaneidad real); para ello es estrictamente necesario el empleo de
sistemas multiprocesador.

En programación concurrente podemos tener dos tipos de programas: programas


concurrentes y programas paralelos.

Programas concurrentes

Pueden considerarse constituidos por procesos secuenciales que son ejecutados


simultáneamente. Si un programa concurrente tiene un error que hace que un
proceso cambie variables de otro proceso en forma impredecible, entonces tal
programa dará resultados diferentes cada vez que se ejecute con los mismos
datos.

Programas paralelos

Las operaciones de los procesos ocurren de modo simultáneo realmente, no


necesitan reaccionar con la misma exigencia de tiempo real y requieren de la
existencia de varios procesadores.

Repertorio de instrucciones del lenguaje ensamblador

Vamos a centrarnos, ahora, de manera detallada en el lenguaje ensamblador, ya


que éste es la herramienta fundamental del presente curso. Como se indicó en
líneas anteriores, cada microprocesador tiene su grupo de códigos de lenguaje
ensamblador, sin embargo se puede, de manera general, definir las directivas de
este lenguaje haciendo alusión a un microprocesador genérico. En el fascículo
siguiente nos ocuparemos del lenguaje ensamblador específico para los
microprocesadores INTEL de la familia 8086.

Se pueden identificar siete categorías de instrucciones del lenguaje ensamblador,


las cuales indicamos a continuación:

• Instrucciones aritméticas
• Instrucciones lógicas
• Instrucciones de transferencia de datos
• Instrucciones de bifurcación
• Instrucciones de llamada a subrutina
• Instrucciones misceláneas

Instrucciones aritméticas

Estas instrucciones corresponden a las operaciones aritméticas de suma, resta,


incremento, decremento y comparación; algunos procesadores incluyen también
instrucciones de multiplicación y división, aunque no es el caso general.

Se presentan varios modos de realizar este tipo de operaciones, según sea la


ubicación de los operandos; estos modos pueden ser: inmediato, sobre registros e
indirecto sobre registros.

• Inmediato: en éste modo las operaciones realizan entre el registro acumulador


y un dato. Por ejemplo: ADD AX, 23H, significa que se le está sumando el valor
23 en hexadecimal al valor contenido en el registro AX (acumulador).
• Sobre registros: en este modo, las operaciones se realizan entre el valor
contenido en el registro acumulador y el valor contenido en otro registro; el
resultado de la operación queda en el registro acumulador. En algunos casos
se pueden realizar operaciones entre valores contenidos en registros diferentes
al acumulador.

• Indirecto sobre registro: en este modo, uno de los registros índice, apunta a
la posición de memoria que contiene el valor de uno de los operandos, el otro
operando se encuentra en un registro. Por ejemplo, el registro SI contiene el
valor 7324H, si se efectúa la operación ADD AL, [SI], significa que se está
sumando el valor contenido en la posición de memoria 7324H al valor
contenido en el registro AL. Como el acceso a uno de los operandos se hace
vía un apuntador, se le conoce a este modo como indirecto.

Actividad 4.1:

Elabore una tabla con las instrucciones aritméticas efectuadas por el


microprocesador 8086 de INTEL, agrupándolas según la clasificación anterior.

Instrucciones lógicas

Estas instrucciones permiten efectuar operaciones lógicas entre registros o entre


un registro y un dato o de manera indirecta entre un registro y una posición de
memoria apuntada por un registro índice. En este grupo están incluidas las
operaciones AND, OR, OR exclusiva, complemento (NOT) e instrucciones de
desplazamiento circular. La mayoría de estas instrucciones se realizan con el
acumulador.
Las instrucciones de desplazamiento circular, permiten rotar la información
contenida en un registro bit a bit ya sea a la derecha o hacia la izquierda.

Actividad 4.2

Elabore una tabla con las instrucciones lógicas que puede ejecutar el
microprocesador INTEL 8086, con la misma clasificación de la actividad 4.1.

Instrucciones de transferencia de datos

Estas instrucciones permiten transferir datos entre registros, entre registros y


posiciones de memoria, hacer carga de datos a registros, permitir la entrada y
salida de datos. La mayoría de los programas contienen más instrucciones de
transferencia de datos que otros tipos de operaciones. En este grupo se
encuentran muchas instrucciones, ya que los datos pueden ser transferidos de
cualquier posición de memoria o registro a cualquier posición de memoria o
registro. Los microprocesadores con más registros internos, tienen más
instrucciones de transferencia de datos.

Como en los casos anteriores, los microprocesadores disponen de varios modos


para las instrucciones:

• Transferencia entre registros: se hace de registro a registro.


• Transferencia inmediata: se carga un dato a un registro.
• Transferencia directa: se hace entre registros y posiciones de memoria.
• Transferencia indirecta: se hace entre un registro y una posición de memoria
apuntada por un registro índice.
Actividad 4.3

Elabore una tabla con las instrucciones de transferencia de datos del


microprocesador 8086 teniendo en cuenta la clasificación anterior.

Instrucciones de bifurcación

Son aquellas que permiten cambiar el rumbo en la secuencia de las instrucciones,


como resultado de una decisión tomada a partir del resultado de una operación.
Estas instrucciones equivalen a las estructuras IF y CASE de los lenguajes de
nivel medio y de alto nivel. También son llamadas de transferencia de control y,
básicamente, corresponden al salto que se hace en el programa.

En este grupo existen instrucciones de salto incondicionales y condicionales; las


condicionales dependen del resultado de una operación y para efectuar o no el
salto se verifica el estado del registro de banderas una vez se ha efectuado la
operación, de tal manera que se produce salto si el resultado de una operación es
cero (Z), si el resultado de una operación genera carry (C), etc. Cuando se
produce un salto lo que se hace es carga el apuntador de instrucciones o contador
de programa con el valor de la dirección de memoria de destino del salto.

Actividad 4.4

Elabore una tabla con las instrucciones de control de programa del


microprocesador 8086.
Instrucciones de llamada a subrutina

Tal como se vio en las técnicas de diseño de software en ensamblador, es


recomendable la división de un programa en bloques funcionales; para ello el
lenguaje dispone instrucciones que permiten agrupar otras instrucciones en
bloques o unidades funcionales llamadas subrutinas. Estas son las instrucciones
de llamado y retorno de subrutina.

La instrucción de llamada (CALL) guarda el contenido del contador de programa


(dirección de la próxima instrucción a ejecutarse) en la pila y carga el contador de
programa con la dirección de inicio de la subrutina, transfiriendo el control de
ejecución a las instrucciones de la subrutina.

La instrucción de retorno (RETURN) de la subrutina recupera de la pila la posición


de memoria en donde se encontraba ejecutando el programa cuando llamó la
subrutina y continúa la ejecución normal del programa. Siempre un llamado a
subrutina debe ir acompañado de un retorno de subrutina.

Instrucciones misceláneas

Son otras instrucciones que funcionalmente no están cobijadas por los tipos
anteriormente mencionados; pueden existir varias dependiendo del
microprocesador. De manera general las otras instrucciones que puede disponer
un microprocesador son:

• Acceso a la pila: Mediante las instrucciones PUSH y POP se guardan y


recuperan datos de la pila.
• Instrucción de parada de la CPU: HALT, deja la CPU en un estado de no-
operación constante, de este estado se sale mediante una interrupción.

• No Operación: NOP, la CPU no hace ninguna operación durante un ciclo de


máquina, es especial para hacer retardos o temporizadores.

Actividad 4.5

Determine qué otras instrucciones misceláneas existen en el repertorio de


instrucciones del microprocesador 8086 y explique su función.

Resumen

Las órdenes de un sistema basado en microprocesadores (sistema de cómputo),


se pude programar en varios lenguajes; cada lenguaje proporciona diferentes
facilidades al programador, dependiendo de la aplicación que quiere desarrollar;
estos lenguajes se pueden clasificar en lenguajes de nivel bajo, lenguajes de nivel
medio y lenguajes de nivel alto; a medida que sube el nivel, se le facilita más al
programador el entendimiento y desarrollo de programas.

Además de los lenguajes de programación, el desarrollo de software requiere de


una metodología o estrategia de diseño; actualmente existe una gran cantidad de
herramientas de diseño, especificación y desarrollo para lenguajes de alto nivel,
pero para lenguajes de nivel medio o de bajo nivel no hay herramientas
especializadas, por ello se plantean algunas técnicas básicas de desarrollo con el
fin de lograr software de buena calidad. Estas técnicas determinan que el software
en ensamblador se puede diseñar de manera modular, estructurada o
concurrente. El modelo que se seleccione está íntimamente ligado a los
requerimientos de la aplicación que se desea desarrollar.

Al interior del lenguaje ensamblador se pueden identificar varios tipos de


instrucciones; desde el punto de vista funcional, es importante conocer la
estructura básica de cada grupo de instrucciones para hacer desarrollos o estudiar
programas de manera eficaz.

Bibliografía recomendada

Tokheim Roger L. Fundamentos de los microprocesadores. México: McGraw Hill,


1998.

Brey Barry B. Los microprocesadores INTEL. México: Prentice Hall, 1994.

Stallings William. Organización y arquitectura de computadores. España: Prentice


Hall, 2000.

Abel Peter. Lenguaje ensamblador y programación para el PC IBM y compatibles.


México: Pearson Educación, 1996.

Nexo

En el siguiente fascículo continuaremos con el estudio del lenguaje ensamblador


pero, esta vez, centrado en los microprocesadores INTEL de la familia 8086.
Veremos la manera de crear un programa en ensamblador, la forma como se
ensambla, se encadena y se ejecuta.
Autoevaluación formativa

Para la elaboración de un programa en ensamblador es de vital importancia el


conocimiento de la arquitectura del microprocesador que se va a tratar, en
especial los registros y luego determinar las operaciones que se van a desarrollar
con esos registros.

Elabore un documento que contenga la arquitectura (estructura y organización)


interna del procesador 8086 haciendo énfasis especial en los registros internos y
adjúntele las instrucciones que determinó en las actividades del presente
fascículo.
Lenguaje de máquina
Semestre 6
Fascículo No. 5

Tabla de contenido
Contenido
Programación del microprocesador (segunda parte)
Introducción
Formato de las instrucciones de lenguaje ensamblador
Identificador
Operacion
Operandos
Comentarios
Directivas del lenguaje ensamblador
Estructura del código fuente
Ensamblado de un programa fuente
Enlazado de un programa objeto
Ejecución de un programa
Resumen
Bibliografía recomendada
Párrafo nexo
Autoevaluación formativa
Programación del microprocesador (segunda parte)

Tal como se definió en el fascículo 4, el lenguaje ensamblador le brinda al


programador un nivel más alto de codificación que el lenguaje de máquina
propiamente dicho, ya que se utilizan instrucciones simbólicas en lugar de
instrucciones de máquina y nombres descriptivos para los elementos de datos y
para las localidades de memoria. Un programa escrito en lenguaje ensamblador
debe cumplir con un conjunto estricto de reglas que después usa el programa de
ensamble o traducción para convertir el programa en ensamblador, en código de
máquina.

En el presente fascículo se presentan las reglas básicas que requiere un programa


escrito en lenguaje ensamblador, de tal manera que se tratará la presentación
formal del código fuente, se definirá el formato general de codificación, las
directivas de impresión del listado de programa y las directivas para definir
segmentos y procedimientos. Es también alcance de trabajo del presente fascículo
la organización funcional del programa, en el que se incluye la inicialización y
terminación de su ejecución.

Indicadores de logro

Al finalizar el estudio del presente fascículo, el estudiante:

• Aplica reglas básicas definidas en la codificación de un programa en


ensamblador para procesadores INTEL 8086.
• Identifica la estructura de un programa en ensamblador y aplica estos criterios
en el desarrollo de sus propios programas.
• Compila, enlaza y ejecuta un programa básico en ensamblador.
• Hace el análisis de programas básicos codificados en ensamblador.
Formato de las instrucciones de lenguaje ensamblador

Las instrucciones de lenguaje ensamblador son símbolos que representan de


manera mnemotécnica los códigos en lenguaje de máquina de las órdenes que
entiende y ejecuta el microprocesador.

La mayoría de ensambladores define dos tipos de instrucciones: los enunciados y


las directivas. Los enunciados son los mnemónicos propiamente dichos que
representan una instrucción de lenguaje de máquina y las directivas son
indicadores para el programa ensamblador, en el cual se le dictan parámetros de
ensamblado, definición de datos u otras acciones específicas propias del
ensamblador que se esté tratando.

Para cualquiera de los casos antes mencionados, las instrucciones en


ensamblador tienen el siguiente formato:

Figura 5.1 Formato de un enunciado en ensamblador

Cada línea de código con la estructura anterior, puede llegar hasta 512 caracteres
de longitud; como separador de parámetros se usa un espacio en blanco o un
tabulador. A continuación se presentan ejemplos de cada caso:

VARIABLE DB 1 ; Ejemplo de directiva.


RUTINA ADD AX, DATO ; Ejemplo de instrucción.
Identificador

Un identificador es un nombre que se le aplica a elementos del programa; los dos


tipos de identificadores son el nombre que se le asigna a una directiva y la
etiqueta que se asigna a la posición de memoria en la que se encuentra
almacenada una instrucción. Los nombres se usan a menudo para definir
variables y constantes del programa y las etiquetas son referencias para saltos o
para llamados a subrutinas.

Un identificador puede estar conformado por las letras del alfabeto, los dígitos del
0 al 9, signos de interrogación, carácter de subrayado, el signo $, el signo de
arroba y el punto (un punto no puede ser el primer carácter). En el lenguaje
ensamblador no hay distinción entre letras mayúsculas o minúsculas.

Operación

Corresponde a las instrucciones o a las directivas del lenguaje. En el primer caso


los tipos de instrucciones se definieron en el fascículo anterior, en cuanto a las
directivas, se tratarán más adelante.

Operandos

Los operandos son parámetros que no siempre son requeridos en una línea de
código en ensamblador. Si es requerido, proporciona la información para la
operación que se efectúa sobre él. Para un elemento de datos (constante o
variable), el operando identifica el valor inicial. Para una instrucción, un operando
indica en dónde realizar la acción; una instrucción puede tener uno o dos
operandos o ninguno, depende del tipo de operación. A continuación se pueden
observar algunos ejemplos de tipos directivas e instrucciones con sus respectivos
operandos.

Ejemplos de directivas:

RESULTADO DB 0 ; Define una posición de memoria y la inicializa en cero


CONTADOR DB 1 ; Define una posición de memoria y la inicializa en uno
Ejemplos de instrucciones:
NOP ; Instrucción sin operandos
INC AX ; Instrucción con el operando contenido en el registro AX
ADD AX, 0 ; Instrucción con dos operandos

Comentarios

Los comentarios corresponden a la documentación que se hace sobre la


funcionalidad del programa, dado que en lenguaje ensamblador las estructuras de
código resultantes no son muy dicientes sobre lo que hace, es necesario hacer
una buena documentación de cada línea de código. Todos los comentarios en
ensamblador empiezan por punto y coma (;), de tal forma que el ensamblador
omite todo lo que se encuentre a la derecha de un punto y coma. Un comentario
puede aparecer sólo en una línea de código o al final de una instrucción.

Observación
Una convención general es codificar todas las instrucciones y sus operandos en
mayúsculas y los comentarios en minúsculas, con el fin de darle mayor claridad al
código.
Directivas de lenguaje ensamblador

Como se mencionó antes, algunos enunciados se refieren a la forma como debe


trabajar el programa ensamblador, las cuales se llaman directivas. Estas actúan
sólo en el momento del ensamblado y no generan código de máquina. A
continuación se definen algunas directivas, a lo largo del curso veremos más
directivas de las aquí mencionadas.

• PAGE: Se coloca siempre al inicio del programa, designa el número máximo de


lineas por página y el número máximo de caracteres por línea, el formato es
como sigue:
PAGE [longitud],[ancho]
• TITLE: Se usa para imprimir un titulo en la segunda línea de cada página de
código. Va sólo al inicio del programa, su formato es:
TITLE Texto a imprimir en la segunda línea de cada pagina

• SEGMENT: Se usa para determinar los segmentos de código, datos y de pila


en un programa EXE. Cada segmento comienza por el nombre del segmento
seguido de la directiva SEGMENT más el tipo de segmento, y termina con la
directiva ENDS, fin de segmento, el formato es como se indica a continuación.

NOMBRE SEGMENT [Opciones] ;Inicio de segmento


-
-
-
NOMBRE ENDS ;Fin de segmento
Ladillo
Un segmento tiene un tamaño máximo de 64K, para un programa EXE es
necesario definir los segmentos que se usan, para un programa COM no es
requerido, ya que consta de sólo un segmento.

Observación
El nombre de un segmento debe estar en presente, ser único y cumplir con las
convenciones para nombres del lenguaje.

Un segmento tiene tres tipos de opciones: alineación, combinación y clase, y


su codificación se hace según el siguiente formato:

NOMBRE SEGMENT alineación combinación 'clase'

Alineación: Indica el límite en el que inicia un segmento en memoria. Si se


aplica PARA, la dirección de inicio de un segmento es divisible por 16.

Combinación: Indica si se combinan un segmento con otros segmentos del


mismo tipo cuando son enlazados después de ensamblar. Los tipos de
combinación son STACK, COMMON, PUBLIC y AT.

Clase: Define la clase de segmento que se está tratando, ya sea de datos


('data'), de código ('code') o de pila ('stack'); la clase debe estar entre
comillas simples para poder ser interpretada por el ensamblador.

• PROC: Define un procedimiento (subrutina) dentro de un segmento de código,


un procedimiento inicia con el nombre del procedimiento seguido de la directiva
PROC y finaliza con el nombre del procedimiento seguido de la directiva
ENDP. El inicio de un procedimiento puede ir acompañado del operando FAR,
lo que le indica al sistema operativo que allí comienza la primera instrucción del
programa; es una forma de indicar cuál es la subrutina principal del programa.
La codificación de estas directivas se hacen como sigue:

CODIGO SEGMENT PARA 'code' ;Inicio de segmento


PRINCIPAL PROC FAR ;Inicio de procedimiento
-
-
-
PRINCIPAL ENDP ;Fin de procedimiento
CODIGO ENDS ;Fin de segmento

• ASSUME: Esta directiva permite asociar el registro SS de pila, DS de datos y


CS de código con el área de memoria definida para ello en un programa
específico. El formato de esta directiva es como sigue:

ASSUME SS: PILA, DS: DATOS, CS: CODIGO

• END: Esta directiva finaliza todo el programa, se usa como parámetro de esta
directiva el nombre del procedimiento definido como FAR (procedimiento
principal. El formato es como se indica a continuación:

END PRINCIPAL

• DB: Directiva para la definición de un dato (variable) de uno o más bytes de


longitud. La variable así definida puede contener datos numéricos, caracteres o
cadenas, quien lleva el control sobre el tipo de dato que se está tratando es el
programador, ya que para el ensamblador todas las operaciones son válidas.
Algunos ejemplos de ellos son:
DATO1 DB ? ;Define una variable de un byte
DATO2 DB 32 ;Define una variable de un byte y le asigna un dato en decimal
DATO3 DB 20H ;Define una variable de un byte y le asigna un dato en hexadecimal
DATO4 DB 10010110B ;Define una variable de un byte y le asigna un dato en binario
DATO5 DB 15 DUP (0) ;Define variable de 15 bytes y le asigna cero
DATO6 DB ´FUSM' ;Define variable tipo cadena y le asigna 'FUSM'
DATO7 DB ´lun', 01, 'mar', 02, 'mie', 03, jue', 04, 'vie', 05, 'sab', 06, 'dom', 07
;Define una tabla de días y su numero

• DW: Cumple el mismo papel de DB pero en este caso define variables de una
o más palabras (words), un word consta de dos bytes. Algunos ejemplos de su
formato son:

PALABRA1 DW ? ;Define un word y no lo inicializa


PALABRA2 DW 0FFFFH ;Define un word y lo inicializa con un dato en hexadecimal
PALABRA3 DW 20 DUP (0) ;Define 20 words y los inicializa con cero.

• DD: Define variables de uno o más palabras dobles, cada palabra doble consta
de 4 bytes. La sintaxis es muy similar al DB y DW.

• DF: Define una palabra larga de 6 bytes, se usa a partir del 8086 y
procesadores posteriores.

• DQ: Define elementos que tienen una longitud de cuatro palabras (8 bytes), se
pueden definir uno o más elementos, cada uno con una longitud de 8 bytes.

• DT: Define elementos de diez bytes de longitud, su propósito está relacionado


con el almacenamiento de datos binarios codificados en decimal (BCD), que
son más útiles para coprocesadores matemáticos que para operaciones
aritméticas estándar.
Actividad 5.1

Hacer ejemplos de definición de elementos de datos para cada directiva de


asignación de datos antes mencionadas y determinar el número de bytes que
queda definido para cada elemento.

• EQU: Esta directiva no define elementos de datos, define valores constantes,


que el ensamblador utilizará para sustituir en otras instrucciones, por ejemplo:

MAXIMO EQU 60 ;El valor 60 de ahora en adelante se llamara MAXIMO.

El valor antes definido puede ser usado en otras partes del programa como si se
tratara del dato inicial así:

MOV CX, MAXIMO ;Carga en CX el valor cosntante MAXIMO.

De esta manera el ensamblador buscará todos los términos MAXIMO y los


reemplazará por su valor correspondiente en el momento del ensamblado.
• Estructura del código fuente

Inicialmente vamos a tomar como estructura de un programa fuente la definida


para un programa EXE, ya que se trata de la más general. Un programa fuente
está constituido por sus segmentos de pila, datos y código; éstas partes deben
quedar completamente definidas en el código haciendo uso de las directivas y la
documentación correspondiente. A continuación se presenta un ejemplo con la
estructura general de un programa en ensamblador.

PAGE 60, 132


TITLE Estructura de un programa en ensamblador
;-------------------------------------------------------------------------------------------------
Programa: estructura.asm
Autor: M. L.
Fecha de inicio: Diciembre 2001.
Función: Sirve como ejemplo de la estructura general de un programa en
Ensamblador.
;-------------------------------------------------------------------------------------------------

;-------------------------------------------------------------------------------------------------
; Definición del segmento de pila
;-------------------------------------------------------------------------------------------------
PILA SEGMENT PARA STACK 'stack'
DW 32 DUP(0);Define 32 palabras (64 bytes)
PILA ENDS ;Fin del segmento de pila

;-------------------------------------------------------------------------------------------------
; Definición del segmento de datos
;-------------------------------------------------------------------------------------------------
DATOS SEGMENT PARA 'data'
VARIABLE DB 123 ; Define una variable de un byte
DATOS ENDS ;Fin del segmento de datos
;-------------------------------------------------------------------------------------------------
; Definición del segmento de código
;-------------------------------------------------------------------------------------------------
CODIGO SEGMENT PARA 'code'

PRINCIPAL PROC FAR ;Inicio de procedimiento


ASSUME SS: PILA, DS: DATOS, CS: CODIGO
MOV AX, DATOS ;AX apunta al segmento
MOV DS, AX ;DS apunta a DATOS
MOV AL, VARIABLE ;Carga AL con VARIABLE
ADD AL, VARIABLE ;Suma VARIABLE con AL
MOV VARIABLE, AL ;Guarda dato en VARIABLE
MOV AX, 4C00H ;Salida al DOS
INT 21H ;Invoca subrutina del DOS
PRINCIPAL ENDP ;Fin de procedimiento

CODIGO ENDS ;Fin del segmento de datos


END PRINCIPAL ;Fin de programa
;-------------------------------------------------------------------------------------------------
Ensamblado de un programa fuente

El paso de ensamble consiste en la traducción del código fuente en código objeto


y la generación de un archivo intermedio .OBJ (objeto), o módulo. En ensamblador
calcula las longitudes de cada segmento de datos y de código. Este archivo no es
aún ejecutable, ya que es necesario determinar si forma parte o no de un proyecto
que involucre varios módulos OBJ.

El proceso de ensamble se lleva a cabo con los programas MASM.EXE de


Microsoft o TASM.EXE de Borland. Desde la línea de comandos del DOS se
introduce la siguiente línea para ensamblar un archivo fuente.

C:\>MASM [opciones] fuente.asm [,objeto] [,listado] [,referencias]


ó
C:\>TASM [opciones] fuente.asm [,objeto] [,listado] [,referencias]

Cada parámetro de las líneas antes indicadas define:

• Opciones: estipula características de configuración del ensamblador a nivel de


mensajes de advertencia.
• Fuente: es el nombre del archivo fuente, por convención debe tener la
extensión asm.
• Objeto: estipula el nombre y ubicación del archivo con el código OBJ, si no se
indica ninguno se asume que es el mismo nombre y ubicación del archivo
fuente pero con extensión obj.
• Listado: estipula un archivo .list, que contiene tanto el código fuente como el
código objeto. Si se indica ninguno se asume el mismo nombre y ubicación del
código fuente con extensión lst.
• Referencias: estipula el nombre y ubicación de un archivo que contiene un
listado de los símbolos usados en el programa y su valor; si no se indica se
asume el mismo nombre y ubicación del archivo fuente con extensión crf.

Ejemplo

C:\>TASM prueba.asm

Actividad 5.2

1. Desde la línea de comandos del DOS digitar MAS ó TASM y determinar qué
parámetros pide el programa.
2. Codificar el programa presentado como ejemplo de estructura general y
ensamblarlo. Luego abrir cada archivo que genera el ensamblador con un
editor de texto y verificar su contenido. ¿Qué archivo no es posible editar?,
¿por qué?.

Enlazado de un programa objeto

Luego de ensamblar un programa, el siguiente paso es enlazarlo; esto implica


convertir el módulo OBJ en un programa ejecutable. El enlazador realiza las
siguientes funciones:

• Si se pide, combina más de un módulo OBJ y genera un sólo programa


ejecutable; los programas OBJ se pudieron haber generado mediante un
ensamblador o mediante un compilador de C.
• Genera un módulo EXE y lo inicializa con instrucciones especiales para facilitar
su carga y ejecución por el sistema operativo.
El encadenado se puede realizar entrando la siguiente línea de comando desde el
shell del DOS.
C:\>TLINK objeto.obj
ó
C:\>LINK objeto.obj

El encadenador abre los archivos definidos en la línea de comando y genera un


archivo ejecutable, además genera un archivo .map que indica la ubicación
relativa y el tamaño de cada segmento.

Actividad 5.3

Encadenar el programa ensamblado en la actividad anterior, verificar los archivos


generados, abrir el archivo .map y estudiar su contenido.

Ejecución de un programa

Una vez ensamblado y encadenado el programa, el último paso es cargar el


archivo para su ejecución. El proceso de carga completa las direcciones
incompletas que se encuentran en el encabezado del archivo EXE, luego se
desecha el encabezado y crea un PSP antes de cargar el programa en memoria.

Para ejecutar el programa basta con teclear su nombre desde la línea de comando
del DOS, en ese instante se da lugar al proceso de carga y ejecución del mismo.
Resumen

Un programa en ensamblador consta de directivas e instrucciones; mediante éstas


se puede construir el código requerido. Las directivas definen parámetros de
configuración y de definición de datos, las cuales sólo conciernen al ensamblador
y no generan código en lenguaje de máquina. Las instrucciones corresponden a
los códigos del lenguaje de máquina del microprocesador y una vez ensambladas
corresponden a las instrucciones que se ejecutarán.

Un programa en ensamblador debe corresponder con una estructura bien definida,


la más general está constituida por los segmentos de pila, datos y código. Una vez
codificado un programa, es necesario ensamblar el programa fuente y encadenar
los módulos objeto resultantes para obtener un programa ejecutable.

Bibliografía recomendada

Tokheim Roger L. Fundamentos de los microprocesadores. México: Mc Graw Hill,


1998.

Brey Barry B. Los microprocesadores INTEL. México: Prentice Hall, 1994.

Stallings William, Organización y arquitectura de computadores. España: Prentice


Hall, 2000.

Abel Peter, Lenguaje ensamblador y programación para el PC IBM y compatibles.


México: Pearson Educación, 1996.
Nexo

En el siguiente fascículo se desarrollarán más programas en ensamblador y se


aprenderá a usar el DEBUG del DOS como herramienta de depuración de este
tipo de programas. Mediante el DEBUG es posible ejecutar paso a paso cada
instrucción de un programa y determinar el estado de los registros en cada paso.
Autoevaluación formativa

Hacer un programa en ensamblador que sume dos números definidos en dos


variables de dos bytes cada una. El resultado se debe guardar en una tercera
variable. Ensamblar el código fuente, encadenar el código objeto y ejecutar el
programa. Verificar el contenido de los demás archivos generados en cada paso
del proceso.
Lenguaje de Máquina
Semestre 6
Fascículo No. 6

Tabla de Contenido
Contenido
Depuración de un programa desarrollado en ensamblador
El programa DEBUG
Comandos del DEBUG
Sintaxis de los comandos del DEBUG
Uso del DEBUG
Verificación de posiciones de memoria
Despliegue de datos
Verificación del equipo instalado en el sistema
Verificación del tamaño de la memoria
Verificación de otros datos importantes
Ejecución de un programa simbólico
Introducción de un programa en ensamblador
Creación y almacenamiento de un programa en ensamblador con
DEBUG
Resumen
Bibliografía recomendada
Párrafo nexo
Autoevaluación formativa
Depuración de un programa desarrollado en ensamblador

El mayor inconveniente que encuentran los principiantes de programación en


ensamblador es la falta de facilidades para depurar el software en desarrollo, ya
que el ambiente de trabajo es parecido a una caja negra, en la cual se puede
hacer muy poco por determinar lo que sucede al ejecutar cada instrucción. No
sucede lo mismo con los ambientes de trabajo de lenguajes de alto nivel como C o
Pascal, y menos en los ambientes de trabajo de lenguajes visuales como Delphi o
C++ Builder. En estos casos se dispone de herramientas poderosas de depuración
y seguimiento del programa diseñado y recién creado.

Para suplir esta falencia es necesario el aprendizaje de algunas funciones del


programa DEBUG, incluido en el paquete de comandos del DOS. Esta es una
poderosa herramienta que permite hacer el seguimiento de programas a muy bajo
nivel; aunque es compleja de manejar, nos brinda toda la funcionalidad necesaria
para llevar a feliz término programas desarrollados en ensamblador. En el
presente fascículo se estudian algunas de las funciones del DEBUG con miras a
que el estudiante use este programa en la depuración de programas escritos en
lenguaje ensamblador.

Indicadores de logro

Al finalizar el estudio del presente fascículo, el estudiante:

• Usa el programa DEBUG, como herramienta para la depuración de programas


desarrollados en ensamblador.
• Visualiza datos en memoria con el objeto de hacer seguimiento de procesos
ejecutados por la CPU.
• Introduce datos directamente en memoria para fijar condiciones iniciales de los
programas a probar.
• Verifica algunos datos del PC presentes en memoria, como fecha y hora,
estado de apuntadores, etc., con el objeto de controlar eventos a ejecutar por
el computador.

El programa DEBUG

El DEBUG es un programa incluido en el grupo de aplicaciones del DOS. Se utiliza


para probar y depurar programas ejecutables, sin importar el lenguaje de
programación en el que se hayan codificado. Con el DEBUG es posible ejecutar
un programa paso a paso, verificando el resultado de cada instrucción en memoria
o en los registros del procesador.

Ladillo
Los DEGUGERS (depuradores), son herramientas que brindan las funciones
necesarias para hacer el seguimiento paso a paso de las ejecución de un
programa.

Comandos del DEBUG

El programa DEBUG tiene una gran cantidad de comandos que brindan


versatilidad en la depuración de programas; sin embargo no todos son necesarios
para cubrir los objetivos de este curso, por lo tanto a continuación presentamos los
comandos requeridos por el momento. Si el estudiante lo considera podrá verificar
el resto de comandos del DEBUG en la aplicación de ayuda del DOS.
COMANDO DESCRIPCIÓN

A Ensamblar instrucciones simbólicas y pasarlas a código de máquina.


D Mostrar el contenido de un área de memoria.
E Introducir datos en memoria, iniciando en una localidad específica.
G Ejecutar un programa que se encuentra en memoria.
N Dar nombre a un programa.
P Ejecutar un conjunto de instrucciones.
Q Salir de la sesión.
R Mostrar el contenido de los registros.
T Hacer el seguimiento de la ejecución de una instrucción.
U Traducir código de máquina a código en ensamblador.
W Guardar un programa.

Sintaxis de los comandos del DEBUG

Los comandos se pueden escribir en mayúsculas o minúsculas de manera


indistinta, cada parámetro se separa por un espacio. En el siguiente ejemplo se
indica la manera como se pueden redactar los comandos.

a) D DS: 200
b) DDS : 200
c) dds : 200

En el ejemplo a), se utiliza el comando "D" para desplegar el contenido de la


posición 200H del segmento de memoria apuntado por el registro DS (Data
segment). El ejemplo b), tiene el mismo efecto del ejemplo a), al igual que el
ejemplo c). Los dos puntos (:) se usan para conformar el conjunto segmento
desplazamiento que apunta a una dirección específica de memoria, tal como lo
vimos en fascículos anteriores.
Observación
Los datos numéricos ingresados como parámetro en el DEBUG, son asumidos en
formato hexadecimal.

Uso del DEBUG

Se debe buscar en el directorio que contenga todos los programas del DOS; por lo
general se encuentra en (C:\DOS) o (C:\WINDOWS\COMMAND). En este
directorio se debe ejecutar el comando "DEBUG", en seguida debe aparecer un
guión (-), el cual indica que el programa está en ejecución y listo para recibir
comandos.

Verificación de posiciones de memoria

En la depuración de programas, es necesario verificar posiciones de memoria para


determinar si el resultado de las operaciones efectuadas por el procesador
corresponde con el programa diseñado y codificado por el operador. Con el
DEBUG es posible verificar el contenido de las localidades de memoria de interés,
mediante el comando "D" (display), el cual despliega ocho líneas de 16 bytes cada
una indicando el contenido en hexadecimal y ASCII.

Despliegue de datos

El formato de despliegue se presenta en tres columnas. La primera columna


muestra la dirección en hexadecimal del primer byte desplegado de 16, el formato
de la dirección es de la forma (segmento: desplazamiento). La segunda columna
muestra el contenido de 16 bytes de memoria en formato hexadecimal; cada byte
está separado por un espacio. La última columna muestra la información
anteriormente descrita en formato ASCII.

DIRECCIÓN REPRESENTACIÓN EN HEXADECIMAL ASCII


XXXX:0000 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx x ... x
XXXX:0010 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx x ... x
XXXX:0020 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx x ... x
XXXX:0030 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx x ... x
XXXX:0040 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx x ... x

Ejemplo 6.1

A continuación se digitará el comando correspondiente para desplegar la


información contenida en la posición de memoria 100H del segmento 40H.

- D 40:100 [Presionar Enter]

Una vez digitado el comando deben aparecer 8 líneas de respuesta con el


contenido de 16 bytes a partir de la posición 100H del segmento 40H, tal como se
indica a continuación:

-D 40:100
0040:0100 00 00 07 00 00 00 40 00-00 A0 00 00 4C 2B 00 C0 ......@.....L+..
0040:0110 80 02 80 02 E0 01 08 10-01 08 01 04 00 18 01 00 ................
0040:0120 00 00 DF 02 25 02 3F 1B-FF 54 F6 0F 08 17 18 1C ....%.?..T......
0040:0130 00 00 00 00 00 00 00 00-0A 0A 0A 2E 7F 02 C0 9F ................
0040:0140 70 6A 00 F0 FF FF FF FF-C3 E2 00 F0 70 6A 00 F0 pj..........pj..
0040:0150 70 6A 00 F0 54 FF 00 F0-79 EA 00 F0 21 EA 00 F0 pj..T...y...!...
0040:0160 A5 FE 00 F0 87 E9 00 F0-70 6A 00 F0 70 6A 00 F0 ........pj..pj..
0040:0170 70 6A 00 F0 70 6A 00 F0-57 EF 00 F0 53 FF 00 F0 pj..pj..W...S...
Actividad 6.1

Desplegar la información contenida en varias localidades de memoria del


segmento 40.

Verificación del equipo instalado en el sistema

Como se vio en fascículos anteriores, en el proceso de arranque del equipo, se


hace el reconocimiento del hardware instalado; cuando son detectados
determinados dispositivos, se almacena en memoria su información para
posteriormente ser usados por el software correspondiente. Los dispositivos a los
que se hace referencia son, entre otros, los puertos de entrada/salida de datos, ya
sean seriales o paralelos, unidades de disco flexible y controladores de video.

La forma de determinar qué dispositivos encontró el proceso de arranque, es


verificando el contenido de la posición de memoria correspondiente; esta posición
de memoria se encuentra en el área de datos del BIOS, en las localidades 410H y
411H, correspondiente a la dirección 40:10 en formato segmento desplazamiento.
A continuación se verificará el contenido de estas posiciones:

- D 40:10 [Presionar Enter]

Los dos primeros bytes de información obtenidos se deben invertir, y luego


convertirlos a binario, con el objeto de obtener la información correspondiente a
los dispositivos instalados en el sistema. Los 16 bits obtenidos de la conversión
antes propuesta indican si cierto dispositivo está o no presente en el sistema, de
tal manera que si se lee el dato 23H y C4H respectivamente, al invertir los bytes
quedarían como C4H y 23H, cuyo correspondiente valor en binario sería: (1100
0100 0010 0011), la información leída debe aparecer como:

-d 40:10
0040:0010 23 C4 FE 80 02 92 10 20-00 00 20 00 20 00 0D 1C #...... .. . ...

Al hacer la conversión a binario, cada bit asume un determinado significado


dependiendo de su ubicación; por lo tanto se debe hacer una tabla de la manera
indicada a continuación:

BIT 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
DATO 1 1 0 0 0 1 0 0 0 0 1 0 0 0 1 1

Con este dato se deducen los dispositivos instalados según la siguiente tabla:

BITS DISPOSITIVO
15,14 Número de puertos paralelos; el valor se encuentra codificado en binario, de tal manera
que si se lee el dato 10, significa que hay dos puertos conectados.
13,12 Reservados.
11,10,9 Números de puertos seriales conectados. Si se lee el dato 011, significa que hay tres
puertos conectados.
8 Reservado.
7,6 Número de unidades de discos flexibles, en donde:
00 = 1, 01 = 2, 10 = 3, 11 = 4.
5,4 Modo de video, en donde:
01 = 40x25 a color
10 = 80x1225 a color
11 = 80x1225 monocromático
2,3 Reservados.
1 Indica si hay coprocesador matemático.
0 Indica si hay unidad de disco flexible presente.
Actividad 6.2

Determinar los datos obtenidos de la posición 410H y 411H y verificar los


dispositivos que se encuentran conectados en su equipo de acuerdo con la
nomenclatura antes descrita.

Verificación del tamaño de memoria

Otra de las tareas que realiza el proceso de arranque de un PC es la de verificar


la cantidad de memoria que tiene el equipo conectado. Este valor se encuentra
también almacenado en el área de datos del BIOS en las localidades 413H y
414H. Por lo tanto para verificar la cantidad de memoria que tiene un equipo basta
con digitar el comando:

- D 40:13 [Presionar Enter]

Los datos resultantes de los bytes 413H y 414H se deben invertir para obtener el
valor equivalente de kilobytes de memoria, el valor leído se encuentra en
hexadecimal por lo tanto hay que hacer la conversión a decimal.

Ejemplo 6.2

Si se leen los valores 00 10, al invertirlos quedaría 10 00, que en decimal


corresponde 4096 lo que indica que el sistema tiene 4.096 kbytes (4MB).
Actividad 6.3

Determinar, por el método anteriormente descrito, la cantidad de memoria que


tiene su computador.

Verificación de otros datos importantes

De la misma manera como se determinaron los datos anteriores, es posible


obtener la información de otros parámetros importantes para la operación del
equipo; entre ellos:

• Verificación del número de serie y derechos reservados, en la posición de


memoria FE00:0.
• Verificación de la fecha, posición de memoria FFFF:5.
• Verificación del modelo de PC, en la posición de memoria FFFF:E.

Actividad 6.4

Verificar los datos contenidos en las posiciones de memoria del punto anterior y
determinar su significado.

Ejecución de un programa simbólico

A nivel de DEBUG, se trabaja directamente sobre el lenguaje de máquina; es


decir, sobre los códigos correspondientes a cada instrucción, de tal manera que es
posible ingresar y ejecutar instrucciones de lenguaje de máquina. Este proceso no
es muy útil para los programadores que no conozcan estos códigos en detalle. Por
lo tanto nos ocuparemos, en esta sección, de ingresar y ejecutar instrucciones en
directamente en ensamblador.

Ladillo
Un programa simbólico se refiere a aquel codificado en mnemónicos o lo
que es igual en lenguaje ensamblador.

Introducción de un programa en ensamblador

Mediante el comando A del DEBUG, es posible ingresar directamente


instrucciones en lenguaje ensamblador a la memoria del PC, en el segmento de
código apuntado por el registro CS, en el desplazamiento indicado. Para esto se
deben efectuar los siguientes pasos:

• Definir el desplazamiento en el segmento de código:

-A 100 [Presionar Enter]

El ingresar el comando anterior, debe aparecer la siguiente información:

14A5:0100

En donde 14A5 es el número del segmento apuntado por el registro CS y 0100


es el desplazamiento dentro de ese segmento.

• A continuación se puede ingresar el programa deseado en lenguaje


ensamblador línea por línea, como se muestra a continuación:

14A5:0100 MOV AL,32 [ENTER]


14A5:0102 MOV BL,64 [ENTER]
14A5:0104 ADD AL,BL [ENTER]
14A5:0106 NOP [ENTER], [ENTER]
14A5:0107

• Al oprimir dos veces seguidas la tecla [ENTER], el DEBUG se sale del

comando A. En este punto es posible verificar el código de máquina


correspondiente al programa antes digitado mediante el comando U
(Desemsamblar). La respuesta al comando U debe aparecer tal como se indica
a continuación, el valor 100 indica la posición de memoria inicial y 106 indica la
posición de memoria final.

-U 100,106
14A5:0100 B032 MOV AL,32
14A5:0102 B364 MOV BL,64
14A5:0104 00D8 ADD AL,BL
14A5:0106 90 NOP

• Una vez efectuada la anterior verificación, es posible hacer la ejecución del


programa. Inicialmente se introduce "R" para desplegar los registros y la
primera instrucción; el resultado a este comando debe ser como se indica a
continuación:

-R
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=14A5 ES=14A5 SS=14A5 CS=14A5 IP=0100 NV UP EI PL NZ NA PO NC
14A5:0100 B032 MOV AL,32

• Para la ejecución de cada instrucción (de cada línea de programa), es


necesario ingresar el comando "T"; en cada paso se verá el contenido de los
registros; luego de ejecutar esa instrucción, se debe continuar hasta terminar el
programa. Para el ejemplo, al digitar el comando T de manera consecutiva,
debe aparecer la siguiente información:
-T
AX=0032 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=14A5 ES=14A5 SS=14A5 CS=14A5 IP=0102 NV UP EI PL NZ NA PO NC
14A5:0102 B364 MOV BL,64
-T
AX=0032 BX=0064 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=14A5 ES=14A5 SS=14A5 CS=14A5 IP=0104 NV UP EI PL NZ NA PO NC
14A5:0104 00D8 ADD AL,BL

-T
AX=0096 BX=0064 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=14A5 ES=14A5 SS=14A5 CS=14A5 IP=0106 OV UP EI NG NZ NA PE NC
14A5:0106 90 NOP

Se debe notar el cambio del valor de los registros AX y BX luego de efectuar


cada operación.

• Si se desea ejecutar todo el programa en un solo paso, se debe digitar el


comando P.

Actividad 6.5

Usando el programa DEBUG, ingresar el código que ilustra a continuación y


ejecutarlo paso a paso. Hacer la descripción de los cambios que observa en los
registros luego de ejecutar cada instrucción.

MOV AL, AA
MOV AH, BB
MOV BX, 0
PUSH AX
POP BX
NOP

Creación y almacenamiento de un programa en ensamblador con DEBUG

Para crear, guardar, modificar o cargar un programa en ensamblador es necesario


tener en cuenta los siguientes pasos:

• Ejecutar el programa DEBUG.


• Mediante el comando A, ingresar cada una de las líneas del programa.
• Luego definir el nombre del archivo mediante el comando N, por ejemplo:
-N prueba.com
• Digitar el comando R BX y luego 0
• Determinar el tamaño del programa a guardar en bytes.
• Digitar el comando R CX y luego digitar el tamaño del programa a guardar en
bytes.
• Por último digitar el comando W para guardar.

Resumen

El programa DEBUG es una herramienta de gran utilidad para la depuración de


programas escritos en lenguaje ensamblador. A través de los comandos del
DEBUG es posible determinar el valor de una posición de memoria o de un
registro; también se puede ingresar un programa en ensamblador línea a línea,
verificarlo y ejecutarlo paso a paso y verificar el resultado de las operaciones en
los registros o en memoria.
Bibliografía recomendada

Tokheim Roger L. Fundamentos de los microprocesadores. México: Mc Graw Hill,


1998.

Brey Barry B. Los microprocesadores INTEL. México: Prentice Hall,1994.

Stallings William. Organización y arquitectura de computadores. España: Prentice


Hall, 2000.

Abel, Peter. Lenguaje ensamblador y programación para el PC IBM y compatibles.


México: Pearson Educación, 1996.

Nexo

Una vez visto el formato de las instrucciones del lenguaje ensamblador y habiendo
aprendido a depurar un programa en este lenguaje, podremos continuar con el
estudio de los tipos de instrucciones del procesador, haciendo una clasificación
general según la funcionalidad de éstas y desarrollando ejercicios más complejos.
Este será el tema del siguiente fascículo, cuyo objeto será aprender los tipos de
instrucciones que tiene el procesador y su aplicación.
Autoevaluación formativa

Mediante el programa DEBUG ingresar al sistema el programa desarrollado en la


Autoevaluación formativa del fascículo No. 5 y correrlo paso a paso. Explicar
los cambios que suceden en los registros del procesador, en cada paso ejecutado.
Lenguaje de Máquina
Semestre 6
Fascículo No. 7

Tabla de Contenido
Contenido
Instrucciones del microprocesador
Instrucciones del microprocesador
Instrucciones aritméticas
Instrucciones lógicas
Instrucciones de manipulación de datos
Instrucciones de manipulación de bits
Instrucciones de manipulación de cadenas
Instrucciones de comparación
Instrucciones de operaciones con las banderas
Instrucciones para operaciones con la pila
Instrucciones incondicionales para el control del programa
Instrucciones condicionales para el control del programa
Instrucciones para el control de ciclos
Instrucciones de entrada y salida de datos
Instrucciones de control del procesador
Modos de direccionamiento
Direccionamiento inmediato
Direccionamiento directo
Direccionamiento indirecto
Manipulación de registros y memoria
Movimiento de datos
Movimiento de datos entre operadores de longitud diferente
Intercambio de datos entre operadores
Inicialización de registros índices con una dirección
Toma de decisiones y control del programa
Transferencia de control
Saltos incondicionales (JMP)
Saltos condicionales (Jnnn)
Ciclos
Llamado a subrutinas
Llamado (CALL)
Regreso al punto en que fue invocada (RET)
Manipulación de datos binarios
Entrada y salida estándar de datos
Resumen
Bibliografía recomendada
Párrafo nexo
Autoevaluación formativa
Instrucciones del microprocesador

Los lenguajes de programación se caracterizan por la sintaxis de sus


instrucciones, la potencia de éstas en la ejecución de operaciones, además del
desempeño, la portabilidad y otros parámetros estrictamente funcionales que no
son del alcance de trabajo de este curso. Lo importante es indicar que un lenguaje
de programación consta de un conjunto de instrucciones y su sintaxis asociada,
elementos bien importantes en la etapa temprana del aprendizaje de un lenguaje.

En el presente fascículo se presentan de manera general los tipos de


instrucciones que componen el lenguaje ensamblador para procesadores de la
familia Intel 8086, se hace una clasificación funcional y se define el alcance de
trabajo de cada grupo; luego se ve, en detalle, la manera como se manipula
información entre registros, entre registros y memoria o entre registros, memoria y
datos directos.

También se presenta con cierto detalle la manipulación y el control del flujo de


ejecución de un programa, mediante instrucciones de salto, control de ciclos y
llamado a subrutinas.

Indicadores de logros

Al finalizar el estudio del presente fascículo, el estudiante:

• Identifica un buen repertorio de instrucciones de lenguaje ensamblador y puede


explicar su función, alcance de trabajo y aplicación.
• Concibe varias formas de ejecutar una misma operación empleando diferentes
tipos de instrucciones.
• Manipula datos inmediatos o contenidos en registros o memoria.
• Diseña, codifica, ensambla y prueba un programa que incluya control de flujo
de programa con saltos, ciclos y llamados a subrutinas.

Instrucciones del microprocesador

Como todo lenguaje de programación, en ensamblador existe un conjunto de


instrucciones o directivas, con las cuales se codifica un programa. Dada la
cantidad determinante de ellas, es necesario hacer una clasificación funcional, con
el fin de lograr conocer los alcances y posibles aplicaciones de cada grupo.

Es importante anotar que el conjunto de instrucciones y su funcionalidad es


exclusivo de cada procesador. Inclusive en procesadores de la misma familia
existen diferencias en cuanto al número y formato de las instrucciones. A
continuación se presenta una clasificación general de las instrucciones del
procesador 8086 con algunas instrucciones.

Instrucciones aritméticas

ADD. Suma de números binarios.


DEC: Decremento en 1.
DIV: División sin signo.
INC: Incremento.
MUL: Multiplicación sin signo.
NEG: Negación (complemento a 1).
SUB: Resta de valores binarios.
Instrucciones lógicas

AND: Operación lógica Y (conjunción).


NOT: Operación lógica NO (negación).
OR: Operación lógica O (Disyunción).
XOR: Operación lógica O exclusiva (Disyunción exclusiva).

Instrucciones de manipulación de datos

LEA: Carga una dirección efectiva de memoria en un registro.


LODS: Carga la dirección de inicio de una cadena en un registro.
MOV: Mueve datos entre registros y posiciones de memoria.
MOVS: Mueve cadenas.
XCHG: Intercambia datos entre registros.

Instrucciones de manipulación de BITS

RCL: Rota un bit a la izquierda teniendo en cuenta el acarreo.


RCR: Rota un bit a la derecha teniendo en cuenta el acarreo.
ROL: Rota un bit a la izquierda.
ROR: Rota un bit a la derecha.

Instrucciones de manipulación de cadenas

CMPS: Compara cadenas.


REP: Repite una cadena.
SCAS: Explora una cadena.
STOS: Almacena una cadena.

Instrucciones de comparación

TEST: Prueba de bit.


CMP: Compara.

Instrucciones para operaciones con banderas

CLC: Fija en cero la bandera de carry.


CLD: Fija en cero la bandera de dirección.
CLI: Fija en cero la bandera de interrupción.
STC: Fija en uno la bandera de carry.
STD: Fija en uno la bandera de dirección.
STI: Fija en uno la bandera de interrupción.

Instrucciones para operaciones con la pila

POP: Recupera un dato de la pila y lo remueve.


PUSH: Agrega un dato a la pila.

Instrucciones incondicionales de control de programa

CALL: Llamado a una subrutina.


INT: Generación (llamada) de una interrupción por software.
IRET: Regreso de interrupción.
JMP: Salto incondicional.
RET: Regreso de subrutina.

Instrucciones condicionales de control de programa

JA: Salta si es mayor.


JAE: Salta si es mayor o igual.
JB: Salta si es menor.
JBE: Salta si es menor o igual.
JC: Salta si hay carry.
JE: Salta si es igual.
JZ: Salta si es cero.
JG: Salta si es mayor.
JGE: Salta si es mayor o igual.
JL: Salta si es menor.
JLE: Salta si es menor o igual.
JNE: Salta si no es igual.
JNZ: Salta si no es cero.

Instrucciones de control de ciclos

LOOP: Repetir el ciclo mientras CX sea diferente de cero.

Instrucciones de entrada y salida de datos

IN: Entrada de un dato desde un puerto de hardware.


OUT: Salida de un dato por un puerto de hardware.
Instrucciones para el control del procesador

HLT: Detiene el procesador.


LOCK: Bloquea el bus.
NOP: No efectúa ninguna operación.
WAIT: Pone el procesador en estado de espera.

Actividad 7.1

Consultar el repertorio de instrucciones del procesador 80386 y completar la lista


anterior con las instrucciones faltantes. Determinar la función de las nuevas
instrucciones.

Modos de direccionamiento

La mayoría de instrucciones en lenguaje ensamblador trabajan con operandos, es


decir, con datos. Estos operandos varían en número dependiendo de la instrucción
específica y pueden ser: datos directos, datos contenidos en registros o datos
contenidos en memoria. Tal como se vio en fascículos anteriores, la sintaxis
general de estas instrucciones es:

Operación Operando 1, Operando 2

En donde el primer operando es el destino (registro o memoria) y el segundo


operando es la fuente de datos (datos directo, registro o memoria). A continuación
veremos la manera como se manipulan o direccionan estos datos dependiendo
del lugar en donde se encuentren.
Ladillo
Se le llama direccionamiento al proceso de ubicar y obtener un dato por
parte del procesador. Este paso lo realiza sobre los registros internos o
sobre posiciones de memoria.

Direccionamiento inmediato

Se hace direccionamiento inmediato cuando el segundo operando es un dato


directo, o un valor constante, con el cual se va a ejecutar una operación en
conjunto con el primer operando que tiene que ser un registro o una posición de
memoria, como por ejemplo las siguientes instrucciones:

Etiqueta Instrucción Comentario


DATO DB ? ;Variable de un byte.
MOV AX, 0 ;Carga el registro AX con cero.
ADD AX, 23H ;Suma 23H al registro AX.
MOV DATO, 0FFH ;Carga la variable DATO con FFH.
SUB BX, 55H ;Resta 55H al registro BX.

Direccionamiento directo

En este modo de direccionamiento, uno de los operandos hace referencia a un


registro y el otro a una localidad de memoria. Es importante indicar que no hay
instrucciones en las cuales los dos operandos sean posiciones de memoria; en
cambio son bastante comunes las instrucciones en las que los dos operandos son
registro, aunque en este caso no se hace ningún tipo de direccionamiento. Como
ejemplos de este tipo de acceso tenemos los siguientes:
Etiqueta Instrucción Comentario
DATO1 DB 0 ;Variable de un byte.
DATO2 DW 0 ;Variable de dos bytes.
TABLA DB 20 DUP 0 ;Define una tabla de 20 posiciones.
MOV AL, DATO1 ;Carga DATO1 en AL.
MOV BX, DATO2 ;Carga DATO2 en BX.
ADD CL, DATO1 ;Suma DATO1 a CL.
ADD DATO2, AX ;Suma AX, DATO2.
MOV BH, DS:[20H] ;Ver nota 1.
MOV AL, TABLA[8] ;Ver nota 2.
MOV AL, TABLA+8 ;Ver nota 3.

Nota 1: En esta instrucción se carga BH con el dato contenido en la dirección 20H


(desplazamiento) del segmento de datos apuntado por DS.

Nota 2: Esta instrucción carga el contenido de la posición 8 de la tabla en el


registro AL.

Nota 3: Esta instrucción es equivalente a la anterior.

Direccionamiento indirecto

En este tipo de acceso, los datos son apuntados por un registro índice, el cual
puede ser BX, DI y SI. Estos registros se asocian al registro apuntador de
segmento de datos DS, con el fin de apuntar a una posición específica de
memoria y efectuar operaciones sobre ella de manera indirecta. El registro índice
BP se asocia al registro SS con el fin de hacer operaciones sobre la pila.
Para indicar una dirección bajo este esquema, inicialmente se tiene que inicializar
el registro índice con la dirección (desplazamiento dentro del segmento de datos);
posteriormente, entre corchetes cuadrados, se apunta a la dirección antes cargada
con los desplazamientos requeridos.

Etiqueta Instrucción Comentario


TABLA DB 20 DUP 0 ;Definición de una TABLA.
MOV BX, OFFSET TABLA ;Inicializa registro índice
MOV [BX], 0 ;Carga cero TABLA
MOV [BX+1], 0 ;Carga cero en TABLA+1
MOV [BX+5], AL ;Carga AL en TABLA+5
MOV [BX+CX], AL ;Se pueden combinar registros

Cuando el primer operando contiene una dirección indirecta, el segundo operando


tiene que ser un registro o un dato inmediato. Cuando el segundo operando es
una dirección indirecta, el primer operando tiene que ser un registro. Cualquier
referencia a corchetes en los registros BX, DI, SI o BP implica un operando
indirecto y el sistema trata los contenidos de estos registros como un
desplazamiento de dirección.

Como se indica en los ejemplos anteriores, un desplazamiento se puede obtener


de la combinación de dos registros, así [BX+CX] indica que el desplazamiento al
que se está apuntado es el resultado de la suma del desplazamiento en BX más el
desplazamiento en CX.

Actividad 7.2

1. ¿Qué efecto tienen las dos operaciones siguientes en el operando de destino?.


MOV AX, 123H
MOV AX, [123H]

2. ¿La siguiente operación es posible? Si no lo es, ¿cuál es la razón?.


MOV [SI], [DI]

3. ¿La siguiente operación es posible? Si no lo es, ¿ cuál es la razón?.


MOV AL, 256H

4. ¿La siguiente operación es posible? Si no lo es, ¿cuál es la razón?.


MOV EAX, BX

Manipulación de registros y memoria

Las instrucciones más comunes en ensamblador son las encargadas de la


manipulación de datos en registros y memoria. Para estas funciones encontramos:
instrucciones de movimiento de datos (MOV), instrucciones de mover y llenar
(MOVZX), instrucciones de intercambio de información (XCHG), instrucción de
carga efectiva de memoria (LEA), instrucciones de incremento y decremento
(INC/DEC), entre otras.

Observación
Es importante que el estudiante se familiarice con estas instrucciones mediante la
codificación de pequeños programas o el estudio de ejemplos.
Movimiento de datos

El movimiento o transferencia de datos se efectúa entre dos operandos. El dato


contenido o referenciado por el segundo operando es copiado al primer operando,
de la instrucción. Las instrucciones de memoria que no son permitidas son las
efectuadas de memoria a memoria, las efectuadas de registro de segmento a
registro de segmento e inmediato a registro de segmento. La sintaxis de esta
instrucción es:

[Etiqueta:] MOV {registro/memoria},{registro/memoria}

Para determinar las operaciones válidas de instrucción podemos citar los


siguientes ejemplos:

Etiqueta Instrucción Comentario


MOV AX, 32H ;Inmediato a registro.
MOV MEMORIA, 32H ;Inmediato a memoria, directo.
MOV TABLA[BX], 32H ;Inmediato a memoria, indirecto.
MOV AX, BX ;Registro a registro
MOV DS, AX ;Registro a segmento
MOV MEMORIA, AL ;Registro a memoria, directo
MOV [BX], AX ;Registro a memoria, indirecto
MOV AH, MEMORIA ;Memoria a registro, directo.
MOV AL, TABLA[BX] ;Memoria a registro, indirecto.
MOV AX, DS ;Registro de segmento a registro.
MOV PALABRA, DS ;Registro de segmento a memoria.
Movimiento de datos entre operandos de longitud diferente

Para hacer transferencia de datos de fuentes de menor longitud a destinos de


mayor longitud, como por ejemplo de byte a word o de word a doble word, se
utilizan las instrucciones MOVSX para valores con signo, la cual copia los datos de
origen a destino y llena los bits restantes de la izquierda con el bit de signo. La
instrucción MOVZX copia los bits de información del origen al destino y los bits de
la izquierda restantes en el destino los llena con ceros. En el siguiente ejemplo se
puede ilustrar el efecto de cada movimiento según cada instrucción:

Byte -> Word Instrucción


1001 1100 -> 1111 1111 1001 1100 MOVSX
1001 1100 -> 0000 0000 1001 1100 MOVZX

Como ejemplos de instrucciones permitidas podemos citar los siguientes:

Etiqueta Instrucción Comentario


UNBYTE DB ? ;Variable de un byte.
UNWORD DW ? ;Variable de una palabra.
MOVSX AX, UNBYTE ;De byte a palabra con signo.
MOVZX BX, UNBYTE ;De byte a palabra sin signo.
MOVSX EAX, UNWORD ;De palabra a palabra doble.
MOVZX EBX, UNWORD ;De palabra a palabra doble.

Intercambio de datos entre operadores

El intercambio de datos entre operadores es otra operación frecuente en


instrucciones de lenguaje ensamblador: El formato general de la instrucción
XCHG encargada de esta función es como sigue:
[Etiqueta:] XCHG {registro/memoria},{registro/inmediato}

Es importante anotar que esta operación sólo es válida entre registros o entre un
registro y memoria. Como ejemplos podemos citar:

Etiqueta Instrucción Comentario


UNWORD DW ? ;Variable de una palabra.
XCHG AL, AH ;Intercambia un byte entre registros
XCHG CX, UNWORD ;Intercambio de una palabra.

Inicialización de registros índices con una dirección

Para la realización de operaciones con tablas, vectores o cadenas, es necesario el


uso de los registros índice que de manera indirecta apuntan a las direcciones de
memoria involucradas. Una forma de inicializar o cargar la dirección de
desplazamiento al registro índice se hace mediante la instrucción LEA, la cual
carga la dirección de desplazamiento de interés en el registro índice. El formato de
esta instrucción es:

[Etiqueta:] LEA {registro índice, dirección de memoria}

Esta instrucción permite inicializar los registros BX, DI o SI. Esta es una de las
operaciones más usadas en lenguaje ensamblador. Los siguientes ejemplos
ilustran algunas posibilidades de esta instrucción:
Etiqueta Instrucción Comentario
TABLA DB 20 DUP ? ;Tabla de 20 posiciones de un byte
LEA BX, TABLA ;Apunta BX a tabla
MOV [BX], 0 ;Carga cero en la posición cero
INC BX ;Incrementa apuntador
MOV [BX], 0 ;Carga cero el a posición uno

Actividad 7.3

1. Identifique la sintaxis y el uso de las instrucciones INC y DEC.

2. Diseñe, codifique en ensamblador, ensamble y pruebe un programa en formato


.COM que sume operandos obtenidos de manera directa, desde dos variables
tipo byte, y el resultado sea almacenado en una variable tipo palabra. Los
valores de los operandos son almacenados en memoria en el momento de
declarar las variables y la variable tipo palabra es inicializada con cero.

Toma de decisiones y control del programa

Hasta el momento los ejercicios propuestos corresponden a programas lineales,


en los cuales las instrucciones se ejecutan una vez, una después de la otra, según
el orden en que fueron escritas; la mayoría de programas son más complejos y
requieren de ciclos, saltos y llamadas a procedimientos. En lenguaje ensamblador
también existen instrucciones que proveen esta funcionalidad; con estas
instrucciones es posible tomar decisiones y efectuar determinadas operaciones
para cada caso.
Las etiquetas son los elementos indicadores que permiten redirigir el control del
programa, ya sea por los saltos, por los ciclos o por los llamados a subrutinas; en
los ejemplos siguientes veremos la importancia de las etiquetas en éstas
operaciones.

A continuación veremos las instrucciones que efectúan éstas funciones en


lenguaje ensamblador.

Transferencia de control

Las instrucciones de control de flujo del programa son las de salto, las cuales
rompen la secuencia normal y redirigen (bifurcan) la ejecución hacia una posición
determinada; los saltos pueden ser incondicionales o condicionales.

Saltos incondicionales (JMP)

Esta instrucción hace que el control del programa continúe en una determinada
posición de memoria apuntada por una etiqueta que se le pasa como argumento,
la etiqueta puede estar antes o después de la instrucción de salto. La sintaxis de
esta instrucción es:

[Etiqueta:] JMP Etiqueta de destino (desplazamiento)

Como ejemplo de esta instrucción podemos citar:

Etiqueta Instrucción Comentario


SALTO: ... ;Instrucciones
... ;Instrucciones
JMP SALTO ;Redirige el control hacia SALTO
... ;Instrucciones
JMP SIGUE ;Redirige el control hacia SIGUE
... ;Instrucciones
SIGUE: ... ;Instrucciones

Saltos condicionales (Jnnn)

En los saltos condicionales el procesador toma la decisión de efectuar o no el salto


al evaluar el estado de las banderas luego de una operación aritmética, lógica o de
comparación. De tal manera que existen instrucciones de salto específicas para
evaluar determinada condición, tal como si se generó o no carry, si el resultado fue
cero, o si el valor de un operando es mayor, igual o menor al valor del otro
operando. Entre estas instrucciones se encuentran JE, JZ, JNE, JNZ, JA, JB, etc.
El formato de estas instrucciones es, según lo siguiente:

[Etiqueta:] Jnnn Etiqueta de destino (desplazamiento)

Toda instrucción de salto condicional debe ir precedida de una comparación o una


operación lógica o aritmética que pueda afectar la bandera de interés.

Ciclos

Mediante las instrucciones de salto es posible realizar ciclos, aunque la


codificación de estos resulta más sencilla si se usa la instrucción LOOP. Esta
instrucción permite repetir la ejecución de un determinado grupo de instrucciones
el número de veces que indica el valor del registro CX. Cada vez que se ejecuta la
instrucción LOOP, se decrementa en uno el valor del registro CX y si éste no ha
llegado a cero, el control del programa continúa en la dirección descrita por la
etiqueta que está como parámetro de esta instrucción.

El formato general de esta instrucción es el siguiente:

[Etiqueta:] LOOP Etiqueta de destino (desplazamiento)

El uso común de esta instrucción es como se ilustra en el ejemplo siguiente:

Etiqueta Instrucción Comentario


MOV AL, n ;Inicializa AL con dato directo
MOV CX, 0AH ;Inicializa CX en cero
REPITE: ADD AL, n ;Suma el valor n al registro AL
LOOP REPITE ;Evalúa si repite o continúa.

En el ejemplo anterior el valor n es sumado diez veces o, lo que es equivalente, se


ha multiplicado el valor n por diez.

Llamadas a subrutinas

Un programa se puede codificar enteramente como un bloque con instrucciones


secuenciales, salto y ciclos; sin embargo, la depuración, el entendimiento y el
mantenimiento de un software escrito de esta manera es bastante complejo. Como
solución se plantea la subdivisión del programa en pequeñas tareas,
procedimientos, subrutinas o estructuras; de esta manera, tanto el diseño, como la
codificación y la depuración resultan más sencillas.
En ensamblador existen funciones que permiten el llamado a subrutinas y el
retorno del control de programa al lugar en donde fueron invocadas. La sintaxis
general de éstas instrucciones es:

[Etiqueta:] CALL Subrutina

[Etiqueta:] RET [inmediato]

Llamado (CALL)

El llamado a una subrutina se puede hacer dentro del mismo segmento (llamada
cercana) o en segmentos diferentes (segmento lejano); por ahora trataremos el
llamado cercano, en fascículos posteriores trataremos el llamado lejano. El
proceso que ejecuta el procesador al hacer el llamado a una subrutina es como
sigue:

- Disminuye el SP en dos posiciones y almacena la dirección de la siguiente


instrucción (apuntada por el IP) a ejecutar en la pila .
- Carga el IP con la dirección de inicio de la subrutina invocada.
- Continua la ejecución del programa.

Regreso al punto en que fue invocada (RET)

La instrucción RET permite regresar el control del programa al punto en que fue
invocada la subrutina; para ello el procesador ejecuta el siguiente procedimiento.

- Recupera el valor del IP almacenado en la pila.


- Incrementa el SP en dos.
- Continúa la ejecución del programa.

El ejemplo siguiente ilustra el llamado a una subrutina y su posterior retorno al


punto en donde fue invocada.

Etiqueta Instrucción Comentario


----------------------------------------------------------------------------------------------
TITLE PRUEBA ;Título
.MODEL SMALL ;
.STACK 64 ;Pila
.DATA ;Segmento de datos
----------------------------------------------------------------------------------------------
.CODE ;Segmento de código
INICIO: PROC FAR ;
... ;
CALL SUBRUT ;Llamado a subrutina
... ;
MOV AX, 4C00H ;Salida al DOS
INT 21H ;
INICIO ENDP ;
----------------------------------------------------------------------------------------------
SUBRUT PROC NEAR ;Subrutina
... ;
RET ;Retorno
SUBRUT ENDP ;
----------------------------------------------------------------------------------------------
END INICIO ;Fin de programa

Actividad 7.4

Elabore un paralelo entre las instrucciones de control de programa de lenguaje


ensamblador y las instrucciones de un lenguaje de alto nivel como C o Pascal.
Manipulación de datos binarios

La potencia del lenguaje ensamblador radica en poder manipular hasta el más


mínimo detalle los datos que están involucrados en las operaciones; de esta
manera es posible evaluar y modificar información a nivel de bit. Esta
manipulación se logra con las instrucciones lógicas y con las instrucciones de
corrimiento y rotación de bits.

Actividad 7.5

Identificar un ejemplo en el que se aplique cada uno de los tipos de instrucciones


de manipulación de bits antes mencionados. ¿Por qué es tan importante la
manipulación de bits en lenguaje ensamblador?

Entrada y salida estándar de datos

Siguiendo la arquitectura de un sistema mínimo basado en PC, las operaciones


antes descritas operan entre el procesador y la memoria, sin embargo un sistema
de este tipo requiere comunicarse con el medio exterior y compartir información.
Por lo tanto, requiere de operaciones que le permitan el ingreso y la salida de
datos a través de hardware especial para ello. La entrada y salida de información
se efectúa mediante las operaciones IN y OUT, a las cuales dedicaremos un
fascículo posterior.
Resumen

El lenguaje ensamblador consta de un conjunto amplio de instrucciones que


pueden ser agrupadas según su carácter funcional para obtener una mayor
facilidad en su aprendizaje y análisis; de esta manera podemos identificar
instrucciones para la manipulación de información, para el control de flujo de la
ejecución del programa, control del procesador y entrada y salida de datos. Cada
tipo de instrucciones tiene una sintaxis particular, la cual debe ser cuidadosamente
aplicada y revisada, ya que pequeños cambios en la codificación pueden generar
resultados radicalmente diferentes.

Bibliografía recomendada

Tokheim Roger L. Fundamentos de los microprocesadores. México: Mc Graw Hill,


1998.

Brey Barry B. Los microprocesadores INTEL. México: Prentice Hall, 1994.

Stallings William. Organización y arquitectura de computadores. España: Prentice


Hall, 2000.

Abel, Peter. Lenguaje ensamblador y programación para el PC IBM y


compatibles. México: Pearson Educación, 1996.

Nexo

En el fascículo siguiente emplearemos subrutinas del BIOS y del DOS para la


creación de programas más complejos y a la vez funcionales. Pondremos especial
interés en la entrada y salida de datos por teclado y pantalla respectivamente, con
el fin de brindar la posibilidad de crear programas interactivos entre el hombre y la
máquina; de esta manera se orientará el estudio del lenguaje ensamblador hacia
la solución de problemas reales.
Autoevaluación formativa

Diseñar, codificar, ensamblar y probar un programa en lenguaje ensamblador para


microprocesador 8086 de Intel que cumpla con los siguientes requerimientos,

1. Definir una tabla de datos que contenga los dígitos decimales en código ASCII.
2. Definir una tabla de datos vacía (sin inicializar) de 10 posiciones.
3. Crear una subrutina que, dado un dígito decimal codificado en ASCII, lo
convierta a código BCD.
4. El programa principal debe llamar mediante un ciclo a la subrutina antes
descrita para convertir todos los dígitos contenidos en la tabla de códigos
ASCII (fuente) y almacenar los resultados en la tabla vacía (destino).
5. Documentar al detalle la función que realiza cada línea de código.
Lenguaje de Máquina
Semestre 6
Fascículo No. 8

Tabla de Contenido
Contenido
Rutinas de servicio del BIOS y del sistema operativo (DOS)
Manejo de interrupciones
Atención de interrupciones de hardware.
Atención de interrupciones de software.
Interrupciones del BIOS
Interrupciones del DOS
Aplicaciones
Control del monitor
Control del teclado
Resumen
Bibliografía recomendada
Párrafo nexo
Autoevaluación formativa
Rutinas de servicio del BIOS y del sistema operativo (DOS)

El desarrollo de programas en lenguaje ensamblador le brinda al diseñador de


software la posibilidad de tener el control directo sobre el hardware, ya que las
instrucciones implican interacción directa con la memoria, los registros y los
dispositivos de entrada/salida. Aunque ésta es una gran ventaja para los
ingenieros de software orientados al desarrollo de aplicaciones que requieran la
interacción de hardware y software, es necesario que ellos conozcan de manera
precisa la arquitectura y organización del sistema hardware sobre el que van a
montar la aplicación, ya que necesitan conocer de manera puntual el mapa de
memoria, el mapa de periféricos, la forma como se acceden y programan los
periféricos, entre otras cosas. Por lo tanto cuando este conocimiento no es del
todo completo, se pueden presentar inconvenientes en el momento de brindarle
cierta funcionalidad al sistema, sobre todo en las operaciones de entrada/salida.

En el caso de la plataforma de hardware basada en un PC, tanto el BIOS del


sistema, como el DOS le brindan al programador una serie de funciones de bajo
nivel que encapsulan el control directo del hardware y brindan de manera
transparente un acceso fácil a los diferentes dispositivos del sistema. Esta
funcionalidad es independiente de la organización de cada PC, por lo tanto los
programas desarrollados serán completamente portables entre las diferentes
organizaciones de la arquitectura IBM.

En el presente fascículo haremos una aproximación a las funciones provistas tanto


por el BIOS como por el DOS, como antesala para posteriores desarrollos.
Veremos dichas funciones y su utilidad con el fin de poder estudiarlas más a fondo
en los fascículos siguientes.
Indicadores de logro

Al finalizar el estudio del presente fascículo, el estudiante:

• Explica la forma como se generan y atienden las interrupciones en un sistema


controlado por microprocesadores.
• Determina la diferencia entre las interrupciones generadas por software y las
generadas por hardware.
• Identifica las funciones provistas tanto por el BIOS como por el DOS, para el
acceso a dispositivos de entrada salida.
• Emplea instrucciones de lenguaje ensamblador para el llamado de funciones
del BIOS y del DOS.
• Crea programas en ensamblador en los que aplica la entrada y salida básica
de datos, usando funciones del BIOS y del DOS.

Rutinas de servicio del BIOS y del sistema operativo (DOS)

Dado que el acceso de dispositivos de entrada/salida es bastante complejo para


los diseñadores de aplicaciones finales de usuario, los PC brindan a los
programadores ciertas facilidades de control de dispositivos como el monitor,
teclado, los puertos seriales y paralelos, y las unidades de almacenamiento
secundario, entre otros. Estas facilidades se proveen mediante subrutinas que
encapsulan todo el control y la programación de muy bajo nivel, de tal manera que
el acceso para la entrada y salida de datos sea sencilla para el programador e
independiente de la configuración específica de cada equipo.

Las subrutinas del BIOS y del DOS para el acceso a dispositivos de entrada/salida
se invocan mediante la instrucción INT, tratada en la sección siguiente. Las
subrutinas en mención proporcionan diferentes servicios de acceso a dispositivos,
los cuales se solicitan pasando el valor que identifica a cada servicio en el registro
AH.

Manejo de interrupciones

Una interrupción es un evento que requiere de la atención inmediata del


procesador; estos eventos pueden generarse por software o por hardware.
Cuando el evento se genera por software, se hace el llamado de determinada
subrutina mediante la instrucción INT como respuesta a condiciones definidas en
el flujo del programa. Una interrupción es generada por hardware cuando por un
puerto de entrada se dan las condiciones predeterminadas por el diseñador del
sistema para que la CPU atienda eventos de manera inmediata. Cada dispositivo
habilitado para generar interrupciones se designa con una identificación; cuando
uno de ellos interrumpe se detecta la identificación y basado en ésta se invoca una
subrutina de servicio de interrupción para que atienda el dispositivo específico.

En cualquiera de los dos casos anteriores, cuando se genera una interrupción, el


procesador ejecuta un proceso similar al llamado de una subrutina (ver fascículo
No. 7). En este caso, al presentarse la interrupción, la CPU termina de ejecutar la
instrucción que se encuentre procesando en ese instante, luego almacena la
dirección de la siguiente instrucción a ejecutarse en la pila, a continuación carga el
IP con la dirección de la subrutina de servicio de interrupción y continúa la
ejecución. Una vez terminada finaliza la subrutina de servicio de interrupción, se
devuelve el control al programa principal mediante la instrucción de retorno de
interrupción correspondiente.
Atención de interrupciones de hardware

La cantidad de dispositivos que pueden generar interrupciones depende de la


arquitectura de cada procesador. Igualmente cada tipo de CPU determina los tipos
de interrupciones que maneja, la forma de atenderla y define prioridades entre
ellas. La mayoría de procesadores maneja dos tipos de interrupción según la
prioridad; éstas son las interrupciones enmascarables y no enmascarables; las
primeras se pueden deshabilitar por software mediante una instrucción, la
segunda no se puede deshabilitar, por lo tanto corresponde a la de mayor
prioridad dentro del sistema.

El proceso general de atención a una interrupción generada por hardware es como


sigue:

• El dispositivo que genera la interrupción fija una señal determinada en uno de


los pines del microprocesador; en el pin INTR para interrupciones
enmascarables y NMI para interrupciones no enmascarables. De esta manera
se fija una condición de interrupción.
• Cuando el microprocesador concluye de ejecutar la instrucción en curso, pasa
a determinar si una interrupción está activa. Si está presente una condición de
interrupción, continúa con el proceso de atención a interrupción.
• El procesador salva el contenido del registro de banderas en la pila.
• Se activan las banderas de interrupción (IF) y de trampa (TF). Esto inactiva el
pin INTR con el fin de que no se presenten más interrupciones.
• Se salva el contenido del registro (CS) de segmento de código en la pila.
• Se salva el contenido del apuntador de instrucciones (IP) en la pila.
• Se recupera el contenido del vector de interrupciones (dirección de la subrutina
de servicio de interrupción), el cual depende de la identificación del dispositivo
que está interrumpiendo y se pasa al IP y al CS en caso de ser necesario (para
llamados a subrutinas fuera del segmento de código del programa principal),
de modo que la siguiente instrucción se ejecute en el procedimiento de servicio
de la interrupción direccionado por el vector.
• Una vez terminado el procedimiento de servicio de interrupción, mediante la
instrucción de retorno de interrupción (IRET) se devuelve el control al programa
principal, recuperando de la pila la dirección previamente salvada y se pasa al
IP y al CS.

Observación
Recuerde que una dirección de memoria que contiene una instrucción se
conforma por el contenido del registro código (CS) desplazamiento dado por el
apuntador de instrucciones (IP), conformando el formato
[segmento:desplazamiento].

Atención a interrupciones de software

En estado de procesamiento normal, mediante la instrucción INT se interrumpe el


proceso y se accede a una tabla de servicios de interrupción en memoria para
determinar la dirección de la subrutina deseada. Una vez se determina la dirección
de la subrutina correspondiente, el control de la CPU es entregada al BIOS o al
DOS para que efectúe la acción requerida y regresa el control al programa
principal. Este proceso, más en detalle, se explica a continuación:

• En el flujo normal del programa se ejecuta una instrucción INT.


• El procesador salva el contenido del registro de banderas en la pila.
• Se activan las banderas de interrupción (IF) y de trampa (TF). Con esto se
inhabilita el reconocimiento de otras interrupciones.
• Se salva el contenido del registro (CS) de segmento de código en la pila.
• Se salva el contenido del apuntador de instrucciones (IP) en la pila.
• Permite que la operación solicitada sea realizada.
• Una vez terminado el procedimiento de servicio de interrupción, mediante la
instrucción de retorno de interrupción (IRET) se devuelve el control al programa
principal recuperando, de la pila, la dirección previamente salvada y se pasa al
IP y al CS.

Observación
La tabla de vectores de interrupción, contiene las direcciones de las subrutinas del
BIOS y del DOS disponibles para ser usadas por el programador. La posición de la
tabla es fija y se encuentra en memoria baja, pero su contenido es variable
dependiendo de la ubicación de las subrutinas en mención.

Interrupciones del BIOS

El BIOS contiene un extenso conjunto de rutinas de entrada/salida y tablas que


indican el estado de dispositivos del sistema. En este fascículo trataremos las
subrutinas que pueden ser invocadas por los programas de usuario mediante la
instrucción INT; éstas son:

• INT 00H: División por cero. La invoca el procesador cuando hay un intento de
división por cero, su función es mostrar un mensaje de error.
• INT 01H: Ejecución paso a paso. Usado por los depuradores como el
DEBUG para permitir avanzar paso a paso en la ejecución de instrucciones de
un programa bajo prueba.
• INT 02H: Interrupción no enmascarable. Usada cuando se presentan
condiciones graves de error en el hardware.
• INT 03H: Punto de ruptura. Se usa por los programas depuradores para
detener la ejecución de un programa en cierto punto.
• INT 04H: Desbordamiento. Lo invoca el sistema por causa del
desbordamiento en el resultado de una operación aritmética.
• INT 05H: Impresión en pantalla. Permite imprimir el contenido de la pantalla.
• INT 08H: Reloj del sistema. Corresponde a la subrutina de servicio para una
interrupción de hardware que actualiza la hora del sistema y la fehca si es
necesario. El dispositivo temporizador genera la interrupción cada 54.9254
mseg, es decir se generan alrededor de 18.2 interrupciones por segundo.
• INT 09H: Interrupción del teclado. Se genera al presionar o soltar una tecla
en el teclado.
• INT 0BH: Control del puerto serial COM1. Controla el puerto indicado.
• INT 0CH: Control del puerto serial COM2. Controla el puerto indicado.
• INT 0DH: Control del puerto paralelo LPT2. Controla el puerto indicado.
• INT 0EH: Control de la unidad de disco flexible. Señala la operación del
dsico flexible, como la terminación de una operación de entrada/salida.
• INT 0FH: Control del puerto paralelo LPT1. Controla el puerto indicado.
• INT 10H: Despliegue en video. Proporciona los servicios necesarios para el
despliegue de información en el monitor.
• INT 11H: Determinación del equipo. Determina los dispositivos opcionales
que tiene conectados el sistema en el momento de encenderlo y almacena
esta configuración en la posición 40:10H.
• INT 12H: Determinación del tamaño de la memoria. Retorna en el registro
AX el tamaño de la memoria del sistema; el valor se da en Kbytes.
• INT 13H: Entrada/salida de datos en disco. Provee los servicios necesarios
para el acceso a disco, tales como la verificación de estado, formato, escritura
y lectura de datos.
• INT 14H: Comunicación de entrada/salida. Provee las funciones necesarias
para establecer una comunicación serial a través de uno de los puertos COM.
• INT 15H: Servicios del sistema. Proporciona los siguientes servicios:
autoprueba de encendido; lectura del estado del sistema; soporte a joystick;
determina el tamaño de la memoria extendida; conmuta el procesador a modo
protegido; provee la funcionalidad de la interfaz con el mouse.
• INT 16H: Entrada desde teclado. Provee los servicios necesarios para el
manejo de entrada de datos desde el teclado.
• INT 17H: Salida a la impresora. Proporciona los servicios necesarios para el
control de impresión.
• INT 18H: Entrada al programa BASIC de la ROM. Se usaba cuando los PC
no disponían de disco duro y en el arranque no tenía discos flexibles con el
sistema operativo.
• INT 19H: Cargador de arranque. Si hay un disco de arranque en el sistema,
esta función lee la pista 0, sector 1 y transfiere las instrucciones leídas a la
posición 7C00H y transfiere el control a esta localidad.
• INT 1AH: Leer y establecer hora. Lee y fija la hora del sistema.
• INT 1BH: Tomar control de una interrupción de teclado. Cuando son
presionadas las teclas CTRL + BREAK, el control es transferido a una dirección
de interrupción en donde la bandera esté en 1.

Observación
En los siguientes fascículos se estudiará la funcionalidad de algunas de las
interrupciones antes mencionadas, se determinará su aplicabilidad y forma de
emplearlas.

Interrupciones del DOS

El sistema operativo DOS proporciona funciones que le permiten al programador


acceder a los dispositivos de entrada/salida, de manera más sencilla que las
funciones del BIOS; además estas funciones son independientes de la máquina.
El módulo MSDOS.SYS contiene las funciones de entrada/salida, cuando un
programa de usuario requiere de uno de estos servicios; el MSDOS.SYS invoca
una o varias funciones del módulo IO.SYS, el cual hace la interfaz a bajo nivel con
las funciones de la BIOS. Las siguientes son las funciones que proporciona el
DOS para permitir a los programas de usuario el acceso a dispositivos de
entrada/salida.

• INT 20H: Terminación de programa. Finaliza la ejecución de un programa


.COM, restablece condiciones de ejecución y devuelve el control del sistema al
DOS.
• INT 21H: Petición de funciones al DOS. Es la función más importante
proporcionada por el DOS y provee una gran cantidad de servicios a los
programas de usuario. El acceso a un servicio determinado se hace pasando la
identificación de éste en el registro AH.
• INT 22H: Dirección de terminación. Permite al DOS recuperar el control del
sistema cuando un programa termina su ejecución.
• INT 23H: Dirección del CTR + BREAK. Se usa para transferir el control a una
rutina del DOS, finalizando la rutina o el proceso que en ese momento se
encuentre en ejecución; se invoca cuando se oprime CTR + BREAK.
• INT 24H: Manejador de error crítico. La usa el DOS para recuperar el control
del sistema cuando sucede un error crítico.
• INT 25H: Lectura absoluta de disco. Lee el contenido de uno o más sectores
del disco.
• INT 26H: Escritura absoluta de disco. Escribe información desde memoria a
uno o más sectores del disco.
• INT 27H: Terminar pero permanecer residente. Permite que al salir un
programa .COM permanezca residente en memoria.
• INT 2FH: Interrupción de multiplexación. Implica la comunicación ente
programas.
• INT 33H: Manejador de mouse. Proporciona los servicios necesarios para el
manejo del mouse.

Observación
En los fascículos siguientes centraremos nuestra atención en el estudio de los
servicios proporcionados por la función 21H, ya que estos brindan la mayor
funcionalidad del DOS para los programas de usuario desarrollados en
ensamblador para PC.

Aplicaciones

Las funciones proporcionadas por el BIOS y el DOS proveen una gran cantidad de
servicios de control sobre el hardware, de manera que el diseñador y constructor
de programas de usuario las emplee de manera transparente. Sin estas funciones
resultaría bastante complejo el desarrollo de programas en ensamblador para PC,
ya que el diseñador tendría que conocer muy de cerca la arquitectura y
organización del hardware del sistema para poder controlarlo. Entre las
aplicaciones de éstas funciones tenemos: control del monitor y control del teclado.

Control del monitor

La salida de datos por el monitor se puede efectuar de manera sencilla. Los


servicios básicos que se pueden obtener para este propósito son:

• Posicionamiento del cursor: INT 10H, servicio 02H


• Limpieza de pantalla: INT 10H, servicio 06H.
• Despliegue de un carácter; INT 21H, función 02.
• Despliegue de cadenas de caracteres: INT 21H, servicio 09H.

Actividad 8.1

Desarrolle un programa .COM que borre la pantalla y despliegue los 256 códigos
ASCII. Para ello tenga en cuenta lo siguiente:

1. En el borrado de la pantalla es necesario inicializar varios registros antes de


invocar la INT 10H, servicio 06H. Los parámetros a inicializar son:

- El registro AL se debe inicializar en cero.


- En el registro AH se debe cargar el número del servicio: 06H.
- En el registro BH se fija el atributo de borrado, por ahora cargue 71H.
- En el registro CX se debe cargar el valor de la coordenada superior
izquierda, en el formato [fila:columna]; para borrar toda la pantalla cargue
0000H.
- En el registro DX se debe cargar la coordenada de la esquina inferior
derecha en el mismo formato anterior, para borrar toda la pantalla, cargue:
184FH.
- Una vez inicializados los parámetros puede invocar la INT 10H.

2. La mayoría de los 256 caracteres ASCII están representados por símbolos que
se pueden desplegar; algunos valores como 00H o FFH, pueden no tener un
símbolo desplegable y aparecen como un espacio en blanco. Para desplegar
cada carácter tenga en cuenta:

- Usar al INT 21H función 09H; este valor se debe inicializar en el registro AH
antes de invocar la función.
- El valor a desplegar debe permanecer en una variable tipo byte, a cuya
dirección debe estar apuntando el registro DX.
- Para imprimir los 25 caracteres se debe usar la instrucción LOOP con
ayuda del contador CX.

Control del teclado

Al igual que el monitor, la entrada de datos básica se efectúa a través del teclado.
Entre los servicios primarios que se pueden obtener para tal fin son:

• Entrada de datos desde teclado sin repetición en pantalla: INT 21H, función
08H.
• Entrada de datos desde teclado: INT 21H, función 0AH.

Actividad 8.2

Crear un programa .COM que lea el teclado y almacene los datos leídos en un
vector. Los pasos a seguir para la realización de este programa son:

1. Definir el vector del tamaño que desee e inicializarlo con el código ASCII del
espacio en blanco.
2. Es necesario inicializar una estructura con los parámetros de lectura requeridos
por el servicio. Esta estructura se crea en el segmento de datos de la siguiente
manera:

Etiqueta Instrucción Comentario


PARAM LABEL BYTE ;Inicio de la estructura
MAXLEN DB 100H ;Igual al tamaño del vector.
ACTLEN DB ? ;Número de caracteres leídos.
VECTOR DB 100H DUP(' ') ;Vector

3. Una vez definida la estructura de parámetros, se debe cargar el registro AH


con el número del servicio: 0AH.
4. Luego se debe cargar la dirección de la estructura de parámetros (PARAM), en
el registro DX.
5. Invocar la INT 21H.

Resumen

Para acceder a los dispositivos de entrada/salida, tanto el BIOS como el DOS le


brindan al programador un basto conjunto de funciones que encapsulan los
detalles técnicos del control directo de la máquina y ofrecen una forma sencilla de
controlar el hardware sin tener que conocer al detalle su arquitectura u
organización. Las funciones del BIOS y del DOS se invocan mediante
instrucciones que actúan de manera análoga a las interrupciones de hardware.

Bibliografía recomendada

Tokheim, Roger L. Fundamentos de los microprocesadores. México: Mc Graw Hill,


1998.

Brey, Barry B. Los microprocesadores INTEL. México: Prentice Hall, 1994.

Stallings, William. Organización y arquitectura de computadores. España: Prentice


Hall, 2000.
Abel, Peter. Lenguaje ensamblador y programación para el PC IBM y compatibles.
México: Pearson Educación, 1996.

Nexo

En el fascículo siguiente trataremos en detalle las funciones del BIOS y del DOS
referentes a la entrada y salida básica de datos en el PC. Se estudiará cada uno
de los servicios provistos por las funciones involucradas en estos procesos.
Autoevaluación formativa

Desarrollar un programa en lenguaje ensamblador que lea un determinado número


de caracteres desde teclado, los almacene en un vector y al oprimir la tecla
ENTER despliegue en una línea los caracteres que se leyeron en mayúscula, en
otra línea los caracteres que se leyeron en minúscula, en una línea siguiente los
caracteres correspondientes a los diez dígitos y en una última línea los demás
caracteres.

Para ello debe tener en cuenta los siguientes puntos:

• Se debe borrar la pantalla.


• Se debe posicionar el cursor en la primera línea y primera columna de la
pantalla.
• Leer los caracteres desde el teclado. Podrán ser leídos máximo 255
caracteres.
• Al oprimir ENTER se deben desplegar las cuatro líneas con la información
arriba indicada.
Lenguaje de máquina
Semestre 6
Fascículo No. 9

Tabla de contenido
Contenido
Entrada y salida de datos por teclado y por pantalla (primera parte)
Control y salida de datos por pantalla
Ubicación del cursor
Limpiar la pantalla
Control de entrada de datos desde teclado
Entrada por teclado
Uso de caracteres para desplegar
Despliegue de un solo carácter
Manejadores de archivo
Control de salida de datos con manejadores de archivos
Control de entrada de datos con manejadores de archivo
Resumen
Bibliografía recomendada
Párrafo nexo
Autoevaluación formativa
Entrada y salida de datos por teclado y por pantalla (primera parte)

Una de las características básicas definidas en un sistema basado en


microcomputador es su interfaz hombre máquina que define su capacidad de
interacción con los usuarios del sistema. Para estas interfaces la entrada de datos
por teclado, ratón, disco duro y el despliegue de datos en pantalla es básico.

El sistema identificará la interacción del usuario con las interfaces de entrada o


salida a través de eventos que solicitan INT, las interrupciones INT 10H de la
BIOS y la INT 21H del DOS permiten el manejo de despliegue en pantalla y la
entrada de datos por teclado respectivamente.

En este fascículo se tratará el manejo de las INT para el despliegue por pantalla y
el manejo de entradas por teclado, los requisitos necesarios para especificar los
dispositivos de entrada o salida y solicitar las operaciones de atención a estos
dispositivos.

Indicadores de logro

Al terminar el estudio del presente fascículo, el estudiante:

• Especifica los requisitos para la entrada de datos por teclado y el despliegue


de información en pantalla.
• Define las áreas de despliegue de video, las áreas de despliegue de video
monocromático y las áreas de despliegue de video gráfico.
• Identifica y utiliza las funciones 02H y 06H de la INT 10H de la BIOS para
despliegue por pantalla.
• Identifica y utiliza las funciones 02H, 09H, 0AH, 3FH, 40H de la INT 21H del
DOS para despliegue por pantalla y entrada de teclado.
La pantalla es una matriz de posiciones direccionables, en las cuales se puede
ubicar el cursor. Los monitores comunes de video tienen 25 filas por 80 columnas,
direccionables desde 0 hasta 24 (18H) para las filas, y desde 0 hasta 79 (4FH)
para las columnas.

El sistema proporciona, en la memoria, un área para el despliegue de video o


buffer de video. Para un buffer monocromático se definen 4K bytes de memoria
que inician en la dirección de BIOS B000[0]H, de los cuales 2K se utilizan para
caracteres y 2K para atributos para cada carácter. Para el buffer de video gráfico
en color se asignan 16K a partir de la localidad de memoria BIOS B800[0]H,
pudiéndose trabajar en modo texto y en modo gráfico. En modo texto el buffer de
video maneja 4 páginas para una pantalla de 80 columnas.

Para realizar despliegues de datos en pantalla se requiere transferir los datos al


buffer de video; esta transferencia puede hacerse de manera directa al buffer de
video, conociendo las direcciones del buffer o manejando interrupciones.

Ubicación del cursor

La función 02H de la interrupción INT 10H de BIOS permite realizar la operación


de ubicación del cursor. La ubicación del cursor determina dónde será desplegado
el siguiente carácter,

Al colocar en el registro AH, 02H se está indicando la función colocar cursor a la


INT 10H; indique el número de página en BH, y en DX el número de columna y fila
de la nueva posición.
MOV AH, 02H ; Petición de colocar el cursor
MOV BH, 00 ; Número de página
MOV DH, 08 ; Fila 08
MOV DL, 10 ; Columna 10
INT 10H ; Interrupción que llama al BIOS.

Limpiar la pantalla

La función 06H de la INT 10H de BIOS maneja el borrado de la pantalla. Se puede


limpiar toda la pantalla o parte de ella.

Con el registro AH en 06H se define borrado de una parte de la pantalla; con


registro AL en 00 se define borrado completo de pantalla; en BH defina el atributo
de pantalla, en los registros CX y DX defina el punto de inicio y el punto de fin para
definir el área de borrado.

MOV AX, 0600H ; Define borrado de una parte de la pantalla.


MOV BH, 71H ; Fija atributos para la pantalla, blanco (7), sobre azul (1).
MOV CX, 0000H ; Fija el valor para la esquina superior izquierda fila:columna.
MOV DX, 0000H ; Fija el valor para la esquina inferior derecha fila:columna.
INT 10H

Observación
Recuerde que :
La INT 10H de la BIOS permite el manejo de video.
La INT 21H del DOS permite el despliegue en pantalla y la entrada por teclado.
Las funciones definidas para cada INT se definen en el registro AX, y los
parámetros de cada función se definen en registros como CX, DX, DI, SI, BP.
Actividad 9.1

Utilice el debug para ejecutar los ejemplos de las funciones 02H y 06H para INT
10H y observe su comportamiento

Funciones de DOS para despliegue en pantalla

La función 09H de la INT 21H de DOS maneja el despliegue de una cadena en


pantalla. Para ello defina la cadena que quiere desplegar, terminada en el
delimitador de signo pesos ( $ ) o ( 024H ); este delimitador se utiliza para finalizar
el despliegue.

Con AH en 09H, cargue en DX la dirección de la cadena, y solicite la INT 021H

MOV AH, 09H ; Define el despliegue de cadena.


LEA DX,’CADENA’ ; Carga la dirección de la cadena a desplegar
INT 21H

En el segmento de datos defina la cadena a desplegar utilizando el signo


delimitador:

CADENA DB “Fecha?”,”$” ;Cadena a desplegar


Entrada por teclado

La función 0AH de la INT 21H es utilizada para aceptar datos desde el teclado.
Esta función requiere la definición de algunos parámetros de acuerdo con el
procesamiento de la INT. Indique el número máximo de caracteres de entrada,
defina un byte para almacenar el número de caracteres introducidos por el
usuario; éste se almacena como un valor binario, y un tercero para almacenar los
caracteres tecleados desde izquierda a derecha.

INCARPARM LABEL BYTE ; Define lista de parámetros


MAXLEN DB 10 ; Número máximo de caracteres de entrada
ACTLEN DB ? ; Número real de caracteres de entrada
NAMEFLD DB 20 DUP (´´) ; Caracteres introducidos desde teclado.

Uso de caracteres para despliegue de caracteres

Los caracteres de control de retorno de carro facilitan y hacen más eficiente el


despliegue de datos en pantalla. Algunos caracteres de control son:

Carácter de Control ASCII HEX Efecto


Retorno de carro 13 0DH Restablece a la posición de la extrema Izquierda
Avance de Línea 10 0AH Avanza a la línea siguiente
Tabulador 09 09H Avanza a la siguiente marca del Tabulador
Despliegue de un solo carácter

La función 02H de la interrupción 21H se utiliza para el despliegue de un solo


carácter; cargue en DL el carácter a ser desplegado en la posición actual del
cursor.

MOV AH, 02H ; Define el despliegue de un solo carácter


MOV DL, ‘Caracter’ ; Carácter a ser desplegado.
INT 21

Actividad 9.2

Desarrolle un programa que solicite al usuario que introduzca su nombre y


después lo despliegue en el centro de la pantalla y emita el sonido de la bocina.

Manejadores de archivo

Una manejador de archivo sólo es un número que hace referencia a un dispositivo


específico; estos manejadores están predefinidos y son:

Manejador Dispositivo
00 Entrada, por el teclado (CON)
01 Salida, por la Pantalla (CON)
02 Error en la entrada, pantalla (CON)
03 Dispositivo auxiliar (AUX)
04 Impresora (LPT1 o PRT)
Manejadores de archivo para despliegue en pantalla

La función 40H de la INT 21H del DOS utiliza los manejadores de archivo para
realizar despliegues.

MOV AH, 40H ; Función de despliegue


MOV BX, 01H ; Manejador de archivo de salida
MOV CX, ”Numero de caracteres” ; Despliegue de número de caracteres
LEA DX, ”DESPAREA” ; Área de despliegue
INT 21H

DESPAREA DB ‘Lenguaje de Máquina’, 0DH, 0AH ; Área de despliegue

La ejecución de INT 21H pone en AX el número de bytes escritos y en el bit de


acarreo un cero para operación exitosa. Una operación fallida pone un uno en el
bit de acarreo y en AX, 05H; acceso denegado ó 06H; manejador no válido.

Manejadores de archivo para entrada desde teclado

La función 3FH de la INT 21H de DOS utiliza manejadores de archivo para solicitar
la entrada de datos desde teclado.

MOV AH, 3FH ; Función de entrada


MOV BX, 00 ; Manejador de archivo para el teclado
MOV CX, 20 ; Máximo 20 caracteres
LEA DX, AREAENT ; Área de entrada
INT 21H
AREAENT DB 20 DUP(´´); Define un área de entrada de 20
posiciones de memoria tipo DB

La ejecución de INT 21H pone en AX el número de caracteres introducidos y en el


bit de acarreo un cero para operación exitosa. Una operación fallida pone un uno
en el bit de acarreo y en AX, 05H; acceso denegado ó 06H; manejador no válido.

Actividad 9.3

Utilizando el Debug ejecute el siguiente programa:

100 MOV AH, 3F


102 MOV BX, 00
105 MOV CX, 0C
108 MOV DX, 10F
10B INT 21H
10D JMP 100
10F DB 20 20 20 20 20 20 20 20 20 20 20 20

Describa cuál es el efecto de la función 3F de la INT 21H, verifique el contenido de


AX, y la bandera de acarreo. Verifique el contenido de los datos ingresados.

Observación
Recuerde utilizar la opción P del debug para ejecutar una instrucción de llamado a
interrupción o llamado a subrutina. Para ejecutar paso a paso una subrutina utilice
la opción T del debug.
Resumen

En este fascículo se introdujeron los conceptos de entrada de datos por teclado y


despliegue de datos en pantalla. Se definieron algunas funciones básicas
relacionadas con las INT 10H de BIOS, 21H de DOS y los manejadores de
Archivo.

Bibliografía recomendada

Tokheim Roger L. Fundamentos de los microprocesadores. México: Mc Graw Hill,


1998.

Brey Barry B. Los microprocesadores INTEL. México: Prentice Hall, 1994.

Stallings William, Organización y arquitectura de computadores. España: Prentice


Hall, 2000.

Abel Peter, Lenguaje ensamblador y programación para el PC IBM y compatibles.


México: Pearson Educación, 1996.

Nexo

En el siguiente fascículo se conocerán los modos de video y sus características,


se definirán los parámetros para trabajar en los modos de video: texto y gráfico.
También se analizará cómo se determina el estado del teclado, para teclas
normales, de función extendida y funciones especiales, y la gestión el buffer de
teclado.
Autoevaluación formativa

Para adquirir habilidad en el manejo de despliegue por pantalla y entrada de


teclado realice los siguientes programas en ensamblador.

1. Fijar el cursor en la fila 8, columna 8.

2. Limpiar la pantalla desde la posición (12,0) hasta la posición (22,79) de


pantalla de 80 columnas.

3. Utilizando el despliegue por pantalla de la INT 21H y los manejadores de


archivo desplegar el mensaje “Ingrese su contraseña” en el centro de la
pantalla.

4. Solicitar al usuario que ingrese su nombre, dirección, y teléfono, y desplegar


los datos en el centro de la pantalla.
Lenguaje de Máquina
Semestre 6
Fascículo No. 10

Tabla de Contenido
Contenido
Entrada y salida de datos por teclado y por pantalla (segunda parte)
Adaptadores de video
Modo texto
Byte de atributo
Paginas de pantalla
Interrupción 10H de Bios para manejo de video, modo texto
Modo gráfico
Interrupción 10H del BIOS para gráficos
Procesamiento avanzado de teclado
Interrupción 21H de DOS para entrada desde teclado
Interrupción 16H De Bios para entrada desde teclado
Teclas de función extendida y códigos de rastreo
Interrupción 09H de Bios para entrada desde teclado
Resumen
Bibliografía recomendada
Párrafo nexo
Autoevaluación formativa
Entrada y salida de datos por teclado y por pantalla (segunda parte)

En el fascículo 9 se estudiaron las características básicas del manejo de


despliegue en pantalla y entrada desde teclado por medio de las INT y los
manejadores de archivo; en este fascículo se estudiarán las características de los
diferentes adaptadores de video, modos de configuración y manejo de pantalla.
Además se estudiarán las diferentes características de teclado, como teclas
normales, teclas de funciones extendidas y teclas de control.

Se presentan los servicios y el modo de utilización de cada función de INT 10H de


BIOS para manejo de video, y de la INT 09H y INT 16H de BIOS y 21H para
gestión de entrada de datos por teclado.

Indicadores de logros

Al terminar el estudio del presente fascículo, el estudiante:

• Identifica las características avanzadas para el manejo de pantalla, tales como


recorrido, video inverso, intermitencia, gráficas a color.
• Reconoce las operaciones de teclado y las características avanzadas desde
teclado.
• Desarrolla habilidades en el manejo de despliegues por pantalla utilizando los
servicios de la INT 10H para modo gráfico y modo texto.
• Utiliza las operaciones de la INT 21H del DOS, INT 09H y la INT 16H para el
manejo de teclado.
• Identifica los modos de configuración de video.
• Maneja el buffer de memoria para despliegues de video.
• Describe el código de rastreo para los diferentes tipo de teclado, normal,
extendido y de control.
• Maneja el buffer de teclado, sus direcciones de inicio y de final en los procesos
de escritura y lectura de caracteres desde teclado.

Adaptadores de video

El adaptador de video consta de tres partes básicas: el controlador de video, el


video de BIOS, el área de despliegue de video.

El controlador de video, genera las señales de rastreo del monitor para el modo
seleccionado, texto o gráfico. El procesador envía instrucciones a los registros del
controlador y lee ahí la información de estado. El video de BIOS, que actúa como
una interfaz con el adaptador de video, contiene rutinas como para establecer el
cursor y desplegar caracteres. El área de despliegue de video en memoria
contiene la información que el monitor va a mostrar. Las interrupciones que
manejan el despliegue en pantalla de forma directa transfieren sus datos a esta
área.

Los adaptadores de video más comunes son:

MDA Adaptador de pantalla monocromática. EGA Adaptador de gráficos mejorado


HGC Tarjeta de gráficos Hércules MCGA Adaptador de gráficos multicolores
CGA Adaptador de gráficos en colores VGA Matriz de gráficos de video

Modo texto

El modo texto es utilizado para el despliegue normal, en la pantalla, de caracteres


ASCII; proporciona acceso a todo el conjunto de 256 caracteres ASCII extendido.
Valores para el modo de video:

Texto/ texto pixel color Numero Direcc Sistema


Grafico resol box paginas
00h = T 40x25 8x8 16gray 8 B800 CGA,PCjr,Tandy
= T 40x25 8x14 16gray 8 B800 EGA
= T 40x25 8x16 16 8 B800 MCGA
01h = T 40x25 8x8 16 8 B800 CGA,PCjr,Tandy
= T 40x25 8x14 16 8 B800 EGA
= T 40x25 8x16 16 8 B800 MCGA
= T 40x25 9x16 16 8 B800 VGA
02h = T 80x25 8x8 16gray 4 B800 CGA,PCjr,Tandy
= T 80x25 8x14 16gray 4 B800 EGA
= T 80x25 8x16 16 4 B800 MCGA
= T 80x25 9x16 16 4 B800 VGA
03h = T 80x25 8x8 16 4 B800 CGA,PCjr,Tandy
= T 80x25 8x14 16 4 B800 EGA
= T 80x25 8x16 16 4 B800 MCGA
= T 80x25 9x16 16 4 B800 VGA
07h = T 80x25 9x14 mono var B000 MDA,Her.,EGA
= T 80x25 9x16 mono B000 VGA

Los modos texto 00H (mono) y 01H (color) permiten usar el formato de 40
columnas. Los modos texto 02H (mono) y 03H (color) proporcionan el formato
convencional de 80 columnas. Los modos 0 y 2 son de “color suprimido”, aunque
en muchos monitores salen también en color (y no en tonos de gris). El modo texto
07 (mono) es el modo estándar monocromático para MDA, EGA y VGA, ofrece
respetables resoluciones en la pantalla.

Byte de atributo

Un byte de atributo en modo de texto determina las características de cada


carácter mostrado, como el color del fondo, el color del carácter, su intermitencia,
brillo y video inverso. El byte de atributo tiene el formato siguiente, de acuerdo con
la posición de bit:
Intermitencia Fondo Frente
BLINK R G B I R G B
7 6 5 4 3 2 1 0

El Bit 7 establece la intermitencia; los bits del 6 a 4 determinan el fondo de la


pantalla; el bit 3 establece intensidad alta; los bits del 2 a 0 determinan el frente o
primer plano.

Despliegue monocromático

Para un monitor monocromático, el bit 0 establece el atributo subrayado. Para


especificar atributos, puede establecer combinaciones de bits como se muestra a
continuación:

Fondo Frente Característica Fondo Frente HEX


BL R G B I R G B
Negro Negro No despliega 0 0 0 0 0 0 0 0 00H
Negro Blanco Normal 0 0 0 0 0 1 1 1 07H
Negro Blanco Intermitencia 1 0 0 0 0 1 1 1 87H
Negro Blanco Intenso 0 0 0 0 1 1 1 1 0FH
Blanco Negro vides Inverso 0 1 1 1 0 0 0 0 70H
Blanco Negro Inverso, intermitente 1 1 1 1 0 0 0 0 F0H
Subrayado 0 0 0 0 0 0 0 1 01H

Despliegue a color

En muchos monitores a color, el fondo puede mostrar uno de ocho colores y los
caracteres pueden mostrar uno de 16 colores. La intermitencia e intensidad sólo
se aplican al primer plano. También puede seleccionar uno de 16 colores para el
borde. Los monitores de color no permiten subrayado; en lugar de eso, al
establecer un bit en 0 selecciona el color azul como primer plano.

Los colores básicos rojo, verde y azul puede combinarlos en el byte de atributo
para formar un total de ocho colores (incluyendo blanco y negro) y puede
establecer alta intensidad, para un total de 16 colores.

Color I R G B Color I R G B
Negro 0 0 0 0 Gris 1 0 0 0
Azul 0 0 0 1 Azul Claro 1 0 0 1
Verde 0 0 1 0 Verde Claro 1 0 1 0
Cian 0 0 1 1 Cian Claro 1 0 1 1
Rojo 0 1 0 0 Rojo Claro 1 1 0 0
Magenta 0 1 0 1 Magenta Clara 1 1 0 1
Cafe 0 1 1 0 Amarillo 1 1 1 0
Blanco 0 1 1 1 Blanco Brillante 1 1 1 1

Si los colores del fondo y del primer plano son iguales, el carácter mostrado es
invisible. El byte de atributo es utilizado de la misma manera como se mostró con
un monitor monocromático.

Interrupción 10H de BIOS para manejo de video, modo texto

La INT 10H de BIOS define una serie de servicios para el manejo de video,
dependiendo del valor que se carga en el registro AX, los registros BX, CX, DX,
DI, SI, y BP no se modifican, y se utilizan para pasar parámetros a los servicios.

Algunos de los servicios de la interrupción son:


00H Establece el modo de video 0BH Establece la paleta de colores
01H Establece el tamaño del cursor 0CH Escribe el píxel punto
02H Establece la posición del cursor 0DH Lee el píxel punto
03H Lee la posición del Cursor 0EH Escribe en teletipo
04H Lee la Posición de la Pluma Óptica 0FH Obtiene el modo actual de video
05H Selecciona la pagina active 11H Genera carácter
06H Recorre la pantalla hacia arriba 12H Selecciona rutina alterna de pantalla
07H Recorre la pantalla hacia abajo 13H Despliega cadena de caracteres
08H Lee el atributo o carácter en la posición del cursor 1BH Regresa la información de funcionalidad o de estado
09H Despliega el atributo o carácter en la posición del cursor 1CH Guarda o restaura el estado de video
0AH Despliega el carácter en la posición del cursor

Establecer el modo de video

El valor 00H en el registro AX designa el modo de video para el programa que se


está ejecutando, o fija el modo como texto o como gráfico.

Establecer el tamaño del cursor

La función 01H permite ajustar el tamaño vertical del cursor. En CH (bits 0-4) se
define la parte superior del cursor, y en CL (bits 0-4) la parte inferior del cursor.
Puede ajustar el tamaño del cursor entre la parte superior y la parte inferior 0:14
para VGA, 0:13 para monocromático y EGA y 0:7 para CGA. Para un CGA.
Establecer la posición del cursor

La función 02H coloca el cursor en cualquier posición dentro de la pantalla, de


acuerdo con las coordenadas fila:columna. Cargue en BH el número de página, en
DH el número de fila y en DL el número de columna.

Leer la posición del cursor

La función 03H permite ubicar la posición y el tamaño del cursor en el registro CX;
en CH la línea de rastreo inicial del cursor, en CL la línea de rastreo final del
cursor, en DH la fila y en DL la columna

Selección de la página activa

La función 05H permite establecer la página que será desplegada, en el registro


AL, para los modos texto 0 - 3 para los modos 2 y 3, 0 – 7 para los modos 0 y 1.

Recorrer la pantalla hacia arriba

La función 06H permite recorrer la pantalla hacia arriba, al fijar AL con 0, se


recorre toda la página hacia arriba, y con un valor diferente solamente el número
de filas que se indica. En BH cargue el valor del atributo, en CX, Fila:Columna
iniciales y en DX Fila:Columna Finales.
Recorre hacia abajo la pantalla

La función 07H permite recorrer la pantalla desde abajo. Para modo texto, el
recorrido hacia debajo de la pantalla provoca que las filas inferiores desaparezcan
por la parte inferior y aparezcan líneas blancas en la parte superior.

Cargue AL con el número de líneas o toda la pantalla, BH con el atributo, en CX,


Fila:Columna iniciales y en DX Fila:Columna Finales.

Leer atributo o carácter en la posición del cursor

La función 08H puede leer tanto el carácter como su atributo del área de
despliegue de video en los modos texto y grafico. En BH cargue el número de
página; la INT 10H devuelve en AL el carácter, y en AH su atributo.

Desplegar atributo o carácter en la posición del cursor

La función 09H permite desplegar caracteres, o gráficos con intermitencia, en


video inverso, etc. Cargue AL un carácter ASCII, en BH el número de página, BL
con el atributo, CX con el número de veces que la operación despliegue de
manera repetida el carácter.
Despliega un carácter en la posición del cursor

La función 0AH despliega un carácter en modo texto o gráfico, el atributo no se


modifica. Cargue en AL el carácter que se va a desplegar, en BH el número de
página, en CX el número de veces que se va a repetir.

Obtener el modo actual de video

Al cargar AH con 0FH se puede determinar el modo de video actual; esta función
devuelve AL con el modo actual de video, AH caracteres usados por línea, y BH el
número de página actual.

Despliegue de una cadena de caracteres

La función 13H permite desplegar cadenas y manipular los atributos. Los registros
ES:BP deben contener la dirección del segmento:desplazamiento de la cadena
que se despliega.

MOV AH, 13H ; Función para despliegue de cadena de caracteres


MOV AL, Subfunción ; 0, 1, 2, ó 3.
MOV BH, # Pagina ; Número de página.
MOV BL, Atributo ; Atributo de la página.
MOV BP, Dirección ; Dirección de la cadena ES:BP
MOV CX, Longitud ; Longitud de la cadena en caracteres
MOV DX, Pantalla ; Posición relativa del inicio de la pantalla.
INT 10H

Las cuatro subfunciones en AL son:


00 Despliega el atributo y la cadena; no avanza el cursor
01 Despliega el atributo y la cadena; avanza el cursor
02 Despliega el carácter y después el atributo; no avanza el cursor
03 Despliega el carácter y después el atributo; avanza el cursor

Actividad 10.1

1. Utilizando el Debug liste y ejecute los siguientes programas:

a. Ajustar el tamaño del cursor a 03:10.


b. Establezca la posición del cursor en (05,20)
c. Lea la posición del cursor, determine su posición y tamaño, para avanzar el
cursor a la siguiente fila.
d. Despliegue 80 caracteres y establezca un atributo de color.

2. Diseñe un programa que despliegue el grupo completo de caracteres ASCII al


igual que la actividad 8.1; el programa debe capturar el modo de video actual,
y asignar modo texto de video; limpie la pantalla y cree una nueva ventana y
despliegue el conjunto de caracteres ASCII y al final reestablezca el modo de
video.

Modo gráfico

Los adaptadores gráficos tienen dos modos de operación: texto (por Omisión) y
gráfico. Utilice la función 00H de la INT 10H para establecer el modo gráfico o de
texto (AL = 0CH modo grafico, AL = 03H modo texto).
Modo Texto Resolución Colores Segmento Tarjeta
---- ----- ---------- ------- -------- ---------------------
04h 40x25 320x200 4 B800 CGA, EGA, MCGA, VGA
05h 40x25 320x200 4 grises B800 CGA, EGA
05h 40x25 320x200 4 B800 CGA, VGA
06h 80x25 640x200 2 B800 CGA, EGA, MCGA, VGA
0Dh 40x25 320x200 16 A000 EGA, VGA
0Eh 80x25 640x200 16 A000 EGA, VGA
0Fh 80x25 640x350 2 A000 EGA, VGA
10h 80x25 640x350 4 A000 EGA con 64K
10h 80x25 640x350 16 A000 EGA con 256K, VGA
11h 80x30 640x480 2 A000 VGA, MCGA
12h 80x30 640x480 16/256k A000 VGA
13h 40x25 320x200 256/256k A000 VGA, MCGA

En los modos gráficos 04H, 05H, y 06H la dirección del área de despliegue de
video es B800[0]. Estos son los modos originales de CGA, que también son
utilizados por los EGA y VGA por su compatibilidad con posteriores. La dirección
de despliegue de video para los modos gráficos 0DH, 0EH, 0FH y 10H inicia en
A000[0]. Son los modos originales de EGA, que también son usados por VGA,
permiten usar 8, 4 y 2 páginas. La dirección de despliegue de video para los
modos gráficos 11H, 12H, y 13H está en A000[0]. Estos modos están diseñados
específicamente para VGA, no se pueden utilizar con otros adaptadores.

Observación
En modo gráfico, la ROM contiene patrones de puntos sólo para los 128
caracteres (inferiores). La INT 1FH proporciona acceso a un área de memoria de
1K que define los 128 caracteres superiores.

El modo gráfico utiliza píxeles para generar patrones en color. Cada píxel consta
de dos bits, estos dos bits definen cuatro colores, puede seleccionar el píxel 00
para cualquiera de los 16 colores disponibles para el fondo. Y puede seleccionar
los píxeles 01, 10, 11 para cualquiera de las tres paletas de colores:
C1 C0 Paleta 0 Paleta 1
0 0 Fondo Fondo
0 1 Verde Cian
1 0 Rojo Magenta
1 1 Café Blanco

Interrupción 10H del BIOS para gráficos

Al igual que en modo texto se pueden utilizar los servicios de la INT 10H para el
manejo completo de la pantalla en modo grafico:

Establecer una paleta de colores

La función 0BH permite establecer una paleta de colores y definir un carácter


gráfico. El valor en BH determina el propósito del registro BL.

BH en 00, selecciona el color de fondo, donde BL contiene el número del color en


los bits 0-3, BH en 01, selecciona la paleta para gráficos, donde BL contiene la
paleta 0 ó 1

Escribir un píxel punto

La función 0CH se utiliza para desplegar un color seleccionado (fondo y paleta).


Cargue AL con el color del píxel, BH con el número de página, CX con la columna,
y DX con la fila.
Leer un píxel punto

Esta función 0DH es inversa a la función 0CH; lee un punto para determinar el
número de su color. Establezca BH con el número de página, CX con la columna y
DX con la fila. Esta función regresa el color del píxel en el AL.

Información funcionalidad estado

La función 1BH regresa la información a un buffer de 64 bytes identificando el


modo de video, tamaño del cursor, página a la que se le da soporte, etc.

Guardar o restaurar el estado de video

La función 1CH, guarda o restaura el estado de video, incluyendo el estado de los


registros de color, el área de datos de la BIOS y el Hardware de video.

Actividad 10.2

Escriba un programa que acepte datos desde teclado y despliegue caracteres. El


programa limpiará la pantalla, establecerá los colores y aceptará un conjunto de
datos desde el teclado, empezando en la posición actual del cursor. El conjunto de
datos podría ser de cuatro o cinco líneas ingresados desde el teclado, cada
conjunto seguido de un enter. Utilice diferentes colores, video inverso o sonido
para experimentar. Después coloque el cursor en una posición diferente y
despliegue los datos ingresados en esa posición. Puede terminar cuando el
usuario presione enter.
Procesamiento avanzado de teclado

El teclado proporciona tres tipos básicos de teclas:

1. Las teclas desde la A a la Z, números desde el 0 hasta el 9 y caracteres


como %, $ y #.
2. Teclas de función extendida; teclas de función de programa, teclas de panel
numérico, y las teclas repetidas en los teclados de 101 teclas.
3. Teclas de control para Alt, Ctrl, Shift que funcionan en conjunción con otras
teclas.

Estado del Shift del teclado

El área de datos del BIOS en el segmento 40[17]H contiene un byte del estado
actual de shift del teclado; este indica lo siguiente:

Bit Acción Bit Acción


7 Inserción activa 3 Alt Presionada
6 Estado de BloqMayús activa 2 Ctrl. Presionada
5 Estado de BloqNum activa 1 Shift izquierdo presionado
4 Estado de Scroll Lock activado 0 Shift derecho presionado

La función 02H de la INT 16H permite examinar estos valores.

El teclado de 101 teclas tiene teclas de Ctrl y Alt duplicadas (izquierdas y


derechas), de modo que se necesitará información adicional para examinarlas. El
segundo byte de estado del teclado necesario para el teclado de 101 teclas está
en 40[18]H:
Bit Acción Bit Acción
7 Ins presionada 3 Ctrl/BloqNum activa
6 BloqMayús presionada 2 SysReq . Presionada
5 BloqNum presionada 1 Alt izquierda presionada
4 Scroll Lock presionada 0 Ctrl. Izquierda presionada

Buffer del teclado

El buffer de teclado permite teclear hasta 15 caracteres antes que un programa


solicite una entrada; este buffer se encuentra en la dirección de BIOS 40:1EH. La
rutina INT 09H del BIOS obtiene el código de rastreo del teclado, lo convierte en
un carácter ASCII y lo envía al área del buffer de teclado.

Interrupción 21H de DOS para entrada desde teclado

La INT 21H de DOS define una serie de servicios para el manejo de entrada del
teclado. Algunos de los servicios de la interrupción que se pueden llamar son:

01H Entrada desde el teclado con repetición en la pantalla


06H E/S directa a consola
07H Entrada directa desde el teclado sin repetición
08H Entrada desde el teclado sin repetición en la pantalla
0AH Entrada al buffer de teclado
0BH Verificación del estado del teclado
0CH Limpiar el buffer del teclado y llamar una función

Entrada del teclado con repetición en la pantalla

La función 01H, toma un carácter del buffer del teclado; si no está presente
ninguno espera una entrada del teclado. La operación regresa: AL con un número
distinto de uno si hay un carácter ASCII, y lo repite en la pantalla. AL en cero
significa que el usuario ha presionado una tecla de funciona extendida, y el AH
tiene la función original. La operación maneja las funciones ampliadas de manera
ineficiente intentándolas enviar a pantalla. Para obtener el código de rastreo para
la tecla de función en el AL, tiene que repetir de manera inmediata la INT 21H.

E/S directa de la consola

La función 06H puede transferir cualquier carácter o código de control sin


interferencia del DOS. Para entrada, carga OFFH en el DL, si no hay carácter en
el buffer del teclado, la operación pone en uno la bandera de cero y no espera
entrada. Si hay un carácter en el buffer, la INT almacena el buffer en AL y pone en
cero la bandera de cero. La INT no repite el carácter en la pantalla y no verifica
Ctrl. Break ó Ctrl. PtSc. Un número diferente de cero en AL representa un carácter
ASCII, cero en AL significa que se tecleó una tecla de función. Para obtener el
código de rastreo en AL ejecute la INT 21H.

Entrada directa desde teclado sin repetición en la pantalla

La función 07H, funciona igual que la función 01H, excepto que el carácter no se
repite en la pantalla y la operación no responde a una petición Ctrl Break.

Entrada desde el teclado sin repetición en la pantalla

La función 08H opera igual que 01H; el carácter ingresado no se repite en la


pantalla.
Entrada del teclado mediante buffer

La función 0AH requiere definir parámetros tales como longitud máxima de


caracteres que se esperan, el número real de caracteres y los caracteres en si.

Verificación del estado de la tecla.

La función 0BH regresa en FFH en el AL si hay un carácter disponible, 00H si no


lo hay.

Interrupción 16H de BIOS para entrada desde teclado

La INT 16 del BIOS es utilizada para atención del teclado, proporciona los
siguientes servicios dependiendo de lo que se cargue en AH:

00H Lee un carácter


01H Determina si un carácter esta presente
02H Regresa el estado actual de shift
05H Escribe en el teclado
10H Lee un carácter desde teclado
11H Verifica si un carácter esta presente
12H Regresa el estado actual de shift del teclado

Leer carácter

La función 00H maneja las teclas del teclado de 83 teclas, pero no acepta
entradas adicionales del teclado de 101 teclas. Esta función verifica el buffer del
teclado; si no hay un carácter la función espera hasta que el usuario ingrese el
carácter. El carácter es almacenado en AL y su código de rastreo en AH. Si la
tecla presionada es una función extendida AL se carga con 00H.

Determinar si hay un carácter presente

La función 01H, trabaja al igual que la función 00H, pero si un carácter está
presente en el buffer de teclado, la bandera de cero (ZF=0) se pone en cero, en
AL se carga el carácter y AH su código de rastreo. Si no hay carácter en el buffer
la bandera ZF se pone en uno y no espera.

Determinar el estado actual de las teclas shift

La función 02H regresa en AL el estado de la tecla Shift desde el área de datos de


BIOS en la localidad 40[17]H.

Escritura en el teclado

La función 05H permite que su programa inserte caracteres en el buffer de teclado


como si el usuario presionara una tecla. Cargue el carácter ASCII en CH y su
código de rastreo en CL.

Lectura de un carácter del teclado

La función 10H opera lo mismo que la función 00H, adicionalmente recibe también
las teclas de función extendida desde teclado ampliado. Al igual que en la función
00H, cuando se presiona una tecla de función extendida, o en teclado extendido el
carácter en AL es 00H. Para las teclas de control duplicadas, inicio y RePág,
regresa E0H.

Determinar si hay un carácter presente

La función 11H trabaja igual que la función 01H excepto que reconoce las
funciones extendidas del teclado ampliado.

Verificar el estado presente del Shift del teclado

La función 12H semejante a la función 02H, regresa a AL el estado de shift del


teclado desde el área de BIOS del Teclado.

Teclas de función extendida y códigos de rastreo

Una tecla de función extendida solicita una acción en lugar de enviar un carácter.
Cada tecla tiene un código de rastreo, iniciando en 01 para Esc. Por medio de
estos códigos un programa puede determinar el origen de cualquier tecleo

Un programa utilizará la función 10H de la INT 16H para solicitar la entrada de un


carácter; si la tecla presionada es carácter la operación envía en el registro AL el
carácter ASCII, en el registro AH, el código de rastreo para el carácter.

Para caracteres que tienen dos teclas ( -, +, * ) se genera en AL el carácter ASCII


y AH y valor del código de rastreo diferente para cada tecla. Si la tecla presionada
es de función extendida, se carga en el registro AL cero o E0H para una tecla de
control en teclado ampliado, en el registro AH el código AH. Después de ejecutar
la INT 16H se puede examinar AL, si contiene 00H ó E0H para probar el tipo de
tecla que fue introducida.

Interrupción 09H de BIOS para entrada desde teclado

Cuando presiona una tecla, el procesador del teclado genera el código de rastreo
de la tecla y solicita la INT 09H. Esta interrupción apunta a una rutina de manejo
de interrupción en el BIOS de ROM. La rutina emite una petición de entrada desde
el puerto 96 (60H).

La rutina de BIOS lee el código de rastreo y los compara con las entradas en una
tabla de códigos de rastreo para el carácter ASCII asociado. La rutina combina el
código de rastreo con su carácter ASCII asociado y envía los dos bytes al buffer
de teclado.

La INT 09H maneja los bytes de estado del teclado en 40:17H, 40:18 y 40:96 para
Shift, Alt y Ctrl. Sin embargo aunque la presión de estas teclas genera la INT 09H,
la rutina de interrupción establece los bits apropiados en los bytes de estado, pero
no envía ningún carácter al buffer de teclado.

Cuando se presiona una tecla, el procesador del teclado de manera automática


genera un código de rastreo y la INT 09H. Cuando se suelta la tecla en un periodo
de medio segundo, genera un código de rastreo y emite otra INT 09H. El segundo
código de rastreo indica a la rutina de interrupción que se ha liberado la tecla. Si
mantiene la tecla oprimida por más de medio segundo, el proceso de teclado se
convierte en tecleo automático, y repite de manera automática la operación de la
tecla.
El buffer de teclado

Inicia en el segmento 40[0]H; la dirección 41AH indica posición siguiente a leer por
la INT 16H, la dirección 41CH indica la posición siguiente para la INT 09H para
almacenar un carácter ingresado. La dirección de inicio del buffer de teclado es
41EH, 16 palabras (32 bytes), los caracteres y los códigos de rastreo son
almacenados en esta buffer y extraídos o leídos por medio de la INT 16H.

Cuando se teclea un carácter, la INT 09H avanza a la parte final. Cuando la INT
16H lee un carácter, avanza a la parte inicial. Este proceso es circular con la parte
inicial siguiendo a la parte final. Cuando el buffer esta vacío, la parte final y la parte
inicial están en la misma dirección.

Si usted teclea ‘abcd<ENTER>’ la INT almacena los caracteres de la siguiente


manera:

A b c d <ENTER> …
41EH 420H 422H 424H 426H 428H

Ahora usted teclea ‘efghijklmnopqrs’; esta cadena se almacenará de la siguiente


manera:

a b c d <ENT> E f g h i j k l m n o
41EH 420H 422H 424H 426H 428H 42A 42C 42E 430 432 434 436 438 43A 43C

El buffer se llena en la dirección 43CH, la INT 09H almacena los datos siguientes
iniciando en la posición inicial del buffer:
p q r s <ENT> E f g h I j k l m n o
41EH 420H 422H 424H 426H 428H 42A 42C 42E 430 432 434 436 438 43A 43C

La INT 09H no acepta ningún carácter adicional ya que la parte final avanzaría a la
parte inicial y la INT 16H miraría el buffer como vacío.

Actividad 10.3

1. Diseñe un programa para el despliegue de un menú (un menú de 5 opciones)


que permita al usuario presionar las teclas direccionables para seleccionar un
elemento dentro del menú. Resalte la opción seleccionada por el usuario.

2. Modifique el programa para que después del borrado inicial de la pantalla se


presente al usuario la petición de presionar F1 para un menú en la pantalla,
Cuando presione la tecla F1 se despliegue el menú; permitirle a los usuarios la
selección de una opción del menú al presionar el primer carácter de la opción.
Una vez seleccionada la opción, desplegar un mensaje relacionado con la
selección y regresar al menú principal tecleando ESC.

Resumen

En este fascículo se profundizó el llamado de funciones de las interrupciones para


manejo de video y de teclado; los valores de llamado de estas funciones se
cargaron en el registro AH, utilizando los registros AL, CX, DX, etc. para entrada
de parámetros a las funciones o salida de las mismas.

Para el manejo de video, cuando la pantalla está en modo de texto, si está activo
un adaptador de vídeo monocromo, ocupa 4 Kb a partir del segmento 0B000h.
Con un adaptador de color, son 16 Kb a partir del segmento 0B800h. Un método
para averiguar el tipo de adaptador de video es consultar a la BIOS el modo de
video activo. Los modos 0 y 1 son de 40 columnas y el 2 y 3 de 80. Los modos 0 y
2 son de «color suprimido», aunque en muchos monitores salen también en color.

Cada carácter en la pantalla ocupa dos bytes consecutivos: en el primero se


almacena el código ASCII del carácter a visualizar y en el segundo los atributos de
color. Obviamente, en un modo de 80x25 se utilizan 4000 bytes (los 96 restantes
hasta los 4096 de los 4 Kb se desprecian). En los adaptadores de color, como hay
16 Kb de memoria para texto, se pueden definir entre 4 páginas de texto (80
columnas) y 8 (40 columnas). La página activa puede consultarse también
llamando a la BIOS, con objeto de conocer el segmento real donde empieza la
pantalla (B800 más un cierto offset). En el 97,5% de los casos sólo se emplea la
página 0, lo que no quiere decir que los buenos programas deban asumirla como
la única posible. El byte de atributos permite definir el color de fondo y de frente de
los caracteres, además características tales como intermitencia, video inverso y
subrayado, entre otros.

De igual manera cuando se trabaja con el teclado, al pulsar una tecla se genera
una interrupción 9 (IRQ 1) y el código de rastreo que identifica la tecla pulsada
puede leerse en el puerto de E/S 60h; si se suelta la tecla se produce otra
interrupción y se genera el mismo código de rastreo + 128 (bit 7 activo). Por
ejemplo, si se pulsa la 'A' se generará una INT 9 y aparecerá en el puerto del
teclado (60h) el byte 1Eh, al soltar la 'A' se generará otra INT 9 y se podrá leer el
byte 9Eh del puerto del teclado.

La rutina que gestiona INT 9 deposita en un buffer dos bytes con su código ASCII
y el código de rastreo, para cuando el programa principal decida explorar el
teclado, lo hará siempre consultando el buffer. Si el código ASCII depositado es
cero ó 0E0h, se trata de una tecla especial (ALT-x, cursor, etc.) y el segundo byte
indica. El código ASCII 0E0h sólo es generado en los teclados expandidos por las
teclas expandidas, así mismo, el código ASCII 0F0h está reservado para indicar
las combinaciones de ALT-tecla.
Bibliografía recomendada

Tokheim Roger L. Fundamentos de los microprocesadores. México: Mc Graw Hill,


1998.

Brey Barry B. Los microprocesadores INTEL. México: Prentice Hall, 1994.

Stallings William, Organización y arquitectura de computadores. España: Prentice


Hall, 2000.

Abel Peter, Lenguaje ensamblador y programación para el PC IBM y compatibles.


México: Pearson Educación, 1996.

Nexo

En el siguiente fascículo se trabajará con el conjunto de órdenes para la


manipulación de cadenas de caracteres, operaciones lógicas y aritméticas,
operaciones con datos ASCII y BCD, y manipulación de tablas.
Autoevaluación formativa

1. Construir un programa en ensamblador que permita crear una animación de


recuadros por páginas de tamaño creciente, presentando las páginas en forma
de sucesión rápida para dar la sensación que el recuadro crece.

2. Construir un programa que permita desplegar un mensaje en el centro de la


pantalla y que cumpla con las siguientes especificaciones:

a. Desplegar un menú con las siguientes opciones: despliegue de


mensaje, modificación de mensaje y de salida del programa.
b. Desplegar un submenú para la opción despliegue de mensaje que
permita al usuario escoger entre despliegue de derecha a izquierda o
de izquierda a derecha o desde el centro de la pantalla; se deben
ejecutar las opciones del submenú.
c. Desplegar un submenú para la opción modificación de mensaje que
permita al usuario modificar y actualizar el mensaje.

Las opciones del menú y del submenú deben permitir selección a través de
teclas abreviadas.
Lenguaje de Máquina
Semestre 5
Fascículo No. 11

Tabla de Contenido
Contenido
Operaciones avanzadas del microprocesador
Manipulación de cadenas de caracteres
Prefijo de repetición de cadena
Mover una cadena de caracteres
Cargar una cadena de caracteres
Almacenar una cadena de caracteres
Comparar un patrón
Búsqueda de cadenas
Procesamiento de caracteres ASCII y BCD
Procesamiento de datos ASCII
Suma ASCII
Resta ASCII
Procesamiento de datos BCD desempaquetados
Multiplicación ASCII
División ASCII
Ejecución de operaciones lógicas y aritméticas
Suma y resta
Desbordamientos
Extensión de un número en un registro
Aritmética con acarreo
Desbordamiento aritmético
Multiplicación
Multiplicación de palabras múltiples
División
Desbordamientos e Interrupciones
División por medio de corrimientos
Procesamiento de tablas
Direccionamiento directo de tablas
Listas ligadas
Resumen
Bibliografía recomendada
Párrafo nexo
Autoevaluación formativa
Operaciones avanzadas del microprocesador

En este fascículo se estudiará la operación con cadenas de caracteres,


procesamiento de caracteres ASCII, operaciones lógicas y aritméticas y el manejo
de tablas de datos.

Se estudiarán instrucciones del lenguaje ensamblador para la operación con


cadenas de caracteres que permiten mover, cargar almacenar y comparar el
contenido de registros con localidades de memoria o viceversa.

Se hará una introducción al manejo de operaciones aritméticas de suma, resta,


multiplicación y división y se tendrá especial consideración con las restricciones
que se presentan para estas operaciones dependiendo del tamaño de datos a
procesar. Estas restricciones se relacionan con los desbordamientos y las
interrupciones que se generan. Los datos ingresados por teclado se almacenan en
forma de caracteres ASCII; para la operación de estos datos se debe ajustar el
resultado, para generar la conversión de BCD a binario, ya que las operaciones
aritméticas se realizan en forma binaria.

Finalmente se introducirá el concepto de tablas y el manejo del direccionamiento


de datos dentro de las tablas.

Indicadores de logros

Al erminar el estudio del presente fascículo, el estudiante:

• Utiliza las instrucciones para el manejo de cadenas de caracteres.


• Maneja las instrucciones para las operaciones aritméticas y de manipulación
de caracteres ASCII.
• Reconoce y explica las restricciones que se presentan al realizar operaciones
aritméticas con datos de diferentes longitudes y datos con signo y sin signo.
• Utiliza el direccionamiento a datos dentro de una tabla.

Manipulación de cadenas de caracteres

Una instrucción de cadena tiene una versión para byte, palabra o palabra doble;
utiliza como operandos los registros ES:DI o DS:SI. Estas instrucciones se
codifican de dos maneras:

Operación Instrucción Operandos Operación con bytes Operación con palabra Operación con palabra doble
Mover MOVS ES:DI, DS:SI MOVSB MOVSW MOVSD
Cargar LODS AX, DS:SI LODSB MOVSB MOVSD
Almacenar STOS ES:DI, ES:DI STOSB STOSW STOSD
Comparar CMPS DS:SI, ES:DI CMPSB CMPSW CMPSD
Rastrear SCAS ES:DI, AX SCASB SCASW SCASD

Observación
Usted puede utilizar la instrucción y los operandos o puede cargar la dirección de
los operandos en los registros DI y SI y codifica las instrucciones MOVSB,
MOVSW, MOVSD sin operandos.

Prefijo de repetición de cadena

El prefijo REP inmediatamente antes de una instrucción de cadena, como REP


MOVSB, proporciona una ejecución repetida con base en un contador inicial que
se establece en CX. REP ejecuta la instrucción de cadena disminuyendo CX,
hasta que CX sea cero.

La bandera de dirección DF indica la dirección en que la operación se ejecuta, DF


en cero genera procesamiento de izquierda a derecha, DF en uno procesamiento
de derecha a izquierda.

Este prefijo permite algunas variaciones tales como REPE ó REPZ y REPNE ó
REPNZ; la repetición de la instrucción ocurre si ZF es cero y se detiene cuando ZF
sea diferente de cero ó CX sea cero; ó la repetición depende de que ZF sea
diferente de cero y se detiene cuando ZF sea igual acero o CX llegue a cero.

Mover una cadena de caracteres

La operación de mover una cadena de caracteres MOV combinada con el prefijo


REP y una longitud en CX puede mover cualquier cantidad de caracteres.

[Etiqueta:] REP MOVSn [ES:DI, DS:SI]

La cadena receptora se define como ES:DI y la cadena origen como DS:SI.


Inicialice el registro ES y DS antes de utilizar MOVSn.

Carga una cadena de caracteres

La orden LODS carga AL con un byte, AX con una palabra, EAX con una palabra
doble desde una posición de memoria, la dirección de memoria depende de ES:DI.
La dirección depende del bit de dirección, se incrementa o disminuye el DI en un
byte, en 2 ó en 4 dependiendo de la palabra.
Almacenar una cadena de caracteres

El comando STOS almacena los contenidos de los registros AL, AX ó EAX en un


byte o una palabra, o una palabra doble en la memoria; la posición de memoria
depende del registro ES:DI; dependiendo del bit de dirección DI aumenta o
disminuye.

Comparar un patrón

El comando CMPS compara el contenido de una localidad de memoria,


direcionada por DS:SI con otra direccionada por ES:DI; dependiendo de la
bandera de dirección CMPS aumenta o disminuye el valor de SI, DI. CMPS
proporciona una comparación de valores ASCII.

Búsqueda de cadenas

El comando SCAS busca en una cadena por un valor de un byte, palabra o


palabra doble; SCAS compara el contenido de una localidad de memoria [ES:DI]
con el contenido de AL ó AX ó EAX, dependiendo de la bandera de dirección
SCAS incrementa o disminuye el valor de DI.

Actividad 11.1

Realice un programa que solicite el ingreso de nombre con un máximo de


caracteres de longitud, si el nombre contiene caracteres tales como *, #, %
borrarlos. Este programa deberá desplegar los datos ingresados alineados a la
izquierda, uno debajo del otro y borrar los datos entrados por teclado.

Procesamiento de caracteres ASCII y BCD

El formato decimal codificado en binario BDC permite un redondeo aproximado de


números sin perdida de precisión. Se pueden almacenar dígitos en formato BCD
como empaquetado y desempaquetado.

BCD empaquetado almacena un carácter en los cuatro bits inferiores y pone cero
en los bits supriores, BCD empaquetado contiene 2 dígitos BCD, uno en los bits
superiores y otro en los bits inferiores.

Procesamiento de datos ASCII

Los datos ingresados desde teclado están en formato ASCII. Un número decimal
como 1234 estaría como 31323334H. Para realizar operaciones aritméticas es
necesario ajustar los valores ASCII almacenados.

Suma ASCII

La operación AAA ajusta el resultado de una suma de caracteres ASCII, verifica el


dígito de la extrema derecha del registro AL; si el dígito está entre A y F o la
bandera de acarreo auxiliar es uno, la operación suma 6 al registro AL, suma 1 a
AH y pone en uno la bandera de acarreo y acarreo auxiliar.

MOV BL, 38H ; Primer operando 38H


MOV AL, 34H ; Segundo Operando 34H
ADD AL, BL ; Resultado 6C
AAA ; Ajusta el resultado a 0102H (AL = 6 + C = 12, AL & OFH, AH =AH +1,)
OR AX, 3030H ; se genera de nuevo el código ASCII 3132H

Resta ASCII

La instrucción AAS ajusta el resultado de una resta. Verifica el dígito de más a la


derecha de AL; si el dígito está entre A y F ó la bandera auxiliar de acarreo está en
uno, la operación resta 6 del AL, resta 1 a AH, y pone uno en las banderas AF y
CF. En todos los casos el dígito de más a la izquierda de AL se pone en cero.

MOV AL, 34H


SUB AL, F8H ; Resultado FCH
AAS ; Ajuste a FF06H, se realiza complemento a 10
OR AL, 30H ; resulta 34H

Procesamiento de datos BCD desempaquetados

La multiplicación y división de números ASCII necesita que primero los números


sean convertidos al formato BDC desempaquetados, las instrucciones AAM y AAD
realizan aritmética de forma directa sobre numeras BCD desempaquetados.
Multiplicación ASCII

La instrucción AAM ajusta el resultado de la multiplicación de datos ASCII en el


registro AX. Primero debe convertir el valor ASCII a BCD desempaquetado,
eliminando el 3 de cada byte, en el dígito de más a la izquierda.

AAM divide AL entre 10 (0AH) y almacena el cociente en AH y el residuo en AL.

MOV AL, 35H ; Multiplicando


MOV CL, 39H ; Multiplicador
AND AL, 0FH ; AL = 05H
AND CL, 0FH ; CL = 09H
MUL CL ; Resultado = 2D
AAM ; 2DH / 0AH , AH = 04, AL = 05
OR AX,3030H ; AX = 3435H

División ASCII

La instrucción AAD proporciona corrección de un dividendo ASCII antes de hacer


la división. AAD permite un dividendo de dos bytes en AX y el divisor sólo puede
ser un único byte con 01 a 09. AAD multiplica el AH por 10 (0AH), suma el
producto al AL y limpia el AH.

MOV AX, 3238H


MOV CL, 07H
AND AX, 0F0FH ; Convierte a BCD desempaquetado
AND CL, 0FH ; Convierte a BCD desempaquetado
AAD ; AH*10 =20 (14H), AL = AL + 14H = 1CH, AH = AH & 00
DIV CL ; Divide entre 7H

Ejecución de operaciones lógicas y aritméticas

Suma y resta

La instrucción ADD y SUB realizan sumas y restas sencillas de datos de binarios.


La representación de los números negativos se hace en complemento a 2. Estas
instrucciones se pueden operar registro a registro, memoria a registro, registro a
memoria, registros a valor inmediato, memoria a valor inmediato.

Desbordamientos

Un byte permite un solo bit de signo y siete de datos (desde -128 a +127); una
operación aritmética puede sobrepasar fácilmente la capacidad de un byte.

MOV AL, 60H ; AL = 01100000


ADD AL, 20H ; AL = AL + 00100000 = 10000000, AL = 80H, OF, SF = 1

El resultado es -128, y no 128 porque la bandera SF esta en 1.

Extensión de un número en un registro

Una manera de solucionar el desbordamiento es extender el byte a una palabra,


pasar de AL a AX, el signo se traslada a AH, por medio de la instrucción CBW.
Ladillo
El lenguaje ensamblador convierte de manera automática el contenido de las
palabras, si define 1538H, se convierte a 3815H.

Actividad 11.2

El siguiente algoritmo muestra la suma aritmética de palabras múltiples;

CLC ; Se inicializa la bandera de acarreo en cero.


MOV CX, 02 ; Define dos ciclos.
LEA SI, WORD1A
LEA DI, WORD2A
LEA BX, WORD3A
E20:
MOV AX, [SI]
ADC AX, [DI] ; Suma con acarreo a AX
MOV [BX], AX
INC SI
INC SI
INC DI
INC DI
INC BX
INC BX
LOOP E20
RET

WORD1A DW 0BC62H ; Datos de los operadores


WORD1B DW 0123H
WORD2A DW 553AH
WORD2B DW 0012H

Con ayuda del Debug analice el programa para suma generalizada, los dos
valores a sumar son: 62BC2301H y 3A551200

Aritmética con acarreo

Una operación aritmética que causa un acarreo externo del bit de signo, pone uno
en la bandera de acarreo. Si el acarreo ocurre en datos sin signo el resultado no
es válido.

Binario Decimal sin signo Decimal con signo OF CF


11111100 252 -4
+ 00000101 +5 +5
(1)00000001 1 1 0 1

Desbordamiento aritmético

Una operación aritmética pone uno en la bandera de desbordamiento cuando tiene


un acarreo hacia el bite de signo y no tiene un acarreo hacia afuera, o bien ocurre
un acarreo externo sin acarreo interno:

Binario Decimal sin signo Decimal con signo OF CF


01111001 121 + 121
+ 00001011 + 11 + 11
10000100 132 - 124 1 0

O poner uno en las banderas CF y OF:


Binario Decimal sin signo Decimal con signo OF CF
11110110 246 - 10
+ 10001001 + 137 - 119
(1)01111111 127 +127 1 1

Multiplicación

Hay dos formas de instrucción multiplicación: MUL, para datos sin signo e IMUL
para datos con signo. Las operaciones de multiplicación básicas son byte por byte,
palabra por palabra, y palabras dobles por palabras dobles.

Para multiplicar dos números de un byte, el multiplicando está en el registro AL y


el multiplicador es un byte de memoria o en otro registro. El resultado se carga en
AX.

Para multiplicar dos números de una palabra el multiplicando está en el registro


AX y el multiplicando es una palabra en memoria o en registro. El producto
generado por la instrucción MUL DX es una palabra doble que necesita dos
registros: la parte alta en DX y la parte baja en AX.

Para multiplicar palabra doble por palabra doble, el multiplicando está en el


registro EAX y el multiplicador es una palabra doble en un registro o en memoria.
El producto generado está en EDX:EAX.

Multiplicación de palabras múltiples

Multiplicación por corrimiento. Para multiplicar por potencias de 2 es más eficiente


correr sólo el número necesario de bits a la izquierda.
SHL AX, 01H ; Multiplica por 2
MOV CL, 03H
SHL AX, CL ; Multiplicar por 8

División

Hay dos formas de instrucción división: DIV, para datos sin signo e IDIV para
datos con signo. Las operaciones de división básicas son palabras entre byte,
palabra doble entre palabra, y palabra cuádruple entre palabra doble.

Para dividir una palabra por byte, el dividendo está en AX, y el divisor es un byte
de memoria o en otro registro. El resultado se carga en AX. En AH el residuo y el
cociente en AL.

Para dividir palabra doble por palabra, el dividendo está en el par DX:AX y divisor
es una palabra en memoria o en otro registro. El residuo se almacena en DX y el
cociente en AX.

Para dividir palabra cuádruple por palabra doble, el dividendo está en el par
EDX:EAX y el divisor es una palabra doble en un registro o en memoria. El residuo
está en EDX y el cociente en EAX.

Desbordamientos e interrupciones

Las operaciones DIV/IDIV suponen que el cociente es mucho menor que el


dividendo original; si no es así se puede generar desbordamiento; cuando se
presenta el desbordamiento se generan Interrupciones. La división por cero
siempre genera interrupciones. La división por uno genera un cociente igual al
dividendo y también podrid generar interrupción.

División por medio de corrimientos

Para la división entre una potencia de dos es más eficiente realizar sólo
corrimientos a la derecha del número necesario de bits.

SHR AX, 01 ; Divide entre 2


MOV CL, 03
SHR AX, CL ; Divide entre 8

Actividad 11.3

1. Realice un programa que permita al usuario calcular su sueldo a partir de los


datos ingresados desde teclado. Estos datos son: número de horas trabajadas
y el sueldo por hora trabajada.

2. Realice un programa que realice las operaciones aritméticas de suma, resta,


división y multiplicación para:
a) Datos almacenados en memoria.
b) Que realice operaciones entre bytes, palabras y palabras dobles.
c) Que despliegue los datos almacenados en memoria y los resultados de las
operaciones.
Procesamiento de tablas

Las tablas facilitan el manejo de datos utilizados por un programa para datos por
defecto o ingresados por teclado al programa; contienen datos como nombres,
descripciones, cantidades y precios. Para facilitar el manejo de estas tablas es
aconsejable definir datos con iguales longitudes en su estructura.

Direccionamiento directo de tablas

La definición de tablas y de datos con una igual longitud facilita el direcionamiento


de los datos en la tabla, pudiéndose posicionar cada dato de la tabla como la
dirección de inicio de la tabla sumada a la longitud de los datos multiplicada por n,
donde n es el número del dato dentro de la tabla. Este tipo de direccionamiento se
conoce como direccionamiento directo.

Para ordenar un dato dentro de una tabla, se compara la entrada de la tabla con la
entrada siguiente, si es mayor se intercambian las entradas, de esta manera se
comparan las entradas 1 y 2, la entrada 2 y 3, y así hasta el final de la tabla,
intercambiando las entradas cuando sea necesario. Repita el proceso desde el
inicio de la tabla si no hay intercambio la tabla esta ordenada.

Listas Ligadas.

Una lista ligada contiene datos llamados celdas, estos datos no tiene secuencia
específica sino que cada celda contiene un apuntador (puntero) a la celda
siguiente o la precedente para facilitar la búsqueda hacia delante o hacia atrás.
RESUMEN

En este fascículo se vieron operaciones con cadenas de caracteres que utilizan


los registros ES:DI para la cadena receptora y DS:SI para a cadena emisora, en
los comando MOVS (mover), LODS (Cargar), STOS (almacenar), CMPS
(Comparar), SCAS (Rastrear). El lenguaje ensamblador permite utilizar el
comando REP para procesar el número necesario de Bytes, palabras o palabras
dobles, utilice REP con MOVS y STOS y REPE o REPNE con CMPS y SCAS.

Para realizar la suma de varias palabras múltiples, utilice el ADC para tomar en
cuenta los acarreos de un ADD. Para realizar multiplicación y división de datos con
signo y sin signo utilice MUL, IMUL, DIV y IDIV respectivamente.

Con MUL si un multiplicador esta definido como Byte, el multiplicando es AL, si el


multiplicador es una palabra, el multiplicando es AX; si el multiplicador es una
palabra doble, el multiplicando es EAX.

Para la división DIV el divisor debe ser mayor que el contenido de AH. Si el divisor
esta definido como byte, el dividendo es AX; si el divisor es una palabra, el
dividendo es DX:AX, si el divisor es una palabra doble, el dividendo es EDX:EAX.

Las operaciones aritméticas con caracteres ASCII ingresados desde teclado


requieren de ajustes de los resultados para la suma (AAA), para la resta (AAS),
para la multiplicación (AAM), para la división (AAD), ya que todas las operaciones
aritméticas se realizan de manera binaria.

Para el trabajo con tablas se aconseja que las entradas a la tabla estén
relacionadas y tengan la misma longitud y formato de datos. Si las entradas a una
tabla cambian con frecuencia almacénela en el disco, actualice la tabla en el disco
y acceda a los datos de la tabla desde el disco para no modificar el programa
base.
BIBLIOGRAFIA RECOMENDADA

Tokheim Roger L. Fundamentos de los microprocesadores. Mc Graw Hill, México,


1998.

Brey Barry B. Los microprocesadores INTEL. Prentice Hall, México, 1994.

Stallings William, Organización y arquitectura de computadores. Prentice Hall,


España, 2000.

Abel Peter, Lenguaje ensamblador y programación para el PC IBM y compatibles.


Pearson Educación, México, 1996.

NEXO

En el siguiente fascículo se tratara el almacenamiento de información en los


discos, el control de lectura y escritura en los discos mediante archivos,
operaciones del DOS y de BIOS para manejo de información en disco.
AUTOEVALUACIÓN FORMATIVA 11

Lenguaje de máquina - Fascículo 11.

Apellidos: ______________________________________________
Nombre: _____________________________ Fecha: __________
Ciudad: _____________________________ Semestre: _______

1. Utilice la siguiente definición de datos y codifique las operaciones de la a) a la f)

DATASG SEGMENT PARA


CONAME DB ‘SPACE LAUNCHES, LAUNCHES, INC’
PRLINE DB 20 DUP (‘’)

a) Mover CONAME a PRLINE de izquierda a derecha.


b) Mover CONAME a PRLINE de derecha a izquierda.
c) Cargar el tercer y cuarto byte de CONAME en el AX
d) Almacenar el AX empezando en PRLINE + 5
e) Comparar CONAME con RLINE (serán diferentes).
f) Rastrear CONAME por un carácter Blanco y si se encuentra uno moverlo a
BH

2. Definir un campo de cuatro bytes con el valor hexadecimal 030405b4. Utilice


MOVSW para duplicar este campo 20 veces en un área de 80 bytes y despliegue
el resultado.

3. a) ¿Cuáles son los números máximos en un byte, en una palabra, en una


palabra doble para datos con signo y sin signo?

4. Para los siguientes datos, definidos en orden inverso, realice las preguntas de la
a) a la e).
DATA DW 0148H
DW 2316H
DATAY DW 0237H
DW 4502H
DATAZ DW 0
DW 0
DW 0

a) Codifique las instrucciones para sumar DATAX a DATAY, la palabra doble


que empieza en DATAX y en DATAY.
b) Cual es el efecto de las siguientes instrucciones

STC
MOV BX,DATAX
ADC BX,DATAY

c) Además de cero ¿Que divisores provocan un error por desbordamiento?


d) Codifique las instrucciones para dividir la palabra DATAX entre 23 y la
palabra doble que empieza en DATAX entre la palabra DATAY.

5. Codifique un programa que determine el tamaño de la memoria de la


computadora, convierta el tamaño a formato ASCII y despliéguelo en la pantalla
como se muestra:

El tamaño de la memoria es nnnn bytes.

6. Realice un programa que proporcione un cifrado sencillo de información. Defina


una tabla de traducción para convertir los datos de una manera aleatoria y una
tabla de traducción que invierta la información. El programa debe cumplir las
siguientes especificaciones:
Introduzca los datos a encuitar desde teclado, encriptelos y despliegue la
información encriptada, descifre la información y despliegue la información
descifrada.
Lenguaje de Máquina
Semestre 6
Fascículo No. 12

Tabla de Contenido
Contenido
Entrada y salida avanzada del PC (primera parte)
Introducción
Almacenamiento de información en discos
Organización del almacenamiento en disco
Pistas y sectores
Cilindros
Controlador de disco
Grupos
Capacidad de disco
Área de sistema y área de datos en disco
Área de sistema
Sectores asignados para el área de sistema
Área de datos
Registro de arranque
Directorio
Tabla de asignación de archivos, FAT
Primer entrada de la FAT
Segunda entrada de la FAT
Apuntadores a entradas de apuntadores en la FAT
Procesamiento de archivos en disco
Escritura y lectura de archivos
Códigos de error de regreso
Uso de manejadores de archivo para manejo de archivos en disco
Crear archivo
Escribir registros
Cerrar archivo
Abrir el archivo
Leer registro
Operaciones del DOS para soporte de discos y archivos
Operaciones básicas del BIOS para disco, INT 13H
Resumen
Bibliografía recomendada
Párrafo nexo
Autoevaluación formativa
Entrada y salida avanzada del PC (primera parte)

El sistema de almacenamiento en disco constituye el soporte externo de la


información. Los datos se registran sobre la superficie del disco en pistas. Una
pista es la cantidad de información accesible desde una determinada posición de
la cabeza de lectura/escritura. La información de cada pista está dividida en
bloques del mismo tamaño llamado sectores. Un sector es la unidad básica de
entrada/salida. Un disco tiene una serie de superficies de grabación llamadas
caras. Cada cara corresponde con una cabeza de lectura escritura.

Indicadores de logros

Al terminar el estudio del presente fascículo, el estudiante:

• Define el almacenamiento de datos en disco y los procesos que involucra.


• Conceptualiza acerca de la organización de los discos: las pistas, sectores,
cilindros y grupos.
• Define y reconoce el área de sistema y de datos en un disco.
• Adquiere habilidades en el procesamiento de archivos; crea, abre y cierra
archivos y modifica registros en archivos.
• Reconoce la utilidad del uso de los manejadores de archivo para la creación
de archivos, la lectura/escritura en disco, etc.
• Maneja algunas de las utilidades de BIOS y de DOS para soporte de disco
y archivos.

A través de BIOS se accede a sectores individuales de disco y DOS permite


acceso a archivos de datos. Los archivos son una colección de registros; cada
archivo se almacena en el disco y su nombre se registra en el directorio.
Los niveles de entrada salida en un disco quedan reflejados en el siguiente
esquema:

Programa de usuario
Entrada/salida de ficheros
DOS
Entrada y salida de sectores
BIOS
Comandos adaptador de disco
Adaptador de DISCO
Señales Hardware
Unidad de Disco

Almacenamiento de información en discos

Organización del almacenamiento en disco

Los discos son el principal medio de almacenamiento. Pueden ser unidades de


disco flexible, o discos duros. Constan, básicamente, de una superficie magnética
circular dividida en pistas concéntricas, cada una de las cuales se subdivide, a su
vez, en cierto número de sectores de tamaño fijo. Como normalmente se emplean
ambas caras de la superficie, la unidad más elemental posee en la actualidad dos
cabezas de lectura/escritura, una para cada lado del disco. Los tres parámetros
comunes a todos los discos son, por tanto: el número de cabezas, el de pistas y
el de sectores.
Pistas y sectores

Cada lado de un disco flexible o de un disco duro contiene varias pistas


concéntricas, numeradas iniciando con 00, la pista más externa. Cada pista está
formateada en sectores de 512 bytes, en donde se almacena la información.

Los dispositivos de discos flexibles y de discos duros se hacen funcionar por un


controlador que maneja la colocación de las cabezas de lectura/escritura sobre la
superficie del disco y la transferencia de información entre el disco y la memoria.

Cilindros

El cilindro es el conjunto de todas las pistas con el mismo número en cada


superficie de un disco flexible o de un disco duro. Por tanto el cilindro 0 es el
conjunto de pistas numeradas con 0, el cilindro 1 es el conjunto de pistas con
número 1, y así sucesivamente. Cuando se escribe un archivo, el sistema llena
todas las pistas de un cilindro y después avanza las cabezas de lectura/escritura
al cilindro siguiente.

Controlador de disco

El controlador de disco maneja toda la comunicación entre el procesador y el


disco, acepta información del procesador y la convierte en una forma que pueda
ser usada por el disco.

El procesador está liberado para otras tareas mientras el controlador realiza su


trabajo. El controlador utiliza el método de acceso directo a memoria (DMA). El
procesador proporciona al controlador por medio del comando de lectura o
escritura, la dirección del búfer de E/S en memoria, el número de sectores a
transferir y el número de cilindro, cabeza y sector inicial. Con este método, el
procesador tiene que esperar hasta que el DMA esté completo, ya que sólo un
componente a la vez puede utilizar la ruta a la memoria.

Grupos

Un grupo es un conjunto de sectores que el DOS trata como una unidad de


espacio de almacenamiento. El tamaño de grupo siempre es una potencia de 2.
Por lo común un disco duro tiene cuatro sectores por grupo. En un dispositivo de
disco que utiliza un sector por grupo, sector y grupo son lo mismo. Un archivo
empieza en una frontera de grupo y necesita un mínimo de un grupo aunque el
archivo sólo ocupe uno de los cuatro sectores. Un grupo se puede traslapar de
una pista a otra.

Un archivo de 100 bytes almacenado en un disco con cuatro sectores por grupo
utiliza 4 x 512 = 2,048 bytes de almacenamiento, aunque sólo un sector contendría
información. El DOS almacena los grupos para archivo en orden ascendente,
aunque un archivo puede estar fragmentado de manera que resida, por ejemplo,
en los grupos 8, 9, 10, 14, 17 y 18.

Capacidad de disco

Para unidades de disco flexible se presentan las siguientes capacidades de


almacenamiento.
Capacidad cilindros Sectores Bytes/sector Total 2 lados Sectores/ grupo
5.25"360KB 40 9 512 368,640 2
5.25"1.2MB 80 15 512 1,228,800 1
3.5"720KB 80 9 512 737,280 2
3.5"1.44MB 80 18 512 1,474,560 1
3.5"2.88MB 80 36 512 2,949,120 —

Observación
En los discos duros, las capacidades varían considerablemente por dispositivo y
por partición.

Área de sistema y área de datos en disco

Para dar cuenta de la información almacenada en disco, el DOS reserva ciertos


sectores para sus propios objetivos. Cuando los discos duros o flexibles están
formateados para autoarranque, esto es, son capaces de procesar el inicio cuando
se enciende el PC, la organización general de un disco es un área de sistema,
seguida por un área de datos que comprende el resto del disco.

Área de sistema

El área de sistema es la primer área del disco, en la (s) pista (s) más externa (s)
iniciando con el lado 0, pista 0, sector 1. La información que el DOS almacena y
mantiene en su área de sistema es utilizada para determinar, por ejemplo, la
ubicación de cada archivo que será accesado. Los tres componentes del área de
sistema son:
1. Registro de arranque.
2. Tabla de asignación de archivos (FAT).
3. Directorio.

El área de sistema y el área de datos están acomodadas así:

Registro de arranque FAT Directorio Archivos de sistema Archivos de usuario


Archivos de sistema Área de datos

Sectores asignados para el área de sistema

La lista siguiente da la organización de varios tipos de dispositivos y muestra los


números de los sectores de inicio y final para el registro de arranque, la FAT y el
directorio:

Dispositivo Arranque FAT Directorio Sector/Grupo


5.25"360KB 0 1-4 5-11 2
5.25"1.2MB 0 1-14 15-28 1
3.5"720KB 0 1-6 7-13 2
3.5"1.44MB 0 1-18 19-32 1

En los discos duros, las ubicaciones del registro de arranque y de la FAT, por lo
común, son las mismas que para un disco flexible; el tamaño de la FAT y la
ubicación del directorio varían por dispositivo.
Área de datos

El área de datos en un disco o disco flexible de arranque empieza con los archivos
del sistema IOSYS.SYS y MSDOS.COM (para MS-DOS). Cuando utiliza FORMAT
/S para formatear un disco, el DOS copia sus archivos de sistema a los primeros
sectores del área de datos. Los archivos del usuario siguen de manera inmediata
a los archivos de sistema o, si no existen archivos de sistema, empiezan al inicio
del área de datos.

Un disco flexible de dos lados formateado con nueve sectores por pista contiene la
información siguiente:

Lado 0 Pista 0 Sector 1 Registro de arranque


Lado 0 Pista 0 Sector 2-3 FAT
Lado 0 Pista 0 Sector 4-7 Directorio
Lado 1 Pista 0 Sector 1-3 Directorio
Lado 1 Pista 0 Sector 4- Sg. Área de Datos

Los registros para los archivos de datos empiezan en el lado 1, pista 0, sector 3 al
9. El sistema almacena los registros siguientes en el lado 0, pista 1, después en el
lado 1, pista 1, después lado 0, pista 2, y así sucesivamente. Esta característica
de llenado de datos en pistas opuestas (en el mismo cilindro) antes de proceder
con el siguiente cilindro reduce el movimiento de la cabeza del disco y es el
método usado en ambos tipos de discos, flexibles y duros.

Registro de arranque

El registro de arranque contiene las instrucciones que cargan los archivos del
sistema IOSYS.SYS, MSDOS.COM y COMMAND.COM desde el disco a la
memoria. Todos los discos formateados tienen este registro aun cuando no estén
almacenados en ellos los archivos de sistema. El registro de arranque contiene la
información siguiente, en orden de dirección de desplazamiento:
00H Salto cercano o lejano a la rutina de arranque en el desplazamiento 1EH o 3EH en el registro de
arranque
03H Nombre del fabricante y número de la versión del DOS cuando me creado el arranque
0BH Bytes por sector, por lo común 200H (512)
0DH Sector por grupo (1, 2, 4 u 8)
0EH Sectores reservados
10H Número de copias de la FAT (1 o 2)
11H Número de entradas en el directorio raíz
13H Si el volumen es menor que 32 MB, número total de sectores
15H Byte de descripción de medio (igual al primer byte de la FAT, descrita posteriormente)
16H Número de sectores para la FAT
18H Número de sectores por pista
1AH Número de cabezas (lados o superficies) de lectura/escritura
1CH Número de sectores ocultos
1EH Cargador de la rutina de arranque para las versiones del DOS hasta la 3.3
20H Si el volumen es menor que 32 MB, número total de sectores
24H Número de unidad física (para discos flexibles, A = 0; para disco duro, 80H = unidad C, etc.)

Directorio

Todos los archivos en un disco empiezan en una frontera de grupo, que es el


primer sector del grupo. Para cada archivo, el DOS crea una entrada de directorio
de 32 (20H) bytes que describe el nombre del archivo, la fecha en que fue creado,
su tamaño y la ubicación de su grupo inicial. Las entradas del directorio tienen el
formato siguiente:
BYTE PROPÓSITO
00H-07H Nombre del archivo. El primer byte del nombre del archivo también puede indicar el estado del
archivo:
00H El archivo nunca ha sido utilizado
05H Actualmente el primer carácter del nombre del archivo es E5H
2EH La entrada es para un subdirectorio
E5H El archivo ha sido borrado
08H-0AH Extensión del nombre del archivo
0BH Atributo del archivo, define el tipo de archivo (observe que un archivo puede tener
más de un atributo):
00H Archivo normal
01H Archivo que sólo puede ser leído (sólo lectura)
02H Archivo oculto, en una búsqueda de directorio no se despliega
04H Archivo del sistema DOS, no desplegado por una búsqueda de directorio
08H Etiqueta de volumen (si éste es un registro de etiqueta de volumen, la etiqueta misma
está en los campos de nombre y extensión del archivo)
10H Subdirectorio
20H Archivo resguardado, que indica si el archivo fue reescrito en su última actualización
Como ejemplo, el código 07H significaría un archivo del sistema (04H) que es de sólo lectura
(01H) y oculto (02H).
0CH-15H Reservado por el DOS.
16H-17H Hora del día en que el archivo fue creado o actualizado por última vez; almacenada con 16 bits
en formato binario como |hhhhhmmmmmmsssss|.
18H-19H Fecha de creación o última actualización del archivo, almacenada con 16 bits en formato
binario como | yyyyyyym | mmmddddd |. El año puede ser 0-119 (suponiendo 1980 como el
punto de inicio), el mes puede ser 01-12 y el día puede ser 01-31.
1AH-1 BH Grupo inicial del archivo. El número es relativo a los dos últimos sectores del directorio. En
donde no existen archivos de sistema DOS, el primer archivo de datos inicia en la unidad de
asignación relativa 002. El lado, pista y grupo reales dependen de la capacidad del disco.
Una entrada cero significa que no hay espacio asignado para él.
1CH-1FH Tamaño del archivo en bytes. Cuando crea un archivo, el DOS calcula y almacena su tamaño
en este campo.
Tabla de asignación de archivos, FAT

El objetivo de la FAT es asignar espacio en disco para los archivos. La FAT


contiene una entrada para cada grupo en el disco. Cuando crea un archivo nuevo
o revisa un archivo existente, el DOS revisa las entradas asociadas de la FAT de
acuerdo con la ubicación del archivo en el disco. La FAT empieza en el sector 2,
inmediatamente después del registro de arranque. En un disco en donde un grupo
consta de cuatro sectores, el mismo número de entradas de la FAT puede hacer
referencia a cuatro veces la información que los discos en donde un grupo
consiste en un sector. En consecuencia, el uso de grupo con sectores múltiples
reduce el número de entradas en la FAT y permite al DOS direccionar un espacio
de almacenamiento mayor en disco.

Primer entrada de la FAT

El primer byte de la FAT, el descriptor de medio, indica el tipo de dispositivo


(observe también el byte 15H en el registro de arranque):

F0H 3.5”, dos lados, 18 sectores/pista (1.44 MB)


F0H 3.5”, dos lados, 36 sectores/pista (2.88 MB)
F8H Disco Duro (incluyendo disco RAM virtual)
F9H 3.5”, dos lados, 9 sectores/pista (720 KB)
F9H 5.25”, dos lados, 15 sectores/pista (1.2 MB)
FCH 5.25”, un lado, 9 sectores/pista (180 MB)
FDH 5.25”, dos lados, 9 sectores/pista (360 MB)
FFH 5.25”, dos lados, 8 sectores/pista (320 MB)

Segunda entrada de la FAT

La segunda entrada de la FAT contiene FFFFH para la FAT de discos flexibles


que permiten el uso de entradas de la FAT de 12 bits y FFFFFFH para discos
duros que permiten el uso de entradas de la FAT de 16 bits.

Como ya se describió, el primer campo en un disco es el registro de arranque,


seguido por la FAT y después por el directorio. El área de datos está después.

Apuntadores a entradas de apuntadores en la FAT

Después de las dos primeras entradas de la FAT están las entradas de


apuntadores que relacionan a cada grupo en el área de datos. El directorio (en
1AH – 1BH) contiene la ubicación del primer grupo para un archivo y la FAT
contiene una cadena de entradas de apuntadores para cada uno de los grupos
que le suceden. Desde el DOS 3.0, la longitud de la entrada para discos flexibles
es de tres dígitos hexadecimales (12bits) pero para disco duro es de cuatro dígitos
hexadecimales.

El término grupo relativo se refiere al grupo al cual apunta la entrada de la FAT. En


cierto sentido, las primeras dos entradas de la FAT (0 y 1) apuntan a los dos
últimos grupos en el directorio, que han sido asignados como el inicio de las
unidades de asignación; el directorio indica el tamaño y grupo inicial de los
archivos.

El directorio contiene el número de inicio del grupo para cada archivo y una
cadena de entradas del apuntador del FAT; éste indica la ubicación donde
continúa, si existe, el siguiente grupo. Un apuntador de entrada que contiene (F)
FFFH indica el último grupo en el archivo.
Procesamiento de archivos en disco

Los datos en el disco son almacenados en forma de archivo; el procesamiento de


archivos en disco duro es similar al de los discos flexibles; tiene que proporcionar
un nombre de ruta de acceso al archivo en los subdirectorios.

Escritura y lectura de archivos

El PSP contiene una tabla de manejadores de archivo por omisión que


proporciona 20 manejadores de archivo.

Códigos de error de regreso

Las operaciones de manejador de archivo en disco regresan un estado de


terminación por medio de la bandera de acarreo y el registro AX. Una operación
exitosa pone en cero la bandera de acarreo y realiza otras funciones apropiadas.
Una operación no exitosa pone en uno a la bandera de acarreo y regresa un
código de error en el AX, dependiendo de la operación.

01 Número no válido de función 20 Unidad desconocida


02 Archivo no encontrado 21 Unidad no preparada
03 Ruta no encontrada 23 Error de datos CRC
04 Demasiados archivos abiertos 25 Error de búsqueda
05 Acceso denegado 27 Sector no encontrado
06 Manejador no válido 28 Impresora sin papel
08 Memoria insuficiente 29 Falla al escribir
11 Formato no válido 30 Falla al leer
12 Código de acceso no válido 31 Falla generalizada
15 Especificación de unidad no válida 33 Violación de bloqueo
Apuntadores de archivo

El DOS mantiene un apuntador de archivo separado para cada archivo que un


programa está procesando. Las operaciones de crear y abrir fijan el valor del
apuntador de archivo en cero, la posición inicial del archivo. El apuntador de
archivo toma en cuenta de manera subsecuente el desplazamiento de la ubicación
actual dentro del archivo.

Cada operación de lectura/escritura hace que el DOS incremente el apuntador de


archivo por el número de bytes transferidos. Entonces, el apuntador de archivo
apunta a la posición del registro siguiente a ser accesado. Los apuntadores de
archivo facilitan tanto el procesamiento secuencial como el directo.

Uso de manejadores de archivo para manejo de archivos en disco

Crear archivo

Para crear un archivo nuevo o sobreescribir uno ya creado con el mismo nombre,
use primero la función 3CH del DOS (INT 21H). Cargue el CX con el atributo de
archivo requerido y el DX con la dirección de la cadena ASCII (con el camino y el
nombre del nuevo archivo). El DOS crea una entrada de directorio con el atributo
dado, limpia la bandera de acarreo y establece el manejador para el archivo en el
AX. Utilice este manejador de archivo para todas las operaciones subsecuentes
del disco.

El archivo nombrado está abierto con su apuntador de archivo fijado en cero y


ahora está preparado para escritura. Si un archivo con el nombre dado ya existe
en la ruta, la operación configura a cero la longitud para sobreescribir el nuevo
archivo en el anterior.

En condición de error, la operación pone en uno la bandera de acarreo y regresa


un código en el AX: 03, 04 o 05. El código 05 significa que o bien el directorio está
lleno o bien el nombre de archivo referenciado tiene el atributo de sólo lectura.

Escribir registros

Para escribir registros en disco, utilice la función 40H del DOS. Cargue el EX con
el manejador de archivo almacenado, el CX con el número de bytes a escribir y el
DX con la dirección del área de salida. Una operación válida escribe los registros
en el disco, incrementa el apuntador de archivo y en AX se carga el número de
bytes escritos. Una operación no válida pone en uno la bandera de acarreo y
regresa en AX el código de error 05 (acceso denegado) ó 06 (número de
manejador no válido).

Cerrar archivo

Cuando ha terminado de escribir en un archivo, tiene que cerrarlo. Cargue el


manejador de archivo en el BX y utilice la función 3EH del DOS. Una operación
correcta de cierre escribe cualquier registro restante en el búfer de la memoria y
actualiza la FAT y el directorio con la fecha y tamaño del archivo. Una operación
no exitosa pone en uno la bandera de acarreo y regresa el único código de error
posible en el AX, 06 (manejador no válido).
Abrir el archivo

Utilice la función 3DH del DOS para abrir un archivo. Cargue en el DX la dirección
de la cadena ASCIIZ necesaria y establezca AL con el código de acceso:

BITS PETICION
0-2 000 = Solo Lectura
001 = Solo escritura
010 = lectura/escritura.
3 Reservada
4-6 Modo compartido
7 Bandera heredada

Si un archivo con el nombre dado existe, la operación establece la longitud del


registro en uno (el cual puede pasarse por alto), asume el atributo actual del
archivo, establece el apuntador de archivo a cero (el inicio del archivo), pone en
cero la bandera de acarreo y establece un manejador para el archivo en el AX.
Utilice este manejador de archivo para todas las operaciones subsecuentes.

Si el archivo no existe, la operación pone en uno la bandera de acarreo y regresa


un código de error en el AX: 02, 03, 04, 05 o 12. Asegúrese de examinar primero
la bandera de acarreo. Por ejemplo, al crear un archivo tal vez envíe el manejador
05 al AX, lo cual podría con facilidad ser confundido con el código de error 05,
acceso denegado.

Leer registro

Para leer registros, utilice la función 3FH del DOS. Cargue el manejador de
archivo en el BX, el número de bytes a leer en el CX y la dirección del área de
entrada en el DX. Esta operación envía el registro al programa, pone en cero la
bandera de acarreo y establece el AX al número de bytes que en realidad se leyó.
Cero en el AX significa un intento de leer después del fin de archivo; ésta es una
advertencia, no un error. Una lectura no válida pone en uno la bandera de acarreo
y regresa al AX el código de error 05 (acceso denegado) o 06 (manejador no
válido).

Observación
Ya que DOS limita el número de archivos abiertos al mismo tiempo, un programa
que de manera sucesiva lee varios archivos debe cerrarlos tan pronto como sea
posible. El código siguiente lee un registro de 512 bytes.

Actividad 12.1

Implemente un programa que permita crear un archivo de nombres que un usuario


ingrese desde el teclado, y que permita consultar los datos guardados en el
archivo.

Utilice las funciones 3CH, 3DH y 3EH de DOS para crear, abrir y cerrar archivo y
40H y 3FH para escribir y leer registros en archivo. Por ejemplo para crear un
archivo utilice el siguiente procedimiento:

PATHNM1 DB ‘A:\NOMBRES.TXT’ , 00H


OPNMSG DB ‘*** OPEN ERROR ***’ , 0DH, 0AH
ERRCDE DB 00
HANDLE1 DW ?

C10CREA PROC NEAR


MOV AH, 3CH ; Petición para crear archivo
MOV CX, 00 ; Atributo normal
LEA DX, PATHNM1 ; Camino del archivo
INT 21H ; Llama al DOS
JC C20 ; Si hay error, sale
MOV HANDLE1, AX ; Guarda el manejador en una palabra
RET
C20:
LEA DX, OPNMSG
CALL X10ERR
RET
C10CREA ENDP

El procedimiento X10ERR le permite al usuario tener información de error cuando


se presenta un error en el llamado a la INT, en este caso si CF está en uno se
presenta el error.

X10ERR PROC NEAR


MOV AH, 40H ; Petición para crear archivo
MOV BX, 01 ; Atributo normal
MOV CX, 21 ; Atributo normal
INT 21H ; Llama al DOS
MOV ERRCDE, 01 ; Designa código de error
RET
X10ERR ENDP
Operaciones del DOS para soporte de discos y archivos

0DH Restablecer unidad de disco.


Salva todos los buffers de archivo (la operación no cierra de manera automática los archivos ni
regresa valores)
Entrada: AH = 0DH
0EH Seleccionar unidad por omisión
Entrada: DL = número de unidad (0 = Unidad A, 1= B)
Salida: AL = número de unidades, regresa el número 02 para un sistema con una sola unidad
19H Obtener la unidad de disco por omisión
Salida: AL = regresa un número de unidad (0 = A, 1 = B).
1BH Obtener información de la unidad por omisión
Regresa información acerca de la unidad por omisión, esta operación cambia el DS.
Salida: AL = el número de sectores por grupo, BX = el apuntador (DS BX) al primer byte (descriptor
de medios) en la FAT, CX = el tamaño del sector físico, por lo común 512, DX = el número de grupo
en el disco.
2EH Establecer/restablecer la verificación de escritura en disco
Permite verificar las operaciones de escritura en disco, es decir si la información se escribió de
manera apropiada. La operación activa un interruptor que le indica al sistema que verifique la
redundancia cíclica (CRC) del controlador del disco.
Entrada: AL = 00 desactiva la verificación, AL = 01 activa la verificación.
Una función relacionada, 54H, envía el estado actual del interruptor de verificación.
36H Obtener un espacio libre en el disco
Entrada: DL = número de unidad
Salida: AX = número de sectores por grupo, BX = número de grupos disponibles, CX = numero de
bytes por sector, DX = número total de grupo en el dispositivo.
44H Control de E/S para dispositivos (IOCTL)
IOCTL, comunica información entre un programa y un dispositivo abierto.
Entrada: AH = 44H, AL = número de subfunción para solicitar una de diferentes acciones.
Una operación válida pone en cero CF. Un error, como un manejador no válido de archivo, la pone
en uno y regresa un código de error estándar al AX.
00H Obtener información del dispositivo (AH = 44H, IOCTL)
Entrada: AL = 00
Salida: Una operación válida pone en cero CF y regresa un valor en DX, donde el bit 7 = 0 significa
que el manejador es de un archivo y bit 7 = 1 significa que es de un dispositivo. Los otros bits tienen
este significado:
Archivo (bit 7=0): 0-5 = Número de unidad (0 = A, 1 = B, etc.), 6 = 1 = archivo no se escribió
Dispositivo (bit 7= 1): 0 = Entrada estándar de la consola, 1= Salida estándar a la consola, 2 =
Dispositivo nulo, 3 = Dispositivo de reloj, 4 = Dispositivo especial, 5 = 0 = modo ACSII, 1= Modo
Binario, 6 = 0 = fin del archivo regresado, si el dispositivo es leído
Un error pone en uno la bandera de acarreo y regresa en el AX el código 01, 05 o 06.
01H Establece información del dispositivo (AH = 44H, IOCTL)
Carga el manejador de archivo en el BX y el bit de configuración en el DL para los bits 0 - 7, igual
que para la subfunción 00H. La operación establece la información del dispositivo.
Un error pone en uno la bandera de acarreo y regresa el código 01, 05, 06 o 0DH en el AX.
04H Leer datos de control de la unidad (AH = 44H, IOCTL)
Lee los datos de control de un controlador de dispositivo de bloque (unidad de disco)
Entrada: AL = 04H, BL = carga la unidad (0 = por omisión, 1 = A, etc.), CX = número de bytes a
leer, DX = La dirección del área de datos en el DX.
Salida: Una operación exitosa regresa al AX el número de bytes transferidos.
Un error pone en uno la bandera de acarreo y regresa el código 01, 05 o 0DH en el AX.
05H Escribir datos de control en la unidad (AH = 44H, IOCTL)
Escribe datos de control en un controlador de dispositivo de bloque. La configuración es la misma
que para la función 4404H.
0DH Escribir en un sector de disco (AH = 44H, IOCTL)
Entrada: BX = Unidad (0 = por omisión, 1 = A, etc.), CH = Categoría del dispositivo, CL,= 41H,
código secundario; escribir pista, DX apunta a un bloque de dispositivo con el formato siguiente:
devblock LABEL BYTE
specfunc DB 0 ;Función especial (cero)
rwhead DW cabeza ;Cabeza lectura/escritura
rwcyl DW cilindro ;Cilindro
rwsectl DW sector ;Sector inicial
rwsects DW número ;Número de sectores
rwbuffr DW buffer ;Desplazamiento del buffer
DW SEG_DATA ;Dirección del segmento de datos
La entrada rwbuffr proporciona la dirección del buffer. El operador SEG indica la definición de un
segmento, en este caso del segmento de datos, _DATA. El buffer identifica el área de datos que será
escrita y debe ser de la longitud del número de sectores x 512.
WRBUFFER DB 1024 DUP (?) ;Buffer de salida.
Una operación exitosa pone en cero la bandera de acarreo y escribe los datos. De otra manera, la
operación pone en uno la bandera de acarreo y regresa el código de error 01, 02 o 05 en el AX.
0DH Formatear pista (AH = 44H, IOCTL)
Entrada: BX = Unidad (0 = por omisión, 1 = A, etc.), CH = Categoría del dispositivo (08), CL=
42H, código secundario; formatear pista, DX apunta a un bloque con el formato siguiente:
blkname LABEL BYTE
specfun DB 0 ; Función especial, código 0
diskhd DW ? ; Cabeza de disco
cylindr DW ? ; Cilindro
tracks DW ? ; Número de pistas
Una operación exitosa pone en cero La bandera de acarreo y formatea las pistas. De otra forma, La
operación pone en uno La bandera de acarreo y regresa el código de error 01, 02 o 05 en el AX.
0DH Establecer la identificación de medio: (AH = 44H, IOCTL)
Entrada: BX = Unidad (0 = por omisión, 1 = A, etc.), CH = Categoría del dispositivo (08), CL =
46H, Código secundario; establecer ID del medio. El DX apunta a un bloque de medio con el formato
siguiente:
blkname LABEL BYTE
infolev DW 0 ; Nivel de información = 0
serialn DW ?? ; Número de serie
volabel DB 11 DUP (?) ; Etiqueta de volumen
filetyp DB 8 DUP (?) ; Tipo de FAT
El campo filetyp contiene el valor ASCII FAT12 o FAT16, con blancos al final. Una operación
exitosa pone en cero la bandera de acarreo y establece la identificación. De otra forma, la operación
pone en uno la bandera de acarreo y regresa el código de error 01, 02, 05 en el AX.
0DH Obtener parámetros del dispositivo (AH = 44H, IOCTL)
Entrada: BX = Unidad (0 = por omisión, 1 = A, etc.), CH = Categoría del dispositivo (08), CL =
60H, Código secundario; obtener parámetros. El DX apunta a un bloque de medio:
siguiente:specfun DB ? ; Función especial (0 a 1)
devtype DB ? ; Tipo de dispositivo
devattr DW ? ; Atributo del dispositivo
cylindr DW ? ; Número de cilindros
medityp DB ? ; Tipo de medio
bytesec DW ? ; Bytes por sector
secclus DB ? ; Sectores por grupo
ressect DW ? ; Número de sectores reservados
fats DB ? ; Número de FAT
rootent DW ? ; Número de entradas en el directorio raíz
sectors DW ? ; Número total de sectores
mediads DB ? ; Descriptor de medios
fatsecs DW ? ; Número de sectores por FAT
sectrak DW ?; Sectores por pista
heads DW ?; Número de cabezas
hidsect DD ? ; Número de sectores ocultos
exsects DD ? ; Número de sectores Si campo de sectores = 0
Si el campo specfun es 0, la información es acerca del medio por omisión en la unidad; Si es 1, la
información es acerca del medio actual. Una operación exitosa pone en cero la bandera de acarreo y
envía la información. De otra forma, la operación pone en uno la bandera de acarreo y regresa el
código de error 01, 02, 05 en el AX.
0DH Leer sector de disco (AH = 44H, IOCTL)
Entrada: CL = 61H código secundario.
Salida: Los detalles técnicos para La operación son idénticos a aquellos para el código secundario
41H,
39H Crear subdirectorio
Crea un subdirectorio, tal como lo hace el comando MKDIR del DOS.
Entrada: DX = cadena con la unidad y la ruta del directorio
Salida: Una operación exitosa pone en cero la bandera de acarreo; un error la pone en uno y regresa
eL código 03 o 05 en el AX.
3AH Eliminar subdirectorio
Elimina un subdirectorio, tal como lo hace el comando RMDIR del DOS.
Entrada: DX = cadena con la unidad y la ruta del directorio
Salida: Una operación exitosa pone en cero la bandera de acarreo; un error la pone en uno y regresa
el código 03, 05 o 10H en el AX.
3BH Cambiar de directorio actual
cambia el directorio actual a uno que usted especifique, tal como lo hace el comando CHDIR del
DOS
Entrada: DX = cadena con la nueva unidad y la ruta del directorio
Salida: Una operación exitosa pone en cero la bandera de acarreo; un error la pone en uno y regresa
el código 03 en el AX.
47H Obtener el directorio actual
Entrada: SI = direccion de buffer para contener el nombre de ruta (64 bytes), DL Unidad por
omisión, 1 = A, 2 = B, y así sucesivamente.
Salida: Una operación válida pone en cero la bandera de acarreo y envía el nombre del directorio
actual (pero no la unidad) al búfer como una cadena ASCII2, como: ASSEMBLE\ EXAMPLES 0
Un byte con 00H identifica el final del nombre de la ruta. Si el directorio solicitado es el principal
(raiz), el valor regresado es solo un byte de 00H. De esta manera, puede obtener el nombre de la ruta
actual a fin de accesar cualquier archivo en un subdirectorio. Un número no válido de unidad pone en
uno la bandera de acarreo y regresa el código de error 0FH en el AX.
41H Borrar archivo
Entrada: DX = La dirección de una cadena ASCII2 con la ruta al dispositivo y el nombre del
archivo, sin comodines.
Una operación válida pone en cero la bandera de acarreo, marca el nombre del archivo como borrado
en el directorio y libera en la FAT el espacio en disco asignado al archivo. Un error pone en uno la
bandera de acarreo y regresa el código 02, 03 o 05 en el AX.
43H Obtener o establecer atributo de archivo
Entrada: DX = La dirección de una cadena ASCII2 con la ruta al dispositivo y el nombre del
archivo, sin comodines, AL = 01 y CX = bit(s) de atributo.
Salida: Una operación válida pone en cero la bandera CF y regresa el atributo actual al CX (CH = 00
y CL = atributo):
Bit Atributo Bit Atributo
0 Solo lectura 3 Etiqueta de volumen
1 Archivo oculto 4 Archivo archivado
2 Archivo de sistema 5 Subdirectorio
Una operación no válida pone en uno la bandera CF y regresa el código 02, 03 o 05 aL AX.
56H Renombrar archivo o directorio
Entrada: DX = Dirección de una cadena ASCII con la unidad, ruta y nombre anteriores del archivo o
directorio que será renombrado, DI = con la dirección de una cadena ASCII con la unidad, ruta y
nombre nuevos, sin comodines.
Una operación exitosa pone en cero la bandera de acarreo; un error pone en uno la bandera de acarreo
y regresa en el AX el código 02, 03, 05 ó 11H.
Operaciones del BIOS para disco

Examinemos ahora la programación de las funciones del BIOS para leer, escribir,
formatear y verificar discos. La operación INT 13H del BIOS para disco, trata
información como el tamaño de un sector y maneja el direccionamiento en disco
en términos de los números de pista y sectores reales. Las operaciones del BIOS
para disco implican restablecer la lectura, escritura, verificación y formateo de la
unidad. La mayoría de las operaciones del BIOS para trabajo con disco son de
peligro potencial cuando se utilizan mal.

Byte del estado de BIOS

La mayoría de las funciones de la INT 13H del BIOS ponen en uno o en cero la
bandera de acarreo, si hubo un éxito o fracaso y regresan un código de error en el
registro AH. El BIOS, en su área de datos, mantiene información acerca de cada
dispositivo y su estado. El byte de estado refleja los bits indicadores que se
encuentran en el área de datos del BIOS en 40:41H para el área de datos de
unidades de discos flexibles y en 40:74H para el área de datos de disco duro.

Si una operación regresa un error, una acción común del programa es restablecer
el disco (función 00H) y reintentar la operación tres veces. Si aún persiste un error,
muestra un mensaje y da al usuario una oportunidad para cambiar el disco flexible,
si ésa es la solución del problema.

Código Estado
00H No hubo error
01H Comando incorrecto, no reconocido por el controlador
02H Marca de dirección en disco no se encontró
03H Intento de escribir en un disco protegido
04H Pista/sector no válido
05H Fallo en la operación de restablecer
06H Se retiró el disco flexible desde el último acceso
07H Parámetros de la unidad erróneos
08H Acceso directo a memoria (DMA) rebasado
….

Operaciones básicas del BIOS para disco, INT 13H

00H Restablecer el sistema de disco flexible.


Reinicializa el controlador de disco flexible o disco duro.
Entrada: DL = número de unidad (80H = la primera unidad, 81H = la segunda, etc.).
Salida: operación válida bandera de acarreo = 0, error = 1
AH = código de estado.
01H Leer estado del disco.
La operación examina el estado de la mayoría de las más recientes operaciones en disco.
Entrada: DL = el código (0 = unidad A, etc.) para disco flexible y un número de 80H o más (80H
= primer unidad, etc.) para disco duro.
Salida : AH = código de estado de la última operación en el disco
02H Leer sectores
Lee un número especificado de sectores en la misma pista y de manera directa los envía a la
memoria
Entrada: AL = Número de sectores, hasta el máximo por pista, CH = Número de pista (los
números inician con cero), CL = Bits 7-6 número de pista (bits superiores), Bits 5-0 número de
sector inicial (los números inician con uno), DH = Número de cabeza (lado) (0 o 1 para disco
flexible), DL = Número de unidad para disco flexible (0 = A) o unidad de disco duro (80H o
mayor), ES:BX = Dirección de un búfer de EIS en el área de datos, debe ser suficientemente grande
para todos los sectores que sean leídos. (En este caso BX está sujeto al ES.).
Operación válida: bandera de acarreo = 0
AL = número de sectores que La operación ha leído realmente.
Operación no valida: bandera de acarreo = 1
AH = código del estado en el AH, Restablece la unidad (función 00H) y reintenta la operación.
03H Escribir sectores
Escribe un área especificada desde la memoria (512 bytes o un múltiplo de 512) sobre sectores
designados formateados.
Operación válida: bandera de acarreo = 0
AL = número de sectores que La operación ha leído realmente.
04H Verificar sectores
Verifica que los sectores especificados puedan ser leídos y realiza una verificación de redundancia
cíclica (CRC). Cuando una operación escribe a un sector, el controlador del disco calcula y escribe
una suma de verificación CRC inmediatamente después del sector, con base en los bits que están en
uno. La función 04H lee el sector, recalcula la suma de verificación y la compara con el valor
almacenado. Puede utilizar esta función después de escribir (función 03H) para asegurar mayor
confianza en La salida, aunque a un costo de más tiempo de E/S.
Cargue los registros igual que para La función 02H, pero ya que La operación no realiza una
verificación real de Los datos escritos, no existe necesidad de establecer La dirección en el ES:BX.
05H Formatea pistas
La operación formatea pistas de acuerdo con uno de cuatro tamaños diferentes. Antes de la
ejecución de la operación, utilice la función 17H para establecer el tipo de disco flexible y la
función 18H para establecer el tipo de medio.
Entrada:
AL = Número de sectores a formatear
CH = Número de pista (los números inician con 0)
DH = Número de cabeza (lado) (0 o 1 para disco flexible)
DL = Número de unidad, para disco flexible (0 = A) o para disco duro (80H o mayor)
ES:BX = Dirección segmento:desplazamiento que apunta a un grupo de campos de dirección para
una pista
Para cada sector del disco flexible en una pista, debe estar una entrada de cuatro bytes de la forma
T/H/S/B, donde Byte:
0 T = número de pista (cilindro)
1 H = número de cabeza (superficie)
2 S = número de sector
3 B = bytes por sector ( 00H = 128, 01H = 256, 02H = 512H, 03H = 1024 ).
Actividad 12.2

Hasta aquí se han tratado algunas de las operaciones básicas de BIOS y DOS
para manejo de discos; el trabajo con estas funciones se realiza de igual manera
como se ha presentado a través de los fascículos anteriores y en éste; por
ejemplo, para leer datos de un sector mediante DOS utilice el siguiente
procedimiento:

B1OREAD PROC NEAR


MOV AX, 440DH ; IOCTL para dispositivo de bloque
MOV BX, 01 ; Unidad A
MOV CH, 08 ; Categoría del dispositivo
MOV CL, 61H ; Lee sector
LEA DX, RDBLOCK ; Dirección de la estructura de bloque
INT 21H
RET
B1OREAD ENDP

Donde DX debe apuntar a un bloque de dispositivo, definido en el segmento de


datos:
RDBLOCK LABEL BYTE ; Estructura
RDHEAD DW 0 ; del bloque
RDCYLR DW 0
RDSECT DW 8
RDNOSEC DW 1
RDBUFFR DW IOBUFFR
DW SEG 'DATA'
IOBUFFR DB 512 DUP(' ') ; Área del sector del disco

Para leer datos de un sector mediante BIOS utilice el siguiente procedimiento:

F1OREAD PROC NEAR


MOV AH, 02H ; Petición de lectura
MOV AL, 01 ; Numero de sectores
LEA BX, RECDIN ; Dirección del búfer
MOV CX, CURADR ; Pista/sector
MOV DH, SIDE ; Lado
MOV DL, 01 ; Unidad B
INT 13H
CMP AH, 00 ; ¿Lectura normal?
JZ F9O ; si, salir
MOV ENDCDE, 01 ; no:
CALL X1OERR ; lectura no válida
F9O:
INC CURADR ; Incrementa sector
RET
F1OREAD ENDP

Los datos que definen los parámetros utilizados en este procedimiento se definen
en el segmento de datos para mayor orden:

CURADR DW 0304H ; Pista/sector iniciales


ENDADR DW 0501H ; Pista/sector finales
ENDCDE DB 00 ; Indicador del fin del proceso
RECDIN DB 512 DUP(’ ‘) ; Área de entrada
SIDE DB 00

Utilice estos procedimientos para implementar un programa que lea sectores de


disco mediante BIOS y DOS, los envíe a memoria y despliegue su información en
pantalla.

Resumen

En este fascículo se introdujo la gestión y administración de los discos duros y


flexibles. Los discos constan básicamente de una superficie magnética circular
dividida en pistas concéntricas, cada una de las cuales se subdivide, a su vez, en
cierto número de sectores. Los parámetros más comunes de los discos son: el
número de cabezas, el de pistas, el de sectores y el de cilindros.

El controlador de disco maneja toda la comunicación entre el procesador y el


disco, acepta información del procesador y la convierte en forma que pueda ser
usada por el disco.

La organización de discos flexibles y de discos duros varía de acuerdo con su


capacidad. Cuando los discos duros o flexibles están formateados para
autoarranque tienen un área de sistema, seguida por un área de datos que
comprende el resto del disco. El registro de arranque contiene las instrucciones
que cargan los archivos del sistema IOSYS.SYS, MSDOS.COM y
COMMAND.COM desde el disco a la memoria.

El objetivo de la FAT es asignar espacio en disco para los archivos. La FAT


contiene una entrada para cada grupo en el disco. Cuando crea un archivo nuevo
o revisa un archivo existente, el DOS revisa las entradas asociadas de la FAT de
acuerdo con la ubicación del archivo en el disco.

El DOS mantiene un apuntador de archivo separado para cada archivo que un


programa está procesando. Las operaciones de crear y abrir fijan el valor del
apuntador de archivo en cero, la posición inicial del archivo. El apuntador de
archivo toma en cuenta de manera subsecuente el desplazamiento de la ubicación
actual dentro del archivo.

Cuando se usan manejadores de archivo las operaciones comunes para crear,


leer y escribir sobre un archivo son las siguientes:
• función 3CH del DOS para crear el archivo.
• función 40H del DOS para escribir registros en el archivo.
• función 3FH del DOS para leer registros del archivo.
• función 3EH del DOS para cerrar el archivo.
• función 3DH del DOS para abrir archivo.

Bibliografía recomendada

Rodríguez, Miguel Ángel. 8088-8086/ 8087 Programación ensamblador en entorno


MS DOS. Madrid: Ediciones Anaya Multimedia, 1987.

Tokheim, Roger L. Fundamentos de los microprocesadores. México: McGraw Hill,


1998.

Brey, Barry B. Los microprocesadores INTEL. México: Prentice Hall, 1994.

Stallings, William. Organización y arquitectura de computadores. España: Prentice


Hall, 2000.

Abel, Meter. Lenguaje ensamblador y programación para el PC IBM y compatibles.


México: Pearson Educación, 1996.

Nexo

En el siguiente fascículo se describen los requisitos para el manejo de impresión


por medio de las interrupciones del DOS y de BIOS.
Autoevaluación formativa

1. Diseñe y codifique un programa que permita:

• Ingresar desde el teclado los siguientes datos:

- Número de partes (tres caracteres)


- Descripción de partes (doce caracteres)
- Precios unitarios (Tres dígitos enteros, y dos decimales).

• Guardar los datos ingresados en un archivo.

• Leer los datos almacenados en el archivo.

El programa debe permitir consultas y cálculos con los datos del archivo. El
usuario puede consultar el valor total de un número de piezas determinada.

Cree una tabla en memoria para accesar los datos en memoria desde disco y
realizar los cálculos. Utilice manejadores de archivo para desarrollar el programa.

2. Diseñar un programa que permita a un usuario buscar y borrar un archivo de


un directorio específico:

ƒ El usuario podrá visualizar el contenido de un directorio y seleccionar


archivos.
ƒ Deberá pedir confirmación para borrar archivo.
Lenguaje de máquina
Semestre 6
Fascículo No. 13

Tabla de Contenido

Entrada y salida avanzada del PC (primera parte)


Caracteres comunes de control de la impresora
Impresión de caracteres
Impresión de un carácter
Caracteres especiales de control para la impresora
Funciones de la INT 17H del BIOS para impresión
Impresión de un carácter
Inicializar el puerto de la impresora
Determinar el estado de la impresora
Resumen
Bibliografía recomendada
Párrafo nexo
Autoevaluación formativa
Entrada y salida avanzada del PC (primera parte)

En este fascículo se introduce el manejo de impresión utilizando los servicios de


las INT de DOS y del BIOS. A nivel hardware la conexión de la impresora al PC se
hace por medio de una interfaz paralela; cada carácter se envía a la impresora
sobre ocho líneas de datos (una línea por Bit), y las señales de control se envían
por medio de las líneas de control:

1. Señal de autoalimentación.
2. Impresora ocupada.
3. Reconocimiento (desde la impresora al PC).
4. Fin de papel.
5. Error de entrada/salida
6. Inicialización de la impresora.
7. Selección (impresora en línea).

El manejo de impresión debe considerar el intercambio de información entre la


impresora y el procesador y viceversa.

Indicadores de logro

Al finalizar el estudio del presente fascículo, el estudiante:

• Define y utiliza el proceso de impresión de caracteres, el manejo de


caracteres de control, y el manejo de caracteres especiales de control para
la impresión.
• Maneja la INT 40H del DOS para impresión de cadenas de caracteres, y
manejo de la función 05H del DOS y 17H de BIOS para impresión de un
solo carácter a la vez.
• Define y utiliza los mensajes de error para manejo de impresión reportados
por el DOS y por el BIOS.

Para el manejo de impresión se utilizan funciones asociadas a la INT 21H del DOS
o por medio de la INT 17H del BIOS. El manejo de impresión debe considerar el
intercambio de información entre la impresora y el procesador, y viceversa;
usualmente las señales que envía el procesador son: saltar a una página nueva,
avanzar hacia abajo una línea o tabular y, a su vez, la impresora le envía al
procesador señales indicándole que está ocupada o sin papel.

Las interrupciones de DOS y de BIOS que permiten manejar la impresión son:

FUNCIONES DE LA INT 21H DEL DOS FUNCIONES DE LA INT 17H DEL BIOS
40H Imprime caracteres 00H Imprime un carácter
05H Imprime un carácter 01H Inicializa puerto
02H Obtiene estado del puerto de La impresora

Caracteres comunes de control de la impresora

Algunos de los caracteres estándar que controlan la impresión en todas las


impresoras se listan en la siguiente tabla:

Decimal Hex Función


09 09H Tabulación (tab) horizontal
10 0AH Avanza una Línea
12 0CH Avanza una página (avanza a la pagina siguiente)
13 0DH Retorno de carro (regresa al margen izquierdo)
• Tabulación horizontal. El carácter de control (09H) provoca que la impresora
coloque el carácter actual en la siguiente marca de tabulación.

• Avance de Línea (LF). El carácter de control de avance de línea (0AH) avanza


una sola línea.

• Avance de página (FF). El carácter de control de avance de página (0CH)


permite cambiar de página de impresión.

• Retorno de carro (CR). El carácter de retorno de carro (0DH) vuelve a colocar


la impresora en su margen izquierdo.

Impresión de caracteres

La función 40H de la INT 21H del DOS, permite utilizar los manejadores de archivo
para realizar impresión de caracteres; para esto cargue estos registros:

AH Función 40H
BX Manejador de archivo 04
CX Número de caracteres que se van a imprimir
DX Dirección del texto

Al final de una cadena de caracteres a imprimir, se deben adicionar caracteres de


control de impresión tales como retorno de carro (ODH) y avance de línea (OAH)
para lograr que la impresora reubique el carro y avance una línea.

HEADING DB ‘Prueba de Impresión LM’, 0DH, 0AH


MOV AH,40H ; Petición de salida
MOV BX,04 ; Manejador de archivo para impresora
MOV CX,25 ; Envía 24 caracteres
LEA DX,HEADING
INT 21H

Una operación exitosa imprime el texto, pone en cero la bandera de acarreo y


regresa el número de caracteres impresos en el AX. Una operación no válida
pone en uno la bandera de acarreo y regresa en el AX el código de error 05
(acceso denegado) o 06 (manejador no válido). Un marcador de fin de archivo
(Ctrl-Z o OAH) en los datos también provoca que la operación termine.

Impresión de un carácter

La función 05H del DOS proporciona facilidades para imprimir. Cargue la función
05H en el registro AH, el carácter que quiere imprimir en el DL y emita la INT 21H
como sigue:

MOV AH, 05H ; Petición para imprimir un carácter


MOV DL, char ; Carácter que se va a imprimir
INT 21H ; Llama al DOS

Estas instrucciones son adecuadas para enviar un solo carácter a la impresora.


Sin embargo, por lo regular, la impresión implica una línea de texto completa o
parte de ella y requiere pasar por una línea formateada en el área de datos.

HEADING DB ‘Prueba de Impresión LM’, 0DH, 0AH,0AH


MOV CX,25 ;Inicializa la longitud y
LEA SI,HEADING la dirección del encabezado
P20:
MOV AH,05H ;Petición para imprimir
MOV DL, [SI] un carácter del encabezado
INT 21H ;Llama al DOS
INC SI ;Siguiente carácter del encabezado
LOOPP2O

Caracteres especiales de control para la impresora

Otros comandos adecuados para la mayoría de impresoras comunes son los


siguientes:

DECIMAL HEX ACCION


08 08 Retroceso
11 0B Tabulador vertical
15 0F Activa modo condensado
14 0E Activa modo expandido
18 12 Desactiva modo condensado
20 14 Desactiva modo expandido

Algunos comandos necesitan un carácter (1 BH) Esc (escape) precediéndolos.


Algunos de estos comandos, según la impresora, son:

1B 30 Fija el interlineado a 8 líneas por pulgada


1B 32 Fija el interlineado a 6 líneas por pulgada
1B 45 Activa el modo de impresión enfatizado
1B 46 Desactiva el modo de impresión enfatizado

Para enviar los caracteres de control a la impresora defina los comandos en el


área de datos o utilice las instrucciones inmediatas. Para fijar el modo
condensado, 8 líneas por pulgada, imprime un título y provoca un retorno de carro
y un avance de línea; hágalo en el área de datos:
HEADING DB 0FH, 1BH, 30H, ‘Titulo …’, ODH, 0AH

O utilice las instrucciones inmediatas:

MOV AH, 05H ; Petición de impresión


MOV DL, 0FH ; Petición de modo condensado
INT 21H

Funciones de la INT 17H del BIOS para impresión

La INT 17H proporciona facilidades para imprimir en el nivel del BIOS. Los puertos
de impresión válidos para la INT 17H son 0 (por omisión), 1 y 2, para LPT1, LPT2
y LPT3, respectivamente.

La INT 17H proporciona tres funciones diferentes, como se especifica en el


registro AH:

1. Primero emita la función 02H para determinar el estado de la impresora, vía un


número de puerto seleccionado. Incluya esta prueba de estado antes de cada
intento de imprimir. Si la impresora está disponible, entonces:
2. Emita la función 01H para inicializar el puerto de impresión, y:
3. Emita operaciones de la función 00H para enviar caracteres a la impresora.

En AH se carga el estado de la impresora como sigue:

BIT CAUSA
0 Se acabo el tiempo
3 Error de entrada/salida
4 Seleccionada
5 No hay papel
6 Reconocimiento desde la impresora
7 No está ocupada

Si la impresora ya está encendida y preparada, la operación regresa 90H


(10010000 binario): la impresora no está ocupada, pero está seleccionada, una
condición válida.

Errores en la impresora son el bit 5 (no hay papel) y el bit 3 (error de salida). Si la
impresora no está encendida, la operación regresa B0H, o 10110000 binario,
indicando “No hay papel”.

Impresión de un carácter

La función 00H de INT 17H permite imprimir un carácter y permite impresoras en


los puertos 0, 1 ó 2. Cargue el carácter en el AL y el número del puerto de la
impresora en el DX:

MOV AH,00H ;Petición para imprimir


MOV AL,char ;Carácter que se va a imprimir
MOV DX,00 ;Selecciona el puerto 0 para la impresora
INT 17H ;Llama al BIOS

La operación regresa el estado al registro AH.


Inicializar el puerto de la impresora

La función 01H de la INT 17H selecciona un puerto, restablece la impresora y la


inicializa para datos:

MOV AH,01H ; Petición para inicializar el puerto


MOV DX,00 ; Selecciona el puerto 0 para la impresora
INT 17H ; Llama al BIOS

Ya que la operación envía un carácter de avance de página, puede usarla para


fijar la impresora en la posición superior de la página, aunque algunas impresoras
lo hacen de manera automática cuando se encienden. La operación regresa un
código de estado en el AH.

Determinar el estado de la impresora

La función 02H de la INT 17H determina el estado de la impresora:

MOV AH, 02H ; Petición para leer el puerto


MOV DX,00 ; Selecciona el puerto 0 para la impresora
INT 17H ; Llama al BIOS
TEST AH,001O1001B ;¿Está preparada?
JNZ errormsg ; no, mostrar mensaje

La operación regresa el mismo estado del puerto de impresión que la función 01H.

Antes de ejecutar cualquiera de operaciones de impresión del BIOS, verifique el


estado del puerto; si hay un error, muestra un mensaje. Cuando la impresora es
encendida, el mensaje ya no aparece e inicia la impresión de forma normal sin
pérdida de información.

Observación
En cualquier momento, una impresora puede quedarse sin papel o ser apagada
sin advertirlo. Si está escribiendo programas para que los usen otros, incluya una
prueba del estado antes de cada intento de imprimir.

Resumen

• Después de que la impresión esté terminada, utilice los comandos Avance


de línea o Avance de página para limpiar el buffer de impresión.
• La función 40H del DOS (la selección preferida) imprime cadenas de
caracteres, mientras que la función 05H del DOS y 17H de BIOS imprimen
un solo carácter a la vez.
• El DOS proporciona un mensaje si existe algún error en la impresora; el
BIOS sólo regresa un código de estado. Cuando utiliza la INT 17H del
BIOS, verifique el estado de la impresora antes de imprimir.

Bibliografía recomendada

Tokheim, Roger L. Fundamentos de los microprocesadores. México: McGraw Hill,


1998.

Brey, Barry B. Los microprocesadores INTEL. México: Prentice Hall, 1994.


Stallings, William. Organización y arquitectura de computadores. España: Prentice
Hall, 2000.

Abel, Peter. Lenguaje ensamblador y programación para el PC IBM y compatibles.


México: Pearson Educación, 1996.

Rodríguez, Miguel. Programación Ensamblador en entorno MS DOS. España:


Ediciones Anaya Multimedia, S.A., 1987.

Nexo

En este fascículo se abordó el manejo de la impresora utilizando puerto paralelo.


En el siguiente fascículo se abordaráel manejo de puertos, control de operaciones
del mouse y la generación de sonidos.
Autoevaluación formativa

1. Se necesita un programa que permita el ingreso de nombres por medio de


teclado, los despliegue en pantalla, y realice una impresión de ellos; cada
página impresa debe contener un encabezado seguido por un espacio doble y
los nombres ingresados.

Cree procedimientos para aceptar la entrada de nombres desde teclado,


imprima el nombre e imprima el encabezado. Considere las siguientes
indicaciones:

1.1. Despliegue un mensaje para la entrada de datos:


MOV AH, 40H ; Petición para desplegar
MOV BX,01
MOV CX,# de caracteres
LEA DX, Mensaje
INT 21H

1.2. Acepte la entrada por teclado


MOV AH,0AH ;Petición de entrada
LEA DX, Tabla entrada por teclado
INT 21H

1.3. Imprima el nombre ingresado; para esto verifique si la impresora se encuentra


al final, de la página si está al final cambie de página e imprima el encabezado:
CMP LINECTR,60 ;¿Fin de página?
JB Salto a impresión de otra línea.
CALL imprimir encabezado

1.3.1 Imprima el encabezado de la página.


MOV CX, longitud del encabezado
LEA DX, encabezado de pagina
MOV AH,40H
MOV BX,04
INT 21H

1.4. Si la impresora no se encuentra al final de la página imprima el nombre


entrado por teclado.

2. Diseñe e implemente un programa que permita imprimir el contenido de un


archivo; para esto el usuario debe introducir el nombre del archivo por teclado.

El programa deberá solicitar al usuario que introduzca el nombre del archivo,


deberá abrir el archivo, desplegar el contenido del archivo en pantalla e
imprimirlo. El usuario puede terminar la ejecución del programa presionando
enter.
Lenguaje de Máquina
Semestre 6
Fascículo No. 14

Tabla de Contenido
Entrada y salida avanzada del PC (segunda parte)
Puertos
Control de operaciones del mouse
Características del ratón
Funciones del ratón
Operaciones comunes del ratón
Inicializando el ratón
Desplegar el apuntador del ratón
Ocultar el apuntador del ratón
Obtener el estado del botón y la posición del apuntador
Establecer la posición del apuntador
Código ilustrativo
Obtener la información de la pulsación del ratón
Información de liberación del botón
Fijar límites horizontales para el apuntador
Fijar los límites verticales para el apuntador
Leer contadores de movimiento del ratón
Instalar manejador de interrupciones para eventos del ratón
Fijar el área de exclusión del apuntador
Establecer el umbral de velocidad doble
Establecer la sensibilidad del ratón
Obtener sensibilidad del ratón
Seleccionar la página de despliegue para el apuntador
Obtener la página de despliegue para el apuntador
Generación de sonidos
Resumen
Bibliografía recomendada
Párrafo nexo
Autoevaluación formativa
Entrada y salida avanzada del PC (segunda parte)

En este fascículo se describe el acceso a los puertos de la PC, el uso del ratón, y
la generación de sonido por medio de la bocina de la PC. Para el trabajo con el
ratón, los puertos y generación de sonidos se utilizarán las instrucciones:

INT 33H para el manejo del ratón.


IN y OUT para accesar los puertos.
Indicadores de logros

Al terminar el estudio del presente fascículo, el estudiante:

• Define los puertos de un PC, el manejo de ratón, y la generación de sonidos.


• Adquiere destrezas en el manejo de las instrucciones IN y OUT para la
entrada y salida de datos por los puertos, la programación para el ratón, y la
generación de sonido.

Puertos

Un puerto es un dispositivo que conecta a un procesador con el mundo exterior.


Por medio de un puerto, el procesador recibe una señal desde un dispositivo de
entrada y envía una señal a un dispositivo de salida. Los puertos son identificados
por sus direcciones en el intervalo de 0H - 3FFH, o 1,024 puertos en total.

Puede usar las instrucciones IN y OUT para manejar E/S directamente a nivel de
puerto:

IN transfiere información desde un puerto de entrada al AL si es un byte y al AX si


es una palabra. El formato general es:

IN reg-acum, puerto

OUT transfiere información desde un puerto de salida al AL si es un byte y al AX si


es una palabra. El formato general es:

OUT puerto, reg-acum


Las direcciones de puerto se pueden especificar de manera estática o
dinámicamente:

Estáticamente. Utilice un operando desde 0 hasta 255 directamente como:

Input IN AL, port# ; Entrada de un byte


Output OUT port#, AX ; Salida de una palabra

Dinámicamente. Utilice el contenido del registro DX, 0 a 65,535, indirectamente.

MOV DX,60H ; Puerto 60H (teclado)


IN AL,DX ; Obtiene un byte

Algunas de las direcciones de puertos principales son:

020H-023H Registros de la máscara de interrupción


040H-043H Temporizador/contador
060H Entrada desde el teclado
061H Bocina (bits 0 y 1)
200H-2OFH Controlador de juego
278H-27FH Adaptador paralelo de impresora LPT3
2F8H-2FFH Puerto serial COM2
378H-37FH Adaptador paraieio de impresora LPT2
3B0H-3BBH Adaptador de despliegue monocromo
3BCH-3BFH Adaptador paralelo de impresora LPT1
3C0H-3CFH EGA/ VGA
3D0H-3DFH Adaptador gráfico de color (CGA)
3F0H-3F7H Controlador de disco
3F8H-3FFH Puerto serial COM1

Aunque la práctica recomendada es utilizar las interrupciones del DOS y del BIOS,
puede con seguridad pasar por alto el BIOS cuando accese los puertos 21H, 40H,
42H, 60H, 61H y 201H.

Por ejemplo, al arranque, una rutina en ROM del BIOS busca el sistema por las
direcciones de los adaptadores de puertos paralelos y seriales. Si la dirección del
puerto serial es encontrada, el BIOS la coloca en su área de datos, empezando en
la localidad de memoria 40:00H; si las direcciones de los puertos paralelos son
encontradas, el BIOS las coloca en su área de datos, empezando en la localidad
40:08H. Cada localidad tiene espacio para entradas de una palabra. La tabla del
BIOS para un sistema con dos puertos seriales y dos puertos paralelos podría
verse así:

40:00 F803 COM1


40:02 F802 COM2
40:04 0000 no usada
40:06 0000 no usada
40:08 7803 LPT1
40:OA 7802 LPT2
40:OC 0000 no usada
40:OE 0000 no usada

Para utilizar la INT 17H del BIOS para imprimir un carácter, inserte el número del
puerto de la impresora en el registro DX:

MOV AH,00H ; Petición para imprimir


MOV AL, char ; Carácter que se va a imprimir
MOV DX,0 ; Puerto de impresora 0 = LPT1
INT 17H ; Llama al BIOS

Control de operaciones del mouse


Características del ratón

El ratón es un dispositivo común para apuntar, manejado por un controlador que


es instalado en el archivo CONFIG.SYS o AUTOEXEC.BAT. El controlador debe
ser instalado por un programa para responder a las acciones del ratón.

Todas las operaciones del ratón dentro de un programa son realizadas por las
funciones estándar de la INT 33H de la forma:

MOV AX, función ; Petición para el ratón parámetros


INT 33H ; Llama al controlador del ratón

Observación
Note que, a diferencia de las operaciones que utilizan el registro AH, las funciones
de la INT 33H son cargadas en el registro AX completo.

La primera instrucción del ratón que un programa emite es la función 00H, la cual
simplemente inicializa el controlador del ratón para el programa. La instrucción que
sigue es la 01H, que hace que el apuntador del ratón aparezca en la pantalla.
Después de eso, tiene opción de una amplia gama de operaciones con el ratón.

Algunas definiciones básicas con el ratón

• Mickey: Una unidad de medida del movimiento del ratón, aproximadamente


1/200 de una pulgada.
• Conteo de mickey: Número de mickey que el ratón rueda horizontal o
verticalmente. El conteo de mickey es utilizado por el controlador del ratón
para mover el apuntador en la pantalla un cierto número de pixeles.
• Apuntador del ratón: En modo de texto, el apuntador es un cuadro
intermitente, en video inverso; en modo gráfico, el apuntador es una punta
de flecha.
• Pixel: El elemento de la pantalla más pequeño que se puede direccionar.
Por ejemplo, para modo de texto 03 hay ocho pixeles por byte.
• Umbral de velocidad: La velocidad en mickey por segundo que el ratón
debe moverse para duplicar la velocidad del apuntador en la pantalla. Por
omisión es de 64 mickey por segundo.

Funciones del ratón

Las siguientes son las funciones disponibles del ratón para la INT 33H; por lo
común, relativamente pocas de ellas se usan:

00H Inicializa el ratón


01H Muestra el apuntador del ratón
02H Oculta el apuntador del ratón
03H Obtiene el estado del botón y la posición del apuntador
04H Establece posición del apuntador
05H Obtiene información del botón presionado del ratón
06H Obtiene información acerca de la liberación del botón
07H Fija limites horizontales para el apuntador
08H Fija limites verticales para el apuntador
09H Establece el tipo de apuntador gráfico
0AH Establece el tipo de apuntador en texto
0BH Lee los contadores de movimiento del ratón
0CH Instala el manejador de interrupciones para eventos del ratón
0DH Activa la emulación de una pluma óptica
0EH Desactiva la emulación de una pluma óptica
0FH Establece La relación mickey a pixel
1OH Establece área de exclusión del apuntador
13H Establece el umbral de velocidad doble
14H Intercambia interrupción de evento de ratón
15H Obtiene tamaño del búfer para estado del controlador del ratón
16H Guarda el estado del controlador del ratón
17H Restaura el estado del controlador del ratón
1 8H Instala manejador alterno para eventos del ratón
19H Obtiene dirección del manejador alterno
1AH Fija La sensibilidad del ratón
1BH Obtiene la sensibilidad del ratón
1CH Establece la velocidad de interrupción del ratón
1 DH Selecciona página de despliegue para el apuntador
1 EH Obtiene página de despliegue para el apuntador
1FH Deshabilita el controlador del ratón
20H Habilita el controlador del ratón
2 1H Restablece el controlador del ratón
22H Establece lenguaje para mensajes de controlador del ratón
23H Obtiene el número del lenguaje
24H Obtiene información del ratón

Operaciones comunes del ratón

Inicializando el ratón

La función 00H de la INT 33H inicializa el estado de un ratón, esta función deber
ser utilizada sólo una vez. Basta cargar el AX con la función 00H y emitir la INT
33H. La operación no necesita parámetros de entrada, regresa los valores:

AX = 0000H si no está disponible el soporte del ratón o FFFFH, si está disponible


BX = número de botones del ratón (si uno que le da soporte está disponible).

La operación inicializa el controlador del ratón como sigue:


• Establece el apuntador del ratón en el centro de la pantalla.
• Si está visible el apuntador lo oculta.
• Fija la página de despliegue del apuntador del ratón en cero.
• Establece el apuntador del ratón de acuerdo al modo de pantalla:
o Modo de texto = rectángulo, color inverso
o Modo gráfico = forma de flecha
• Establece la razón mickey a pixel:
o Razón horizontal = 8 a 8
o Razón vertical = 16 a 8
• Establece los limites horizontal y vertical para el apuntador al mínimo y
máximo
• Habilita el modo de emulación de pluma óptica
• Establece el umbral de velocidad doble a 64 mickey por segundo.

Desplegar el apuntador del ratón

La función 01H, permite que el apuntador del ratón sea mostrado. La operación no
necesita parámetros de entrada y no regresa valores.

El controlador del ratón mantiene una bandera del apuntador que determina si se
despliega o no el apuntador. Despliega el apuntador si la bandera es cero y lo
oculta para cualquier otro número.

Ocultar el apuntador del ratón

La función 02H permite ocultar el apuntador de ratón. Práctica estándar es emitir


esta función al final de la ejecución del programa; la operación no necesita
parámetros de entrada y no regresa valores.

La bandera del apuntador es desplegada cuando contiene un cero y se oculta para


cualquier otro número. Esta función disminuye la bandera para forzarlo a que se
oculte.

Obtener el estado del botón y la posición del apuntador

La función 03H brinda información útil acerca del ratón. No necesita parámetros de
entrada, regresa los valores:

BX = Estado de los botones de acuerdo con la posición del bit, como sigue:

Bit 0, botón izquierdo, donde 0 = arriba, 1 = abajo


Bit 1, botón derecho, donde 0 = arriba, 1 = abajo
Bit 2, botón central, donde 0 = arriba, 1 = abajo
Bits 3-15 reservados

CX = Coordenada horizontal (x)


DX = Coordenada vertical (y)

Las coordenadas horizontal y vertical son expresadas en términos de pixeles, aun


en modo de texto (8 por byte para modo de video 03).

Establecer la posición del apuntador

La función 04H fija las coordenadas horizontal y vertical para el apuntador del
ratón en la pantalla.
MOV AX, 04H ; Petición para colocar el apuntador del ratón
MOV CX,horizon-loch ;Posición horizontal
MOV DX,vertl-loch ; Posición vertical
INT 33H ;Llama al controlador del ratón

Actividad 14.1

Utilice el Debug para ejecutar el código siguiente. Si no se puede visualizar su


funcionamiento cree una archivo .ASM y ejecútelo.

MOV AX, 00H ; Petición para inicializar el ratón


INT 33H
CMP AX, 00H ; ¿Ratón disponible?
JE exit ; no, salir
MOV AX,01H ; Petición para mostrar el apuntador
INT 33H ; Llama al controlador del ratón
MOV AX, 01H ; Petición para colocar el apuntador
MOV CX,24 ; Posición horizontal
MOV DX,L6 ; Posición vertical
INT 33H ; Llama al controlador del ratón
MOV AX,02H ;Petición para ocultar el apuntador
INT 33H ; Llama al controlador del ratón

Obtener la información de la pulsación del ratón

La función 05H obtiene información acerca de la presión del botón; coloque el


número del botón en el BX, en donde 0 = izquierdo, 1 = derecho y 2 = central:
MOV AX, 05H ; Petición para información de presión del botón
MOV BX, button-no ; Número de botón
INT 33H ; Llama al controlador del ratón

La operación regresa el estado arriba abajo de todos los botones y el conteo de


presiones y posición de botón requerido:

AX = Estado de los botones de acuerdo con la posición del bit, como sigue:

Bit 0, botón izquierdo, donde 0 = arriba, 1 = abajo


Bit 1, botón derecho, donde 0 = arriba, 1 abajo
Bit 2 = Botón central, donde 0 = arriba, 1 = abajo Bits 3-15 reservados

BX = Contador de presiones del botón


CX = Coordenada horizontal (x) de la ultima presión del botón
DX = Coordenada vertical (y) de la ultima presión del botón

La operación reestablece el contador de presiones de botón en cero.

Información de liberación del botón

La función 06H permite obtener información acerca de la liberación del botón;


coloque el número del botón en el BX (0 = izquierdo, 1 = derecho, 2 = central):

MOV AX,06H ; Petición de información liberación del botón


MOV BX,button-no ; Número de botón
INT 33H ; Llama al controlador del ratón
La operación regresa el estado arriba abajo de todos los botones y el conteo de
liberaciones y posición del botón requerido, como sigue:

AX = Estado de los botones de acuerdo con la posición del bit, como sigue:
Bit 0, botón izquierdo, donde 0 = arriba, 1 = abajo
Bit 1, botón derecho, donde 0 = arriba, 1 = abajo
Bit 2, botón central, donde 0 = arriba, 1 = abajo
Bits 3-15 reservados

BX = Contador de liberaciones del botón


CX = Coordenada horizontal (x) de la última presión del botón
DX = Coordenada vertical (y) de la última presión del botón

La operación restablece en cero el contador de liberaciones del botón.

Fijar límites horizontales para el apuntador

La función 07H fija los límites horizontales mínimo y máximo para el apuntador:

MOV AX,07H ; Petición para fijar limite horizontal

MOV CX,min-loch ; Límite inferior


MOV DX,max-loch ; Limite superior
INT 33H ; Llama al controlador del ratón

Si el número mínimo es mayor que el máximo, la operación intercambia los


números. También la operación mueve el apuntador al área nueva, si es
necesario. Véanse también las funciones 08H y 10H.
Fijar los límites verticales para el apuntador

La función 08H fija los límites verticales mínimo y máximo para el apuntador:

MOV AX, 08H ; Petición para fijar límite vertical


MOV CX,min-loch ; Límite inferior
MOV DX,max-loch ; Límite superior
INT 33H ; Llama al controlador del ratón

Si el número mínimo es mayor que el máximo, la operación intercambia los


números. También la operación mueve el apuntador al área nueva, si es
necesario.

Leer contadores de movimiento del ratón

La función 0BH regresa el conteo de mickeys horizontales y verticales, desde la


última llamada a la función (dentro del intervalo - 32,768 a + 32,767). Los
números regresados son:

CX = Conteo horizontal (un número positivo significa recorrido a la derecha,


negativo significa a la izquierda)
DX = Conteo vertical (un número positivo significa recorrido hacia abajo, negativo
hacia arriba)

Instalar manejador de interrupciones para eventos del ratón

La función 0CH proporciona un manejador de eventos; por eso el software del


ratón interrumpe su programa y llama al manejador de eventos, el cual realiza la
función que requiere y, cuando termina la tarea, regresa a su programa en el
punto de ejecución.

Cargue el CX con una máscara del evento para indicar las acciones para las
cuales el manejador debe responder y el ES:DX con la dirección segmento:
desplazamiento de la rutina para manejar la interrupción:

MOV AX, 0CH ; Petición de manejador de interrupción


LEA CX, mask ; Dirección de la mascara del evento
LEA DX, handler ; Dirección del manejador (ES:DX)
INT 33H ; Llama al controlador del ratón

Defina la máscara del evento con los bits en uno necesarios:

• 0 =se movió el apuntador del ratón


• 1 =se presionó el botón izquierdo
• 2 =se liberó el botón izquierdo
• 3 =se presionó el botón derecho
• 4 =se liberó el botón derecho
• 5 =se presionó el botón central
• 6= se liberó el botón central
o reservados, define como en 0

Defina el manejador de interrupción como un procedimiento FAR. El controlador


del ratón utiliza una llamada lejana para entrar al manejador de interrupción con
estos registros establecidos:

AX = La máscara del evento como se definió, salvo que los bits están en uno solo
si la condición ha ocurrido
BX = Estado del botón; si está establecido, los bits significan lo siguiente:
0 botón izquierdo abajo
1 botón izquierdo abajo
2 botón central abajo
CX = Coordenada horizontal (x)
DX = Coordenada vertical (y)
SI = Ultimo conteo vertical de mickey
DI = Ultimo conteo horizontal de mickey
DS = Segmento de datos para el controlador del ratón

Fijar el área de exclusión del apuntador

La función 10H define un área en la pantalla en la que el apuntador no es


mostrado:

MOV AX,1OH ;Petición para fijar el área de exclusión


MOV CX,upleft-x ;Coordenada x de la esquina superior izquierda
MOV DX,upleft-y ;Coordenada y de la esquina superior izquierda
MOV SI,lowrgt-x ;Coordenada x de la esquina inferior derecha
MOV DI,lowrgt-y ;Coordenada y de la esquina inferior derecha
INT 33H ; Llama al controlador del ratón

Para reemplazar el área de exclusión, llame otra vez a la función con parámetros
diferentes o vuelva a emitir la función 00H o 01H.

Establecer el umbral de velocidad doble

La función 13H establece el umbral de velocidad en la que el movimiento del


apuntador en la pantalla es duplicada. Cargue el DX con el nuevo valor (por
omisión es 64 mickeys por segundo). (Véase también la función 1AH.)

Establecer la sensibilidad del ratón

La sensibilidad concierne al número de mickeys que el ratón necesita moverse


antes que el apuntador se mueva. La función 1AH fija el movimiento horizontal y
vertical del ratón en términos del número de mickeys por 8 pixeles. Así como el
umbral de velocidad en la que el movimiento del apuntador en la pantalla es
duplicado (véanse también las funciones OFH, 13H y 1BH):

MOV AX,1AH ; Petición para establecer sensibilidad del ratón


MOV BX,horzon ; Mickeys horizontales (por omisión = 8)
MOV CX,vertic ; Mickeys verticales (por omisión = 16)
MOV DX,threshold ; Umbral de velocidad (por omisión = 64)
INT 33H ; Llama al controlador del ratón

Obtener sensibilidad del ratón

La función 1BH regresa el movimiento horizontal y vertical de ratón en términos


del número de mickeys por 8 pixeles, así como el umbral de velocidad a la cual el
movimiento del apuntador en la pantalla es duplicado.

Selecciona la página de despliegue para el apuntador

La página de despliegue de video es establecida con la función 05H de la INT


10H. Para operaciones del ratón, coloque el número de la página en el BX y emita
la función 1DH de La INT 33H.

Obtener la página de despliegue para el apuntador

La función 1EH regresa en el BX, la actual página de despliegue de video.

Función 24H: Obtiene información del ratón

La función 24H regresa información acerca de la versión y tipo del ratón que está
instalado:

BH = Número principal de la versión


BL = Número secundario de la versión
CH = Tipo de ratón, en donde 1 = ratón de bus, 2 = ratón serial, 3 = ratón InPort, 4
= ratón P5/2 y 5 = ratón HP

Generación de sonidos

La PC genera sonido por medio de una bocina integrada de imán permanente.


Puede seleccionar una de dos formas para controlar la bocina o combinar ambas:
• Utilice el bit 1 del puerto 61H para activar el circuito de Interfaz Programable
de Periférico (PPI) Intel 8255A-5
• Emplee la compuerta del Temporizador Programable de Intervalo (PIT) Intel
8353-5. El reloj genera una señal de 1.19318 Mhz. El PPI controla la
compuerta 2 en el bit 0 del puerto 61H.
Resumen

En este fascículo se introdujeron los conceptos de puertos, las operaciones con


ellos, se profundizó en el manejo del ratón y además se introdujo el manejo de
sonidos. Son ideas centrales de esta temática:

• Por medio de un puerto, un procesador recibe una señal desde un


dispositivo de entrada y envía una señal a un dispositivo de salida. Los
puertos son definidos por su dirección, en el intervalo OH-3FFH, o 1,024 en
total.
• Las operaciones del ratón utilizan la INT 33H, con un código de función en
el AX.
• La primera operación de ratón a ejecutar es la función 00H, que inicializa el
controlador del Ratón.
• La función 01H es necesaria para mostrar el apuntador del ratón, 03H
obtiene el estado del botón y 04H obtiene la posición del apuntador.
• La PC genera sonido por medio de una bocina de imán permanente. Puede
seleccionar una de dos formas para manejar la bocina o combinar ambas.
Bibliografia Recomendada

Tokheim, Roger L. Fundamentos de los microprocesadores. México: McGraw Hill,


1998.

Brey, Barry B. Los microprocesadores INTEL. México: Prentice Hall, 1994.

Stallings, William. Organización y arquitectura de computadores. España: Prentice


Hall, 2000.

Abel, Peter. Lenguaje ensamblador y programación para el PC IBM y compatibles.


México: Pearson Educación, 1996.

Nexo

En el siguiente fascículo, el No. 15, se trabajaran conceptos de manejo de


memoria del DOS y de programas residentes.
Autoevaluación formativa

Realice los siguientes programas:

1. Un programa que muestre la posición del ratón cuando se desplaza a


través de una pantalla; la pantalla debe mostrar el valor de las posiciones
horizontal y vertical del apuntador a medida que el ratón se mueve. Cuando
el usuario presione el botón izquierdo del ratón se sale de DOS.

2. Un programa que genere una serie de notas de frecuencia ascendente


desde la bocina del PC.
Lenguaje de Máquina
Semestre 6
Fascículo No. 15

Tabla de Contenido
Contenido
Administración de la memoria del DOS
Área de memoria alta
Prefijo de segmento de programa (PSP)
Bloques de memoria
Obtener la dirección de la lista interna del DOS
Ejemplo de rastreo de bloques de memoria
Manejo de bloques de memoria superior
Cargador de programa
Carga y ejecución de un programa .COM
Carga y ejecución de un programa .EXE
Asignación y liberación de memoria
Asignación de memoria
Libere memoria asignada
Modificar el bloque de memoria asignada
Programas residentes
Obtiene la dirección de interrupción
Establece dirección de interrupción
Obtiene la dirección de la bandera ocupada del DOS
Resumen
Bibliografía recomendada
Párrafo nexo
Autoevaluación formativa
Entrada y salida avanzada del PC (tercera parte)

El DOS facilita funciones para la administración de la memoria del DOS tales


como la función 4A01H de la INT 2FH del DOS, la interrupción de múltiplex Ion, y
las siguientes funciones de la INT 21H:

25H Establece la dirección de la interrupción


31H Guarda el programa
3306H Obtiene la versión del DOS
34H Obtiene la dirección de bandera ocupada del DOS
35H Obtiene la dirección de la interrupción
48H Asigna memoria
49H Memoria libre asignada
4AH Modifica el bloque de la memoria asignada
4BH Carga o ejecuta un programa
5 1H Obtiene la dirección del segmento del PSP actual
52H Obtiene la dirección de la lista interna del DOS
58H Obtiene/establece la estrategia de asignación de memoria

Estas funciones nos permiten conocer, gestionar de una manera más eficiente la
manera de asignación de memoria de un PC cuando se carga un programa con
extensión .COM y .EXE.

El manejo de este tema será teórico y práctico para entender los conceptos a
tratar.

Indicadores de logros

Al finalizar el estudio del presente fascículo, el estudiante:


• Describe el proceso de arranque, la inicialización del DOS, el prefijo de
segmento de programa, el entorno (ambiente), control de memoria, el cargador
de programa y los programas residente.
• Describe la utilización de los bloques de memoria HMA.
• Define el PSP y explica cómo acecharlo.
• Explica el manejo de bloques de memoria asignados a un programa.
• Describe el proceso de carga de un programa .COM y .EXE
• Describe aspectos de la asignación de memoria y de los programas
residentes.

Administración de la memoria del DOS

Área de memoria alta

El procesador 80286 y posteriores utiliza la línea número A20, del bus de


direcciones, para direccionar un espacio de 64K conocido como área de memoria
alta (HMA) desde FFFF:10H hasta FFFF:FFFFH, justo abajo del límite de un
megabyte del DOS.

Cuando la computadora corre en modo real (8086), por lo regular deshabilita la


línea A20 de modo que las direcciones que pasan este límite “dan la vuelta” al
inicio de la memoria.

Habilitar la línea A20 permite direccionar localidades en la HMA. Se configura el


CONFIG.SYS para que reubique el DOS de memoria baja en el HMA, y por tanto
libere espacio para los programas del usuario.

La función 3306H de la INT 21H puede determinar la presencia del DOS en el


HMA:
MOV AX,3306H ; Petición de la versión del DOS
INT 21H ; Llama al DOS

La operación regresa lo siguiente:

DL = Número principal de la versión (como el 7 para la versión 7.1)


BH = Número secundario de la versión (como el 1 en la versión 7.1)
DL = Número de revisión en los tres bits inferiores (2-0)
DH = banderas de la aversión del DOS, en donde el bit 4 = 1 significa en el HMA

La función 4A01H de la INT 2FH del DOS proporciona una verificación del
espacio disponible en el HMA:

MOV AX,4A01H ; Petición de espacio en HMA


INT 2FH ; Llama al DOS

La operación regresa lo siguiente:

BX = Número de bytes libres disponibles en eL HMA (cero si el DOS no está


cargado en el área alta)
ES:DI = Dirección del primer byte libre en el HMA (FFFF:FFFF si el DOS no está
cargado en el área alta)

Prefijo de segmento de programa (PSP)

El DOS carga programas .COM y .EXE para ejecución en un segmento de


programa y crea un PSP en el desplazamiento 00H y el programa mismo en el
desplazamiento 100H del segmento. El PSP contiene los campos siguientes de
acuerdo con la posición relativa:

00-01H Una instrucción de la INT 2011 (CD2OH) para facilitar el regreso al DOS.
02-03H La dirección del segmento del último párrafo de la memoria asignada al programa, como
xxxxO. Por ejemplo, 640K se indica como 00A0H, para significar A0000[0].
04-09H Reservado por el DOS.
0A-0DH Dirección de terminación (dirección del segmento para INT 22H).
0E-11H Dirección de salida de Ctrl+ Break (dirección de segmento para la INT 23H).
12-15H Dirección de salida de error crítico (dirección de segmento para la INT 24H).
16-17H Reservado por el DOS.
18-2BH Tabla de manejadores de archivo por omisión.
2C-2DH Dirección de segmento del entorno del programa.
2E-31H Reservado por el DOS.
32-33H Longitud de la tabla de manejadores de archivo.
34-37H. Apuntador lejano a la tabla de manejadores
38-4FH Reservado por el DOS.
50-51H Llama a la función del DOS (INT 21H y RET).
52-5BH Reservado por el DOS.
5C-6BH Área de parámetro 1, formateado como un FCB (#1) estándar no abierto.
6C-7FH Área de parámetro 2, formateado como un FCB (#2) estándar no abierto; traslapado, si el FCB
en 5CH está abierto.
80-FFH Búfer por omisión para un DTA.

Cómo accesar el PSP

Para determinar la dirección del PSP, puede acceder sus datos para procesar
archivos especificados o tomar una acción especial. Un programa .EXE no
siempre puede suponer que su segmento de código sigue inmediatamente al PSP.
La función 51H del DOS envía al registro BX la dirección del segmento del actual
PSP. El código siguiente obtiene la dirección del PSP y la guarda en el registro es:

MOV AH,51H ; Petición de la dirección del PSP


INT 21H ; Llama al DOS
MOV ES,BX ; Guarda la dirección del PSP en ES

Ahora puede utilizar el ES para acceder los datos en el PSP:

CMP ES:BYTE PTR[80H],0 ; Verifica el buffer del PSP


JE EXIT ; cero, no hay datos

Para localizar el DTA para un programa .COM, sólo coloque 80H en el registro SI,
DI o BX y accese su contenido:

MOV SI,80H ; Dirección del DTA


CMP BYTE PTR[SI],0 ; Verifica el bufer (DS:SI)
JE EXIT ; cero, no hay datos

Bloques de memoria

El DOS permite que cualquier número de programas sean cargados y


permanezcan residentes. Ejemplos de esto incluyen a RAMDISK y MOUSE. El
DOS configura uno o dos bloques de memoria para cada programa cargado.
Precediendo de manera inmediata a cada bloque de memoria está un encabezado
de arena (o registro de control de memoria) empezando en una frontera de párrafo
y que contiene los campos siguientes:

00-00H Código, en donde 4DH (‘M’) significa que más bloques a continuación y 5AH (‘Z’) significa
cero bloques a continuación (el ultimo bloque). (Esta es una interpretación útil, pero no es
necesariamente la intención original.)
01 -02H Dirección del segmento del PSP del propietario. 0800H significa que el segmento pertenece al
MSDOS .SYS y 0000H significa que está liberado y disponible.
03-04H Longitud del bloque de memoria, medida en párrafos.
05-07H Reservada.
08-0FH Nombre de archivo del propietario, en formato ASCIIZ (desde el DOS 4.0).

Una lista enlazada hacia adelante conecta los bloques de memoria. El primer
bloque de memoria, configurado y apropiado por MSDOS.SYS, contiene: los
bufers de archivo del DOS, los FCB usados por funciones de manejadores de
archivos y controladores de dispositivos cargados por los comandos DEVICE en el
CONFIG.SYS.

El segundo bloque de memoria es la parte residente del COMMAND.COM con su


propio PSP. Unos cuantos programas especiales, como FASTOPEN y SHARE,
pueden ser cargados antes del COMMAND.COM.

El tercer bloque de memoria es el entorno maestro que contiene el comando


COMSPEC, los comandos PROMPT, los comandos PATH y las cadenas que se
establecen por medio de SET.

Los bloques sucesivos incluyen cualesquiera programas residentes (TSR) y el


programa actual que se está ejecutando. Cada uno de estos programas tiene dos
bloques; el primero es una copia del entorno y el segundo es un segmento de
programa con el PSP y el módulo ejecutable.

Obtener la dirección de la lista interna del DOS

El encabezado de arena para el primer bloque de memoria que pertenece a


MSDOS.SYS puede ser localizado por medio de una característica no
documentada: la INT 21H, función 52H.
La tabla de direcciones del DOS inicia con estas entradas:

00H DD Dirección del primer bloque de parámetros de La unidad


04H DD Dirección de la lista de tablas de archivo del DOS
08H DD Dirección del controlador de dispositivo CLOCK$
0CH DD Dirección del controlador de dispositivo CON

La función 52H regresa la dirección del segmento de la lista de tablas de archivos


del DOS (la segunda entrada) en el ES y un desplazamiento en el BX. Por tanto,
ES: [BX-4] apunta a la entrada precedente, que es una palabra doble en formato
IP:CS que contiene la dirección del primer encabezado de arena.

Para encontrar los bloques de memoria subsecuentes en la cadena:


• Utilice la dirección del encabezado de arena para el bloque de memoria.
• Sume 1 a la dirección del segmento del encabezado de arena para obtener el
inicio de su bloque de memoria. (El tamaño del encabezado de arena es de
1OH bytes.)
• Sume la longitud del bloque de memoria, que se encuentra en los
desplazamientos 03-04H del encabezado de arena.

Para determinar los párrafos de memoria disponible para el último programa,


encuentre el encabezado de arena que contiene “Z” en el byte 0 y realice Los
cálculos anteriores. El Último bloque tiene disponible, para él, toda La memoria
superior restante.

Actividad 15.1

1. Utilice el DEBUG para rastrear los bloques de memoria en su propio


sistema.
2. Utilice el DEBUG para realizar el rastreo de memoria requerida; proceda
como se muestra a continuación:

• La función 52H regresó 12CC:22 en el ES y 0026H en el BX. Como


queremos cuatro bytes a la izquierda de 0022H, utilice D 02CC:22 para
desplegar la dirección del encabezado de arena para el primer bloque de
memoria en el formato IP:CS. Esto produce 00 00 56 0B. Por lo tanto la
dirección es 0B56[0].

• Utilice D B56:0 para desplegar el primer encabezado de arena:

4D 08 00 AE 05

4D (“M”) significa que siguen más bloques de memoria; 0800 (0008H) indica que
el bloque de memoria pertenece a MSDOS.SYS, y AEO5 (O5AEH) es la longitud
del bloque de memoria.

• Localice el segundo encabezado de arena (COMMAND.COM):

Localidad del primer encabezado de arena: B5 6 [0]


Sume 1 párrafo: + 1 [0]
Sume la longitud de este bloque de memoria: + 5AE [0]
Localidad del siguiente encabezado de arena: 1105 [0]

Utilice D 1105:0 para desplegar el segundo encabezado de arena:

4D 06 11 64 01 .

En este momento, también podría examinar el contenido de COMMAND.COM.


• Localice el tercer encabezado de arena, el entorno maestro:
Localidad del encabezado de arena anterior: 1105 [0]
Sume 1 párrafo: + 1 [0]
Sume la longitud de este bloque de memoria: + 164 [0]
Localidad del siguiente encabezado de arena: 126A [0]

Utilice D 126A:0 para desplegar el tercer encabezado de arena: 4D...

Manejo de bloques de memoria superior

Desde el DOS 5.0, el CONFIG.SYS puede tener una instrucción DOS = UMB
(bloque de memoria superior) para asignar memoria a programas por arriba de la
memoria convencional, entre las fronteras de los 640K y 1024K. La instrucción
hace que el DOS establezca un encabezado de arena ficticio de 16 bytes antes de
la frontera de los 640K y lo marque como suyo; su campo del tamaño contiene un
número suficientemente grande para pasar cualquier búfer de video y rutinas de
ROM.

De esta manera, es posible configurar el último encabezado de arena en memoria


convencional para ubicar bloques de memoria en memoria superior. Dentro de la
memoria superior, otros encabezados de arena marcados como propios también
son utilizados para pasar áreas ya utilizadas por ROM o video.

Cargador de programa

Al cargar programas .COM y .EXE, el DOS realiza lo siguiente:


• Configura bloques de memoria para el entorno y el segmento del programa.
• Crea un prefijo de segmento de programa en su localidad 00H y carga el
programa en 100H.

Además de éstos, los pasos de carga y ejecución difieren para programas .COM y
.EXE. Una diferencia principal es que el enlazador inserta un registro de
encabezado especial en un archivo .EXE cuando lo almacena en disco; el
cargador del DOS utiliza este registro para realizar el cargado.

Carga y ejecución de un programa .COM

El DOS reconoce la extensión del archivo .COM. Al cargar un programa .COM, el


DOS:
• Establece los cuatro registros de segmento con la dirección del primer byte
del PSP.
• Establece el apuntador de la pila (SP) al final del segmento de 64K,
desplazamiento FFFEH (o al final de la memoria si el segmento no es lo
bastante grande) y guarda en la pila una palabra con ceros.
• Establece el apuntador de instrucciones en 100H (el tamaño del PSP) y
permite controlar para proceder a la dirección generada por CS:IP, la
primera localidad inmediata posterior al PSP. Este es el primer byte de su
programa y debe contener una instrucción ejecutable. La figura 24-2 ilustra
esta inicialización.

Carga y ejecución de un programa .EXE

El enlazador almacena en disco un módulo .EXE que consta de dos partes: un


registro de encabezado que contiene información de control y de reubicación, y el
módulo cargado real.
El encabezado tiene un mínimo de 512 bytes y puede ser más grande si hay
muchos elementos reubicables. El encabezado contiene información acerca del
tamaño del módulo ejecutable, donde será cargado en memoria, La dirección de la
pila y los desplazamientos de reubicación que serán insertados para direcciones
incompletas de máquina.

El sistema construye bloques (512 bytes) de memoria para el entorno y el


segmento de programa. A continuación están los pasos que el DOS realiza
cuando carga e inicializa un programa .EXE:

• Lee la parte formateada del encabezado y la envía a memoria.


• Calcula el tamaño del módulo ejecutable (tamaño total del archivo en la
posición 04H, menos el tamaño del encabezado en la posición 08H) y lee el
módulo a memoria en el segmento inicial.
• Lee los elementos de la tabla de reubicación y los envía a un área de
trabajo y suma el valor de cada elemento al valor del segmento inicial.
• Establece los registros DS y ES con la dirección del segmento del PSP.
• Establece el registro SS con la dirección del PSP, más 100H (el tamaño del
PSP), más el desplazamiento SS (en OEH). También, coloca en el registro
SP el número 1OH, el tamaño de la pita.
• Establece el CS con la dirección del PSP, más 100H (el tamaño del PSP),
más el desplazamiento CS en el encabezado (en 16H) para el CS. Además,
establece el IP con el desplazamiento en 14H. La pareja CS:IP proporciona
la dirección inicial del segmento de código y, en realidad, de la ejecución
del programa. La figura 24-3 ilustra esta inicialización.

Después de lo anterior, el DOS ha terminado con el encabezado y lo desecha. Los


registros CS y SS están correctamente establecidos, pero su programa tiene que
establecer el DS (y ES) para su propio segmento de datos:
MOV AX, datasegname ; Coloca las direcciones de
MOV DS, AX ; los segmentos de datos en los
MOV ES, AX ; registros DS y ES

Asignación y liberación de memoria

Los servicios del DOS le permiten asignar, liberar y modificar el tamaño de un área
de memoria. Los usos más comunes para estos servicios son con los programas
residentes y programas que cargan a otros programas para su ejecución. Bajo el
DOS, que fue diseñado como un ambiente de un solo usuario, un programa que
necesita cargar otro programa para ejecución tiene que liberar algún espacio de su
memoria.

Asignación de memoria

Para asignar memoria para un programa, solicite la función 48H y en el BX


coloque el número necesario de párrafos:

MOV AH,48H ; Petición para asignar memoria


MOV BX,paragraphs ; Número de párrafos
INT 21H ; Llama al DOS

Una operación exitosa pone en cero la bandera de acarreo y en el AX regresa la


dirección del segmento del bloque de memoria asignado. La operación inicia en el
primer bloque de memoria y pasa por cada bloque hasta que localiza un espacio lo
bastante grande para la petición, generalmente en el final de la memoria alta.

Una operación no exitosa pone en uno la bandera de acarreo y regresa en el AX


un código de error (07 = bloque de memoria destruido o bien 08 = memoria
insuficiente) y en el BX el tamaño, en párrafos del bloque más grande disponible.
Un bloque de memoria destruido significa que la operación encontró un bloque en
el que el primer byte no era ‘M’ o ‘Z’.

Libere memoria asignada

La función 49H libera memoria asignada; por lo común es usada para liberar un
programa residente. Cargue en el ES la dirección del segmento del bloque que
será regresado:

MOV AH,49H ; Petición para liberar memoria asignada


LEA ES,seg-address ; Dirección del bloque por párrafos
INT 21H ; Llama al DOS

Una operación exitosa pone en cero la bandera de acarreo y almacena OOH en el


segundo y tercer bytes del bloque de memoria, lo que significa que ya no está en
uso. Una operación no exitosa pone en uno la bandera de acarreo y regresa en el
AX un código de error (07 = bloque de memoria destruido o 09 = dirección no
válida de bloque de memoria).

Modificar el bloque de memoria asignada

La función 4AH puede aumentar o disminuir el tamaño de un bloque de memoria.


Inicialice el BX con el número de párrafos conservados para el programa y el ES
con la dirección del PSP:

MOV AH,4AH ; Petición para modificar la memoria asignada


MOV BX,paragraphs ; Número de párrafos
LEA ES,PSP-address ; Dirección del PSP
INT 21H ; Llama al DOS

Un programa puede calcular su propio tamaño restando el final del último


segmento de la dirección del PSP. Asegúrese que usa el último segmento, si su
enlazador reacomoda los segmentos en orden alfabético.

Una operación exitosa pone en cero la bandera de acarreo. Una operación no


exitosa la pone en uno y regresa en el AX un código de error (07 = bloque de
memoria destruido, 08 = memoria insuficiente y 09 = dirección no válida de bloque
de memoria) y regresa en el BX el tamaño máximo posible (si se hizo un intento
de aumentarlo). Una dirección errónea en el ES provoca un error 07.

Programas residentes

Varios programas populares y de shareware están diseñados para residir en


memoria mientras otros corren: se pueden activar sus servicios oprimiendo una
secuencia especial de teclas. Se cargan los programas residentes después que el
DOS y antes de activar otros programas de procesamiento normal. Casi siempre
son programas .COM y también son conocidos como “programas residentes en
memoria” (TSR; termina pero permanece residente).

La parte fácil de la escritura de un programa de estos es hacer que resida. En


lugar de la terminación normal, se sale por medio de la función 31H de la INT 21H
(mantener el programa). La operación necesita el tamaño del programa en el
registro DX:

MOV AH,31H ;Petición para TSR


MOV DX,prog-zize ;Tamaño del programa
INT 21H

Cuando se ejecuta la rutina de inicialización, el DOS reserva el bloque de memoria


en donde el programa reside y carga los programas subsecuentes superior en la
memoria.

La parte no tan fácil implica la activación del programa después de que queda
residente, ya que no es un programa interno del DOS como CLS, COPY y DIR. Un
enfoque común es modificar la tabla de servicios de interrupción de modo que los
programas residentes interrumpan cualquier tecleo, actúen sobre un tecleo
especial o una secuencia de tecleos y pasen por alto otros tecleos. El efecto es
que un programa residente, por lo común, aunque no necesariamente, conste de
las siguientes partes:

1. Una sección que redefina las localidades en la tabla de servicios de


interrupción.
2. Un procedimiento de inicialización que ejecuta sólo la primera vez el
programa y que realiza lo siguiente:
• Reemplaza la dirección en las tablas de servicios de interrupción con
su propia dirección.
• Establece el tamaño de la parte del programa que permanece
residente.
• Utiliza una interrupción que le indica al DOS que termine la ejecución
del programa actual y conecte a la memoria la parte especificada del
programa.
3. Un procedimiento que permanezca residente y que es activado, por ejemplo,
por una entrada especial desde el teclado o, en algunos casos, por un reloj.
En realidad el procedimiento de inicialización configura todas las condiciones para
hacer que el programa residente funcione y después él mismo se borre. La
organización de la memoria ahora aparece come sigue:

• Resto de Ia memoria disponible


• Parte del programa de inicialización (traslapado con el siguiente programa)
• Parte residente del programa (permanece en memoria)
• COMMAND.COM
• IO.SYS y MSDOS.SYS
• Tabla de servicios de interrupción

Observación
Un programa residente puede utilizar las funciones de la INT 21H para acceder la
tabla de servicios de interrupción, puesto que no hay seguridad de que
computadoras más avanzadas tendrán la tabla de interrupción localizada en las
mismas localidades de memoria.

Obtiene la dirección de interrupción

La función 35H de DOS permite recuperar la dirección de una interrupción


particular, cargue el AL con el número de la interrupción requerida:

MOV AH,35H ; Petición de interrupción


MOV AL,int# ; Numero de interrupción
INT 21H

La operación regresa la dirección de la interrupción en el ES:BX come


segmento:desplazamiento. Para memoria convencional, una petición para la
dirección de la INT 09H regresa 00H en el ES y 24H (36) en el BX.

Establece dirección de interrupción

Para establecer una nueva dirección de interrupción, cargue el número de la


interrupción 25H en el AL y la nueva dirección en el DX:

MOV AH,25H ; Petición de dirección de interrupción


MOV AL,#int ; Número de interrupción
LEA DX,newaddr ; Nueva dirección para la interrupción
INT 21H

La operación reemplaza la dirección actual de la interrupción con la nueva


dirección. Entonces, en realidad, cuando la interrupción especificada ocurre, el
proceso enlaza a su programa (residente) en lugar de a la dirección normal de
interrupción.

Obtiene la dirección de la bandera ocupada del DOS

La función 34H es utilizada de manera interna por el DOS; algunos TSR la usan
cuando solicitan una interrupción del DOS para verificar si otra interrupción está
activa. Ya que el DOS no es reentrante (esto es, no puede volver a entrar el DOS
mientras está activo), el TSR tiene que esperar hasta que el DOS no esté
ocupado, como lo indica la bandera de DOS ocupado, inDOS.

MOV AH,34H ; Petición de ocupado


INT 21H ; Llama al DOS
CMP ES:BYTE PTR [AX] ,o ;Prueba si la bandera es cero
JE ...

El servicio regresa la dirección de inDOS en el ES:BX. La bandera contiene el


número de funciones del DOS que están activas en ese momento, donde 0
significa ninguna. Puede ingresar el DOS sólo si inDOS es 0.

Resumen

El registro de arranque está en la pista cero, sector 1, de cualquier disco que


utilice FORMAT /S para formatearlo. Cuando inicia el sistema, carga de manera
automática el registro de arranque del disco y lo envía a la memoria. Entonces, el
registro de arranque carga el IO.SYS del disco a la memoria.

IO.SYS es una interfaz de nivel bajo con las rutinas del BIOS en ROM. Al inicio,
IO.SYS determina el estado de todos los dispositivos y equipo asociados con la
computadora y establece la tabla de direcciones para las interrupciones hasta la
20H. También el IO.SYS maneja las E/S entre la memoria y los dispositivos
externos.

MSDOS.SYS es una interfaz de alto nivel para programas que están cargados en
la memoria después del IO.SYS. Sus operaciones incluyen el establecimiento, la
tabla de direcciones para interrupciones desde la 20H hasta la 3FH, la
administración del directorio y de los archivos en disco, el manejo de bloqueo y
desbloqueo de registros en disco y el manejo de las funciones de la INT 21H.

COMMAND.COM maneja los distintos comandos del DOS y ejecuta los archivos
.COM, .EXE y .BAT solicitados. COMMAND.COM es el responsable de cargar los
programas ejecutables desde el disco y enviarlos a la memoria.
El módulo .EXE que el enlazador crea consiste en un registro de encabezado que
contiene la información de control y reubicación y el módulo real cargado. Al
cargar un programa .COM o uno .EXE, el DOS configura bloques de memoria para
el entorno y el segmento del programa. Precediendo a cada bloque de memoria
está un encabezado de arena de 16 bytes iniciando en una frontera de párrafo.
También el DOS crea un PSP en la localidad 00H del segmento del programa y lo
carga en 100H.

Bibliografia recomendada

Tokheim, Roger L. Fundamentos de los microprocesadores. México: McGraw Hill,


, 1998.

Brey, Barry B. Los microprocesadores INTEL. México: Prentice Hall, 1994.

Stallings, William. Organización y arquitectura de computadores. España: Prentice


Hall, 2000.

Abel, Peter. Lenguaje ensamblador y programación para el PC IBM y compatibles.


México: Pearson Educación, 1996.

Nexo

En el siguiente fascículo, para finalizar el contenido propuesto como una


introducción al manejo de lenguaje ensamblador para máquinas 8086 y
compatibles, se revisarán conceptos de control directo de puertos de entrada y
salida.
Autoevaluación formativa

Diseñe e implemente un programa residente que permita avisar la utilización del


teclado numérico cuando está activada la tecla NUMLOCK; tenga en cuenta las
siguientes dicas:

1. Defina el segmento de datos como sigue: apuntando al área de datos de la BIOS, iniciando en la
dirección 40[0]H

2. Prevenga la atención de la INT 09H y genere una rutina de atención a esta INT

MOV AH,35H
MOV AL,09
INT 21H
MOV WORD PRT SAVING9, BX
MOV WORD PRT SAVING9+2, BX
MOV AH,25H
MOV AL,09
MOV DX,OFFSET Nueva rutina de atención a INT
INT 21H
MOV AH,31H
MOV DX,OFFSET rutina parcheo de interrupción
STI
INT 21H

3. En la rutina de atención a la INT 09H verifique que la tecla NUMLOCK está presionada, y si las
teclas presionadas son numéricas genere un sonido.

3.1 Verifique Si la tecla NUMLOCK está presionada


MOV AX,area de datos de BIOS
MOV DS,AX
MOV AL,KBSTAT
TEST AL,00100000B
JZ EXIT
3.2 Si la tecla NUMLOCK está presionada verifique qué teclas diferentes a las numéricas estan
presionadas; si no, genere alarma sonora.

4. Reasuma la INT 09H


Lenguaje de máquina
Semestre 6
Fascículo No. 16

Tabla de Contenido
Contenido
Comunicaciones serie y paralelo
UART
Modem
Interfaz física RS232.
Interrupción asociada a la comunicación serie
Inicialización del puerto serie
Enviar carácter sobre la línea
Esperar para leer un carácter de entrada
Enviar un carácter al dispositivo
Usando el formato serial
Comunicaciones paralelas
Acceso directo al puerto
Registro de datos (D)
Registro de estado (S)
Registro de control (C)
Bit de puerto bidireccional (compatible PS/2)
Bit de interrupción
Descripción del conector físico
Velocidad
Handshaking con impresora
Interfaz de puerto paralelo para control y adquisición de datos
Adquisición de datos
Control de un motor paso a paso con PC
Resumen
Bibliografía recomendada
Autoevaluación formativa
Comunicaciones serie y paralelo

El adaptador de comunicaciones serie proporciona al PC la posibilidad de


comunicación con otros ordenadores o dispositivos que utilicen la interfaz de
comunicaciones RS232. Para los PCs hay dos tipos de comunicaciones; la serie y
la paralela.

En la comunicación paralela se transmiten, simultáneamente, todos los bits de un


byte. Existen ocho líneas para los datos y al menos dos líneas de control; la
velocidad de transmisión es relativamente alta y se utiliza para distancias cortas.

Interfaz Paralelo
D7 D6 D5 D4 D3 D2 D1 D0 C0 C1
↨ ↨ ↨ ↨ ↨ ↨ ↨ ↨

Donde D corresponde a los bits de datos y C a los bits de control.

En la comunicación serie, los bits de datos y de control se transmiten de uno en


uno. La velocidad de transmisión es menor que en el caso paralelo. La
comunicación serial es usada para comunicaciones de gran distancia, utiliza un
solo hilo por el que circulan los bits de datos y los bits de control. Los datos
recibidos de un MODEM u otro dispositivo son convertidos a datos en paralelo
para que puedan ser transferidos al Bus de PC.

Interfaz Serie
C0 D7 D6 D5 D4 D3 D2 D1 D0 C1 ↔

Hay dos modos de transmitir datos de forma serial: de modo sincrónico y


asíncrono. En el modo sincrónico los datos se envían en bloque, el transmisor y
el receptor se sincronizan con uno o más caracteres especiales llamados
caracteres de sincronismo.
Indicadores de logro

Al terminar el estudio del presente fascículo, el estudiante:

• Reconoce los esquemas de comunicación serial y paralela con dispositivos de


interfaz para un PC.
• Adquiere destrezas en el trabajo con dispositivos hardware y software de
tarjetas de interfaces.
• Propone soluciones a problemas de mediana complejidad en el diseño de
tarjetas de interfaces para puerto paralelo.

UART

El circuito integrado (CI) que convierte la línea de datos serial a paralelo y


viceversa es llamado UART (Universal Asynchronous Receiver-Transmitter). Una
UART típica es la 8251A; éste CI puede ser programado como asíncrono o
sincrónico.

Se conectan 8 bits de datos (D0-D7) al 8251A desde el bus de datos del PC. La
entrada chip select (/CS) habilita el CI cuando es requerido por el control de bus
del PC. Este CI tiene dos direcciones internas, una dirección de control y una
dirección de datos. La dirección de control se selecciona cuando la entrada C/D
es alta, si es baja se selecciona la dirección de datos. La señal de reset reinicia el
CI. Cuando /RD es baja el PC lee un byte de control o de datos. /WR habilita el PC
para escribir un byte

La UART tiene cuatro registros internos:

THR Registro temporal de salida TSR Registro de salida.


RDR Registro de entrada RSR: Registro temporal de entrada.
Todo dato que se transmite se almacena en THR. La UART suma los bits de inicio
y de fin. Copia todos los bits (datos, y los bits de inicio y fin) al TSR y a
continuación se envían a la línea de comunicación. Todo dato recibido es
almacenado en RSR, se eliminan los bits de inicio y de fin y la UART escribe este
carácter al RDR, se finaliza el proceso cuando el PC lee los datos.

Antes utilizar la UART hay que indicarle los parámetros de la comunicación serie,
que son: velocidad, en baudios o bits por segundo (110 a 9600), el número de bits
por carácter (5 o 8), el tipo de paridad (par, impar, o ninguna), El número de bits
finales (stop bits).

El esquema de funcionamiento de la UART es el siguiente

Parámetros −− −− →
Dato a transmitir −− −− → THR → TSR −− −− →
Dato recibido ← −− −− RDR ← RSR ← −− −−
Estado ← −− −−

Módem

La interfaz RS 232 realiza la conexión física del UART con el mundo externo. Dos
interfaces RS 232 se pueden conectar directamente a distancias cortas; para
distancias largas es necesario un MODEM en cada extremo de la línea. Los
módems realizan la conversión analógica/digital.

Las señales de control del MODEM desde el ordenador al MODEM son:

Señal Significado
DTR Data Terminal Ready, El PC esta encendido y preparado
RTS Request to send, el PC le dice al MODEM que quiere enviar datos.
Las señales de control del MODEM desde el MODEM al ordenador:

Señal Significado
DSR Data Set Ready, MODEM encendido y preparado.
CTS MODEM preparado para transmisión de datos.
DCD Data Carrier Detect, el MODEM ha establecido comunicación con el MODEM del otro
extremo de la línea telefónica.
RI Ring Indicador, El teléfono conectado al MODEM está sonando

Interfaz física RS232

La configuración de pines para el conector DB 25 y DB 9 se muestra en la


siguiente tabla:

D-Type-25 Pin D-Type-9 Pin Abreviatura Nombre


Pin 2 Pin 3 TD Transmit Data
Pin 3 Pin 2 RD Receive Data
Pin 4 Pin 7 RTS Request to Send
Pin 5 Pin 8 CTS Clear To Send
Pin 6 Pin 6 DSR Data Set Ready
Pin 7 Pin 5 SG Signal Ground
Pin 8 Pin 1 CD Carrier Detect
Pin 20 Pin 4 DTR Data Terminal Ready
Pin 22 Pin 9 RI Ring Indicador

En caso que conecte directamente un PC a otro, el esquema de conexión sería de


NULL MODEM. Este es el modo más básico de conexión en los juegos de red o
para transferir archivos entre computadores usando el protocolo Zmodem,
Xmodem etc. Y también es usado para muchos sistemas de desarrollo de
microprocesador. El esquema de conexión es el siguiente:
Interrupción asociada a la comunicación serie

El BIOS permite acceder al puerto serial de manera directa, a través de la


interrupción 14H y DOS permite inicializar el puerto de comunicaciones, velocidad,
tipo de corrección de errores, número de bits de datos, inicio y fin.

Inicialización del puerto serie

La función 00H de la INT 14H de BIOS permite fijar los valores de inicialización del
puerto; para esto fije en AL los parámetros de inicialización de acuerdo con la
siguiente tabla:

Bits Contenido
7–5 Velocidad en Baudios: 000 =110, 001 = 150, 010 = 300, 011 = 600, 100 = 1200, 101 =
2400, 110 = 4800, 111 = 9600.
4–3 Paridad: X0 = ninguna, 01 = impar, 11= par
2 Número de bits finales 0 = 1 bit, 1 = 1.5 bits si la longitud del carácter es 5, 1 = 2 bits si la
longitud del carácter es 6, 7 u 8.
1–0 Longitud de cada carácter: 00= 5 bits, 01 = 6 bits, 10= 7 bits, 11 = 8 bits

Fije en DX el número de puerto serial ( 0 ó 1). Esta función devuelve en AX el


estado del puerto.
Enviar carácter sobre la línea.

La función 01H de la INT 14H de BIOS activa las señales DTR y RTS del MODEM
y no transmite un carácter hasta que no reciba las señales correctas para DSR y
CTS. El carácter se enviará a la UART cuando esté vacío el THR. En DX fije el
número de puerto serial, en AL el carácter a enviar. Como salida en AH si el Bit 7
= 1 indica que el carácter fue enviado.

Leer carácter de la línea

La función 02H de la INT 14H de BIOS activa la señal DTR y no mirará si ha


recibido un carácter hasta que no reciba la señal correcta de DSR. En DX fije el
número de puerto serial. Como salida en AL retorna el carácter leído, si AH es
diferente de cero es porque el carácter no se ha enviado.

Leer palabra de estado del puerto

La función 03H de la INT 14H de BIOS retorna el estado del puerto. Fije en DX el
número del puerto, en AX retorna la palabra de estado del MODEM, en AH el
estado de la línea de comunicaciones y en AL el estado del MODEM.

Bits de AH Contenido
7 Tiempo excedido
6 TSR vacío
5 THR vacío
4 Interrupción
3 Error de formato
2 Error de paridad
1 Error de Sobrecarga
0 Dato preparado
Bits de AL Contenido
7 DCD
6 RI
5 DSR
4 CTS
3 Delta DCD
2 Delta RI
1 Delta DSR
0 Delta CTS

Esperar para leer un carácter de entrada

La función 03H de la INT 21H de DOS permite leer un carácter de entrada, tiene
como salida en AL el carácter de entrada.

Enviar un carácter al dispositivo

La función 04H de la INT 21H de DOS envía un carácter al dispositivo asíncrono,


fije en DL el carácter a enviar

Usando el formato serial

Para cualquier uso de la transmisión serial de datos se debe convertir el formato a


paralelo para hacer la transferencia al bus de datos; esto se hace utilizando UART
o microcontroladores.

Las UART 8250 tienen registros de configuración que se acceden por medio del
bus de datos y el bus de direcciones. Muchos microcontroladores utilizan una
interface serial de comunicación con este CI.
Las UART CDP6402, AY-5-1015 / D36402R – 9 tienen separados el bus de datos
de transmisión y de recepción; este CI sirve en aplicaciones donde usted no tiene
microprocesador, pudiéndolo utilizar para conectar un conversor análogo/digital
(ACD0804) a la UART, o si quiere conectar un display LCD al puerto serial.

Comunicaciones paralelas

Desde el punto de vista del software, el puerto paralelo son tres registros de 8 bits
cada uno, ocupando tres direcciones de I/O consecutivas en la arquitectura x86.
Desde el punto de vista hardware, el puerto es un conector hembra DB25 con
doce salidas latcheadas (que tienen memoria/buffer intermedio) y cinco entradas,
con 8 líneas de masa. La función normal es transferir datos a una impresora a
través de las 8 líneas de datos, usando las señales restantes como control de
flujo.

El puerto paralelo se identifica por su dirección de I/O (entrada/salida) base y se


identifica ante sistemas MS-DOS por el número LPT. Cuando arranca la máquina,
la BIOS chequea direcciones específicas de I/O en busca de puertos paralelos y
construye una tabla de las direcciones halladas en la posición de memoria 40h:8h
(o 0h:0408h).

Esta tabla contiene hasta tres palabras de 16 bits. Cada palabra es la dirección de
I/O base del puerto paralelo. La primera palabra corresponde a LPT1, la segunda
a LPT2 y la tercera a LPT3. Hay que agregar que, en MS-DOS tenemos el
dispositivo PRN que es un alias a uno de los dispositivos LPT (generalmente es
LPT1, pero se puede cambiar con la orden MODE). Las direcciones estándar para
los puertos paralelos son 03BCh, 0378h y 0278h (chequeadas en este orden).
Acceso directo al puerto

El puerto, como se mencionó antes, se compone de tres registros ubicados en


direcciones adyacentes del espacio de I/O de la PC. Los registros se definen
relativos a la dirección de I/O base (variable IOBase) y son:

IOBase+0 : registro de datos


IOBase+1 : registro de estado
IOBase+2 : registro de control

Registro de datos (D)

Escribiendo un dato al registro causa que el mismo aparezca en los pines 2 a 9 del
conector del puerto. Leyendo el registro, se lee el último dato escrito (NO lee el
estado de los pines; para ello hay que usar un puerto bidireccional).

MSB . . . . . . LSB
Nro.Bit 7 6 5 4 3 2 1 0 Descripción
x . . . . . . . D7 (pin 9), 1=Alto, 0=Bajo
. x . . . . . . D6 (pin 8), 1=Alto, 0=Bajo
. . x . . . . . D5 (pin 7), 1=Alto, 0=Bajo
. . . x . . . . D4 (pin 6), 1=Alto, 0=Bajo
. . . . x . . . D3 (pin 5), 1=Alto, 0=Bajo
. . . . . x . . D2 (pin 4), 1=Alto, 0=Bajo
. . . . . . x . D1 (pin 3), 1=Alto, 0=Bajo
. . . . . . . x D0 (pin 2), 1=Alto, 0=Bajo

El estándar es que las salidas sean LS TTL (low schottky TTL), aunque las hay
que son de tipo OC (colector abierto). La corriente que pueden entregar (modo
source) es de 2,6 mA máximo y pueden absorber (modo sink) un máximo de 24
mA.

Registro de estado (S)

El registro de estado está en IOBase+1. Es de sólo lectura (las escrituras serán


ignoradas). La lectura da el estado de los cinco pines de entrada al momento de la
lectura.

En la tabla siguiente los nombres de los pines se dejaron en inglés porque es


como generalmente se identifican.

Nro.Bit 7 6 5 4 3 2 1 0 Descripción
x . . . . . . . S7 : 0=Alto, 1=Bajo, Busy (pin 11)
. x . . . . . . S6 : 1=Alto, 0=Bajo, /Ack (pin 10)
. . x . . . . . S5 : 1=Alto, 0=Bajo, No paper (pin 12)
. . . x . . . . S4 : 1=Alto, 0=Bajo, Selected (pin 13)
. . . . x . . . S3 : 1=Alto, 0=Bajo, /Error (pin 15)
. . . . . x x x Sin definir

Observación

La línea Busy tiene, generalmente, una resistencia de pull-up interna. El estandar


es que sean entradas tipo LS TTL.

Registro de control (C)

El registro de control se encuentra en IOBase+2. Es de lectura/escritura.


Nro.Bit 7 6 5 4 3 2 1 0
x x . . . . . . Sin usar
. . x . . . . . C5 : Control puerto bidireccional
. . . x . . . . C4 : Interrupt Control, 1=act., 0=desact.
. . . . x . . . C3 : 1=Bajo, 0=Alto, /Select (pin 17)
. . . . . x . . C2 : 1=Alto, 0=Bajo, /Initialize (pin 16)
. . . . . . x . C1 : 1=Bajo, 0=Alto, /Auto Feed (pin 14)
. . . . . . . x C0 : 1=Bajo, 0=Alto, /Strobe (pin 1)

Los cuatro bits inferiores son salidas. La lectura devuelve lo último que se escribió
a dichos bits. Son TTL a colector abierto con resistencias de pull-up de 4700
ohms, por lo que un dispositivo externo puede forzar el estado de los pines sin
dañar el driver.

Esto permite utilizar estas cuatro líneas como entradas. Para ello, ponemos en alto
las cuatro salidas (escribiendo 0000100b en IOBase+2) lo que hace que las
salidas "floten". Ahora, un dispositivo externo puede forzar a bajo alguna de las
salidas con lo que, leyendo el puerto, sabemos si esto sucedió o no.

Bit de puerto bidireccional (compatible PS/2)

El bit C5, está disponible sólo si se trata de un puerto bidireccional; en los puertos
comunes actúa como los bits C6 y C7. Si C5 = 1, el buffer de los datos de salida
se pone en alta impedancia, "desconectando" dicho buffer de los pines 2 a 9 del
conector del puerto (D0 a D7). Si se escribe al registro de datos, se escribe al
buffer pero no a la salida. Esto permite que al leer el puerto, se lea el estado de las
entradas y no lo que hay en buffer.
Observación
En las computadoras IBM PS/2, para habilitar el puerto paralelo bidireccional,
además de lo antes descrito, se debe poner a 1 el bit 7 del registro del puerto 102h
(opciones de configuración). En computadoras que no tengan puerto paralelo
bidireccional compatible PS/2 hay que modificar uno o más bits de algún puerto
específico correspondiente al chipset de la placa. A veces se habilita por el Setup
o por jumper en la placa del puerto.

Bit de interrupción

En trabajos normales de impresión ni el BIOS ni el DOS hacen uso de la


interrupción. El hecho de poseer una línea de interrupción que está conectada
directamente al PIC (Programmable Interrupt Controller), lo hace muy útil para
experimentación en data-loggers, por ejemplo. El bit de interrupción está
conectado al control de un buffer de tres estados. Cuando C4=1, se activa el buffer
y su entrada, S6, se conecta a la línea IRQ (en general es IRQ7 o IRQ5). La
lectura del bit, nos devuelve el estado del mismo (es decir si el buffer está en alta
impedancia o no).

Se producirá una interrupción, cuando haya un flanco descendente en el pin


correspondiente a S6. A continuación, se describen los pasos para poder utilizar
interrupciones.

Descripción del conector físico

Como se mencionó anteriormente, la conexión del puerto paralelo al mundo


externo se realiza por un conector hembra DB25. Viendo el conector al frente y
con la parte que tiene más pines hacia arriba, se numera arriba de derecha a
izquierda, del 1 al 13 y abajo del 14 al 25 también de derecha a izquierda.
En la siguiente tabla aparece la disposición de los pines del conector DB25 del
puerto pararlelo. En la columna de entrada/salida (I/O) se refiere al lado de la PC.
En la columna Cent pin, indicamos el pin correspondiente al conector Centronics
usado en las impresoras.

Observación
Algunos nombres no corresponden con los de las tablas anteriores. Se hace a
propósito para indicar los posibles nombres que puede tener una misma señal
según su uso.

I/O DB25 CENT. Bit Señal Descripción


pin pin Reg.
O 1 1 /C0 /Strobe Un valor LOW por más de 0.5µS habilita a la
impresora para que reciba los datos enviados.
O 2 2 D0 Data0 LSB de datos
O 3 3 D1 Data1
O 4 4 D2 Data2
O 5 5 D3 Data3
O 6 6 D4 Data4
O 7 7 D5 Data5
O 8 8 D6 Data6
O 9 9 D7 Data7 MSB de datos
I 10 10 S6 /Ack Pulso LOW de 11µS, indica que se recibieron datos en
la impresora y que la misma está preparada para recibir
más datos.
I 11 11 /S7 Busy En alto nos indica que la impresora está ocupada.
I 12 12 S5 PaperEnd En alto nos indica que no hay papel.
I 13 13 S4 SelectIn En alto para impresora seleccionada.
O 14 14 /C1 /AutoFd Si ponemos en bajo, el papel se mueve una línea luego
de la impresión.
I 15 32 S3 /Error En bajo nos indica error (no hay papel, está fuera de
linea, error no det.).
O 16 31 C2 /Init Si enviamos un pulso en bajo > 50µS la impresora se
resetea.
O 17 36 /C3 /Select En bajo seleccionamos impresora (en general. no se
usa, ya que SelectIn se fija a alto).
- 18 a 25 19 a 30 y 33 Masa Tierra retorno del par trenzado
- 18 a 25 16 Masa Tierra lógica
- 18 a 25 17 Masa Tierra chasis

Velocidad

Un puerto paralelo ISA normal toma un ciclo-ISA para leer o escribir. Como en
muchos sistemas, la velocidad del bus ronda los 1,3 Mhz; podemos decir que la
lectura la podemos hacer cada 1 µs (idealmente, ya que siempre tenemos otras
instrucciones software, etc.; en la práctica pueden ser desde 1.2 1 µs a 2 1 µs).
Algunos puertos soportan un modo "turbo" que elimina los 3 estados de espera de
la CPU, con lo que la velocidad de lectura/escritura del puerto se duplica (2,7
MHz).

Handshaking con impresora

El handshaking ("apretón de manos") viene a ser algo así como cuando se habla
de protocolos en el software. Es decir, son un conjunto de reglas que ambos
extremos de un sistema de comunicación tienen que seguir para que la
comunicación sea exitosa.

El puerto paralelo, usado con una impresora, transmite datos y transmite/recibe las
señales de handshaking. En la tabla anterior ya se han descrito las señales
utilizadas. Las principales son /Strobe, /Ack y Busy. La secuencia a seguir para
enviar datos sería:

• Colocar el byte a enviar en el registro de datos.


• Verificar que la impresora no esté ocupada (Busy = bajo, S7 = 1).
• Indicarle a la impresora que acepte los datos (/Strobe = bajo , C0 = 1,
pulso >5us).
• En ese instante la impresora indica que está ocupada recibiendo los
datos (Busy = alto, S7 = 0).
• Finalmente, la impresora envía un pulso de aceptación indicándonos
que se recibieron los datos y que podemos volver al paso 1 (/Ack = bajo,
S6 = 0, pulso de entre 5 us y 15 us según impresora).

Las otras señales sirven para verificar el estado de la impresora (/Error,


PaperEnd), para resetearla (/Init) y para "configurarla" (/AutoFd, /Select).

Observación
En los nuevos puertos, estas señales adquieren otra función, a veces parecida y
otras, totalmente distintas.

Actividad 16.1

Investigue y determine cuál es la importancia en el diseño de interfaces para


puerto paralelo de los puertos extendidos, puerto bidireccional (compatible PS/2),
puerto EPP (Enhanced Parallel Port), y puerto ECP (Enhanced Capability Port).

Interfaz de puerto paralelo para control y adquisición de datos

Las operaciones de entrada y salida de información a través del puerto paralelo en


el PC se realizan gestionando el puerto paralelo en el nivel de registros. Cuando
se usa el puerto paralelo para otro cometido distinto al original, sólo se pueden
utilizar 12 líneas de salida de información desde el PC:

• Pines del 2 al 9 → registro de datos


• Pines 1,14, 16 y 17 → registro de control

15 líneas de entrada al mismo:

• Pines 2-9→ registro de datos


• Pines 10,11,12,13 y 15 → registro de estado

Actividad 16.2

A continuación se presenta un circuito para probar la salida de datos por el puerto


paralelo. Este es un circuito básico de prueba; prende o apaga 8 Leds conectado
cada uno a los pines D0 a D7.

Los pines D0 – D7 del conector DB-25 del puerto paralelo, se conectan a un IC1
(74AC541 / 74LS244) que permita proteger el puerto y a la vez impulsar corriente
al los leds D1- D8. las resistencias R1 a R8 son de 330 Ohmios

• Diseñe para este circuito un programa que permita sacar por el puerto
datos que representen secuencias de encendido y apagado de los leds.
Actividad 16.3

Para probar la lectura de datos desde el puerto paralelo monte el siguiente


circuito:

Donde S1 a S5 son pulsadores y R1 a R5 son resistencias de 330 ohmios.

• Diseñe para este circuito un programa que permita leer del puerto datos
que se generen mediante los pulsadores S1-S5.

¡ PRECAUCION !: conectar dispositivos al puerto paralelo implica el riesgo


de daños permanentes a la Mother board de su PC; se recomienda extremo
cuidado al trabajar en el puerto paralelo. Asegúrese del adecuado
funcionamiento de la tarjeta de interfaz que diseñe. Realice las pruebas de
funcionamiento de la tarjeta de interfaz sin conexión al puerto paralelo. Una
vez esté seguro del funcionamiento de la tarjeta conéctela al PC y realice las
pruebas de funcionamiento del software de control de la tarjeta.
Adquisición de datos

En el proceso de adquisición de datos se miden variables análogas que se


convierten a formato digital y se almacenan para luego procesar la información
proveniente de un fenómeno físico. El proceso de adquisición de datos del mundo
físico conlleva los siguientes pasos fundamentales:

• Utilización de un sensor / transductor para la variable que se desea medir,


el cual permite detectar y convertir la variable física a una señal analógica
de voltaje o corriente eléctrica.
• Amplificación de la señal de voltaje o corriente, si se requiere. Si la señal
que proviene del sensor es débil, se requiere un amplificador de voltaje y
algún método para filtrar los ruidos eléctricos.
• Traducción de esta señal analógica al lenguaje propio del computador:
lenguaje digital. Este proceso se conoce técnicamente como conversión
ANALOGO/DIGITAL (A/D).
• Adquisición propiamente dicha de los datos que, en forma digital, podrán
ser almacenados en la memoria del PC y llevados luego a pantalla o a otro
periférico del computador.

Control de un motor Paso a Paso con PC

Los motores, tanto de corriente continua como de corriente alterna, son muy
efectivos en muchas labores cotidianas, debido a problemas tales como la inercia
mecánica o su dificultad para controlar su velocidad; cuando se requiere precisión
de giro se utilizan los motores paso a paso. En efecto, en un motor paso a paso no
sólo se puede controlar la cantidad de vueltas del mismo, sino hasta centésimas
de las mismas. A pesar de su extrema precisión, es especialmente útil en áreas
como la robótica o la domótica.

Su principio de funcionamiento es muy simple. Internamente un motor de este tipo


está compuesto por dos bobinas con punto medio. Estas bobinas se ubican en lo
que se denomina estator, es decir la carcaza exterior del motor; el motor tiene
otra parte móvil estriada denominada rotor. Cuando se aplica tensión a cualquiera
de las cuatro bobinas existentes ésta genera un campo magnético. Ante esta
situación una estría del rotor se alinea con este campo, desplazándose así un
determinado número de grados. A este desplazamiento se lo denomina paso. Si
en esta situación se desalimenta la antes mencionada bobina y se alimenta la
siguiente, el rotor girará otro paso en la dirección dada. En función de las veces
que repitamos esta secuencia lograremos que el rotor gire una determinada
cantidad de vueltas o grados en un sentido u otro.

Actividad 16.4

Después de la realización de las actividades anteriores usted ya está preparado


para realizar tarjetas de interfaz de mediana complejidad para diferentes procesos
que requieran el uso del PC para la adquisición de datos y control de procesos.
Utilizando la metodología para el desarrollo de sistemas de electrónica digital
realice los siguientes requerimientos:

• Diseñe, implemente y pruebe una tarjeta de interfaz y su respectivo


software que permita adquirir datos por puerto paralelo.
• Diseñe, implemente y pruebe una tarjeta de interfaz y su respectivo
software para el control de un motor paso a paso utilizando el puerto
paralelo de su PC.
Resumen

Los mecanismos de comunicación serial y paralelo permiten aumentar la


capacidad de control y de adquisición de datos del PC. Esto permite conectar
diferentes dispositivos a los puertos seriales y paralelos tales como módems,
impresoras y dispositivos de adquisición de datos o de control.

Bibliografía recomendada

Tokheim, Roger L. Fundamentos de los microprocesadores. México: McGraw Hill,


1998.

Brey, Barry B. Los microprocesadores INTEL. México: Prentice Hall, 1994.

Stallings, William. Organización y arquitectura de computadores. España: Prentice


Hall, 2000.

Abel, Meter. Lenguaje ensamblador y programación para el PC IBM y compatibles.


México: Pearson Educación, 1996.
Autoevaluación formativa

Proyecto final de Lenguaje de Máquina

Descripción de proyecto:

El proyecto consiste en el desarrollo de una aplicación que controle ocho LEDs por
puerto paralelo y genere varias secuencias de iluminación, las cuales se
encuentran en un archivo de tipo texto.

Objetivos:

• Hacer el desarrollo del software aplicando los conceptos de programación en


lenguaje ensamblador para procesadores 80X86 de INTEL.

• Desarrollar interfaces hombre-máquina aplicado las funciones de entrada


salida de la BIOS y el DOS.

• Aplicar las funciones de entrada y salida avanzada en la lectura de archivos y


el control del puerto paralelo de un PC de arquitectura compatible con IBM.

• Desarrollar aplicaciones que trabajen en modo residente en memoria y hacer el


parcheo de interrupciones correspondiente para su ejecución.

Requerimientos:

• El sistema deberá encender o apagar ocho LEDs conectados al puerto


paralelo; el encendido o apagado dependerá de la información contenida en un
archivo tipo texto.
• La información de encendido o apagado de los LEDs contenida en el archivo
tipo texto se podrá modificar editando el archivo con un editor, para adicionar,
eliminar o modificar secuencias de manera transparente para el software
desarrollado.

• El formato del archivo de secuencias antes mencionado tendrá la siguiente


estructura:

2 ; Número de secuencias

1:INICIO ; Inicio de la primera secuencia.


10000001 ; Primer dato de la secuencia 1
01000010 ; Segundo dato de la secuencia 1
.
.
.
00011000 ; Último dato de la secuencia 1
1:FIN ; Fin de secuencia

2:INICIO ; Inicio de la segunda secuencia.


00011000 ; Primer dato de la secuencia 2
11100111 ; Segundo dato de la secuencia 2
.
.
.
10000001 ; Último dato de la secuencia 2
2:FIN ; Fin de secuencia

• La primera línea del archivo debe indicar el número de secuencias que


contiene.
• Cada secuencia inicia con el número correspondiente seguido de dos puntos y
luego la palabra "INICIO".
• La información que indica si los LEDs se deben encender o apagar se
representará con una cadena de ocho caracteres de unos y /o ceros.
• El final de una secuencia se indica con el número de la secuencia, seguido de
dos puntos y la palabra "FIN".
• El programa debe quedar en modo residente y se ejecutará cada vez que el
reloj temporizador del sistema genere una interrupción (INT 09H del BIOS); por
lo tanto hay que parchar esta interrupción para la ejecución del programa.
• Al oprimir las teclas "CTR" y "+" se debe aumentar la velocidad de la
secuencia.
• Al oprimir las teclas "CTR" y "-" se debe disminuir la velocidad de la secuencia.
• Al oprimir las teclas "CTRL" y "PAGE DOWN" se debe mostrar cuántas
secuencias hay disponibles para ejecutar y se debe esperar a que el usuario
seleccione una.
• Al oprimir las teclas "CTR" y "END" se debe parar la secuencia que se está
ejecutando.
• Al oprimir las teclas "CTR" y "HOME" se debe activar la secuencia
seleccionada.
• Para lo anterior hay que parchar la interrupción de teclado (INT 09H del BIOS).

También podría gustarte