Download Folleto Ensamblador #2

Document related concepts
no text concepts found
Transcript
UNIVERSIDAD NACIONAL DE INGENIERIA
RECINTO UNIVERSITARIO SIMON BOLIVAR
Facultad de Electrotecnia y Computación
Departamento de Arquitectura y Sistemas
Folleto de
Arquitectura de Máquinas Computadoras II
Curso 2013
Folleto adicional de Ensamblador:
Programando la Computadora basada en P8086
Preparado por:
Profesor José Díaz Chow
Managua, Noviembre de 2013
Folleto de Arquitectura de Máquinas Computadoras II
Copyright, Xdc ©, Universidad Nacional de Ingeniería.
Departamento de Arquitectura y Sistemas, Facultad de Electrotecnia y Computación.
Elaborado Agosto 2004. Actualizado Noviembre de 2013.
INDICE DE CONTENIDO
3.
LA COMPUTADORA BASADA EN MICROPROCESA-DOR IX86 .........................1
3.1 ESTRUCTURA FÍSICA DE LA PC. ......................................................................................................... 1
3.1.1
Dentro de la caja de la PC ..................................................................................................... 2
3.2 ARQUITECTURA DE BUSES................................................................................................................. 4
3.3 EL ENTORNO DE PROCESAMIENTO ..................................................................................................... 6
3.3.1
Organización .......................................................................................................................... 6
3.3.2
Modelo de Memoria................................................................................................................ 7
3.3.3
Registros del CPU y su uso .................................................................................................... 9
3.3.4
Modos de direccionamiento ...................................................................................................12
3.3.5
El Conjunto de Instrucciones.................................................................................................13
3.3.5.1
3.3.5.2
Listado general de instrucciones: .................................................................................................... 13
Listado más detallado: ..................................................................................................................... 16
3.3.6
Los servicios de la ROM BIOS ..............................................................................................20
3.3.7
El lenguaje ensamblador. ......................................................................................................21
3.4 LOS CHIPS DE APOYO ......................................................................................................................23
3.4.1
El temporizador del sistema 8253-5 ......................................................................................23
3.4.2
El controlador de DMA .........................................................................................................23
3.4.3
El Controlador programable de Interrupciones (PIC) ..........................................................24
3.5 LA ENTRADA Y SALIDA ESTÁNDAR...................................................................................................25
3.5.1
El video de la PC ...................................................................................................................25
3.5.1.1
3.5.1.2
3.5.2
La pantalla ....................................................................................................................................... 25
Procesamiento básico de pantalla .................................................................................................... 25
La entrada estándar de la PC ................................................................................................27
3.5.2.1
Procesamiento básico de teclado ..................................................................................................... 27
3.5.3
Las interfaces estándares de la PC........................................................................................29
3.6 EL SUBSISTEMA DE ALMACENAMIENTO. ..........................................................................................30
3.6.1
La geometría del Disco ..........................................................................................................30
3.6.2
Estructura lógica del disco según DOS .................................................................................31
3.6.3
El sistema de archivos de DOS ..............................................................................................33
3.6.4
Acceso a archivos ..................................................................................................................36
3.6.4.1
3.6.4.2
Ejemplo1: Crear y escribir en archivo. ............................................................................................ 36
Ejemplo2: Abrir y leer un archivo existente .................................................................................... 39
3.7 PROGRAMACIÓN EN ENSAMBLADOR CON MACROS...........................................................................42
3.7.1
Definición de macro ..............................................................................................................42
3.7.2
Macros con parámetros .........................................................................................................42
3.7.3
Uso anidado de macros .........................................................................................................43
3.7.4
Directiva LOCAL ...................................................................................................................43
3.7.5
Directivas Include y PURGE .................................................................................................43
A R Q U I T E C T U R A
D E
M Á Q U I N A S
C O M P U T A D O R A S
I I
3. LA COMPUTADORA BASADA EN MICROPROCESADOR ix86
Desde 1981, con la introducción de la IBM PC original, basada en 8088, la
computadora personal basada en microprocesadores de la familia ix86 o compatibles se
han posicionado de manera irrefutable como líder en este sector del mercado. Para bien o
para mal, estas máquinas son las disponibles en nuestro entorno y se han ganado el ser
nuestro caso de estudio en este curso.
En esta unidad nos enfocaremos en el estudio tanto de la estructura física, organización y
arquitectura de estas máquinas como del lenguaje ensamblador de sus microprocesadores
con el objetivo de propiciar una comprensión más íntima de las particularidades
arquitecturales de estas máquinas, porque estamos convencidos que existe una estrecha
relación indisoluble entre el hardware y el software, misma que nos sirve de base en
nuestra tarea académica en este curso.
3.1 Estructura física de la PC.
La Computadora basada en microprocesador ix86, no ha cambiado mucho de
aspecto físico desde sus raíces con la introducción de la PC original en 1981. Si
inspeccionamos una configuración típica podemos identificar la misma estructura de
siempre: Una unidad central o principal (a menudo erróneamente llamada CPU), a la que
se conectan una serie de periféricos, de los cuales, el monitor (unidad predeterminada de
salida) y el teclado (unidad predeterminada de entrada) son infaltables. Tenemos además
otros dispositivos bastantes populares como la impresora, el ratón o apuntador y los
parlantes.
La unidad principal, que se puede encontrar en varios factores de forma o
configuraciones (disposición horizontal o desktop , vertical o torre y una serie de
subvariantes de las anteriores), contiene normalmente otros periféricos e interfaces
disponibles al exterior en su superficie, como la unidad de disquetes, la unidad de CDROM (que si se pronuncia en inglés debe sonar cidi rom, no cidi rum) y las interfaces
estándares de entrada/salida como los puertos paralelos, seriales y usb.
El 12 de agosto de 1981, IBM presentó el IBM PC original que estaba basado en el
microprocesador 8088, de 16 bits, aunque su bus externo era de 8, manteniendo así
compatibilidad con la mayoría de aplicaciones hardware de la época. Este PC solo tenía
256Kbytes de RAM y no tenía disco duro, solo una unidad de casete y una de disquete de
5¼ de 160/180 Kbytes, dependiendo del modelo. El bus de expansión del sistema (ISA)
permitía insertar tarjetas controladoras de E/S de 8 bits, logrando hacer el sistema abierto
en cuanto a los dispositivos de E/S que se podrían conectar a él.
Prof. José Díaz Chow
Página 1
A R Q U I T E C T U R A
D E
M Á Q U I N A S
C O M P U T A D O R A S
I I ,
C U R S O
2 0 0 4 .
En 1983 apareció el IBM PC-XT, basada en un 8086, con un bus de datos de 16 bits.
Esta traía como novedad un disco duro de 10 Mbytes y hasta 640Kbytes de RAM. Un año
más tarde aparecería el IBM PC-AT, introduciendo el microprocesador 286, así como
ranuras de expansión de 16 bits (el bus ISA de 16 bits) en contraposición con las de 8 bits
del PC y el XT (bus ISA de 8 bits), además incorporaba un disco duro de 20 Mbytes y
disquetes de 5¼ pero con formato de 1.2 Mbytes.
En general, todos los equipos con procesador 286 o superior pueden catalogarse dentro de
la categoría AT; el término XT hace referencia al 8088/8086 y similares. Es necesario
notar, sin embargo que con la especificación ATX, muchas PCs modernas, deberían
llamarse ATX y no AT (Esta especificación fue implementada más o menos con los
últimos Pentium MMX de 233MHz y a partir de los PII).
3.1.1
Dentro de la caja de la PC
Dentro de la caja de la PC original, se podía identificar en el centro, la placa base
o tarjeta madre, componente esencial que provee la estructura de interconexión para los
tres subsistemas y los chips de apoyo de la computadora. Además de la placa base,
podemos identificar algunos periféricos internos como los discos duros que proveen
almacenamiento masivo, así como las tarjetas de expansión del sistema donde se
encuentran los módulos de entrada salida para una serie de funciones de soporte como el
vídeo, los discos y las interfaces estándares (COM y LPT). Un speaker de audio interno,
también era integrado a la unidad (no confundir con los modernos sistemas multimedia
actuales). No podemos obviar finalmente, la alimentación de energía eléctrica que es
provista por una fuente de poder especializada.
La placa base contiene tanto el subsistema de procesamiento, como el de memoria y la
parte central del sistema de entrada/salida, que es extensible mediante el bus de
expansión, que en la PC original era el ISA. Haciendo un recuento rápido:









El procesador Intel 8088
Un socket para el coprocesador matemático 8087
Sockets para hasta 256K de RAM
Hasta 48 Kbytes de ROM del sistema
Un temporizador del sistema o contador 8253-5
Un controlador programable de interrupciones 8259A
Un controlador de DMA 8237-5
Un expansor de puerto paralelo PPI 8255A que se empleaba para la
configuración del sistema mediante jumpers.
Audio Speaker
El sistema de memoria principal consistía en 16 KBytes de memoria ampliables a 64
mediante zócalos en la placa base (y a 256 añadiendo tarjetas). La configuración típica
Página 2
Prof. José Díaz Chow
A R Q U I T E C T U R A
D E
M Á Q U I N A S
C O M P U T A D O R A S
I I
permitía la instalación de hasta 4 bancos de 64KBytes formados por 9 chips de 64 Kbit.
EL noveno chip implementaba el bit de paridad. En el mapa de memoria esta se localiza
en la parte baja desde la 00000H-3FFFFH. La memoria principal se implementó con
memoria dinámica que requerían refrescamiento cada 2ms máximo. El ciclo de
refrescamiento de la RAM fue implementado por el chip de DMA (8237-5) a intervalos
especificados por el timer (8253-5) cada 15.2 s. El procesador es puesto en estado de
espera (wait state) durante el ciclo de refrescamiento, lo cual podía reducir un poco la
productividad del 8088.
Adicionalmente, se tenían hasta 48 KB de memoria ROM para software del sistema. Este
ROM se implementaba en chips de 8KBytes localizados en la parte alta del mapa de
memoria en el rango desde F4000H al FFFFFH. Los 40K más altos contienen código que
implementa:





Un intérprete de BASIC
El Power on self-test (POST).
Los drivers de E/S standard
El cargador del sistema o puntero al arranque (bootstrap loader)
Los patrones de caracteres
00000
00000
064-067
064-067
Interrupt Vectors:
CPU, IRQ, DOS,
BIOS
Cold System Boot (ALT+CTRL+DEL)
000FF
000FF
0F0000
0F0000
ROM - BIOS (routines)
0FFFFF
0FFFFF
Warm System Boot (Reset)
Figura 1. Mapa simple de memoria del 8088
El almacenamiento externo se hacía inicialmente en cintas de casete, aunque pronto
aparecieron las unidades de disco de 5¼ pulgadas y simple cara (160/180 Kb por disco) o
doble cara (320/360 Kb). Con la XT aparece el disco duro integrado en la PC. Con la AT
se amplían los formatos de disquete (720K, 1.2 M y 1.44M), apareciendo además, la
unidad de 3½ y discos con capacidades de 20 MB.
Prof. José Díaz Chow
Página 3
A R Q U I T E C T U R A
D E
M Á Q U I N A S
C O M P U T A D O R A S
I I ,
C U R S O
2 0 0 4 .
3.2 Arquitectura de buses.
La estructura de interconexión entre los subsistemas de la PC se implementa
mediante buses. Desde la PC original donde el bus del sistema podía ser accedido
directamente mediante las ranuras de expansión, hasta nuestra fecha donde se ha
implementado toda una jerarquía de buses.
El bus del sistema o bus local permite la interconexión del procesador con la memoria y
los chips de apoyo que administran el sistema de entrada-salida. Este se compone de tres
conjuntos de líneas lógicas bien diferenciadas: el bus de datos, el bus de direcciones y el
conjunto de líneas de control. Adicionalmente, podemos mencionar las líneas de
suministro de corriente que normalmente se encuentran entre las líneas de los buses de
expansión.
Bus de Dirección
Bus del Sistema
Sistema de
Memoria
CPU
Bus de Control
Sistema de
E/S
CPU
Memoria
Entrada/Salida
Bus de Dato
Buses del sistema
Además del bus local, mediante un controlador de bus, la PC provee un bus de expansión
donde se pueden insertar tarjetas controladoras de dispositivos periféricos que permite
extender las capacidades de comunicación de la PC.
La PC original introdujo el bus de expansión ISA de 8 bits. La AT extendió este bus a 16
bits
Bus del Sistema
CPU
Memoria
Controlador de
bus
Bus de Expansión estándar (ISA, EISA o MC)
Controlador
de Vídeo
Controlador
de Disco
Puerto Serie
y Paralelo
Slot
Slot
Bus de expansión el las primeras PCs
Con las mejoras en la tecnología de buses introducidas por Intel en 1993 con el bus PCI,
se logran mayores anchos de banda. La PC ahora establece una jerarquización de buses.
Los dispositivos de alta velocidad se conectan al PCI y los de baja velocidad a un bus
ISA. El PCI se conecta con el bus local facilita mediante el North bridge del chipset.
Existe otro puente de interface (south bridge) que enlaza el bus PCI con el bus de
periféricos ISA.
Página 4
Prof. José Díaz Chow
A R Q U I T E C T U R A
D E
M Á Q U I N A S
CPU +
Cache L1
Controlador
de vídeo
Controladores del sistema
(Chipset)
Controlador de Memoria y
Puente PCI
"Bus" AGP
C O M P U T A D O R A S
I I
Cache L2
Memoria
Principal
Bus del Sistema
Bus PCI
SCSI
Dispositivos IDE
CD
DD
DD
DD
Controlador IDE
Controlador de DMA
Puente PCI a ISA
LAN
Slot
USB
Bus ISA
Slot
Slot
LPT
Com 1
Disquete
Super
I/O
Com 2
Teclado
Ratón PS/2
Arquitectura de Buses de las PC modernas
Prof. José Díaz Chow
Página 5
A R Q U I T E C T U R A
D E
M Á Q U I N A S
C O M P U T A D O R A S
I I ,
C U R S O
2 0 0 4 .
3.3 El entorno de procesamiento
Como es más que obvio, estas máquinas se basan en un procesador de la familia
x86 de Intel. Podemos decir que la familia de arquitecturas de Intel x86, tiene dos
generaciones bien diferenciadas: la arquitectura de 16 bits que es la generadora de la
familia y la arquitectura de 32 bits, más moderna y versátil.
La familia nace con el lanzamiento del microprocesador 8086 y su primo 8088. Ambos
idénticos en su arquitectura de 16 bits pero diferentes en su interfaz de bus. (el 8088 tenía
una ruta de 8 bits para guardar compatibilidad con su predecesor 8080).
Sorprendentemente, esta familia de procesadores que dan soporte a la IBM PC y
compatibles desde su introducción en 1981 hasta hoy día, guardan compatibilidad en
arquitectura hacia atrás. La tabla a continuación muestra la evolución de estos CPUs en
cuanto a tamaño de registros, Memoria que es capaz de direccionar y velocidad de
cómputo.
Procesador
Tamaño Registros
[bits]
8088
80188
8086
80186
80286
80386
80486
Pentium, PRO, mmx
Pentium II
Pentium III
Pentium IV
3.3.1
16
16
16
16
16
32
32
32
32
32
32
Ancho bus
[bits]
Memoria que
direcciona
8
8
16
16
16
32
32
64
64
64
64
1 MB
1 MB
1 MB
1 MB
16 MB
4 GB
4 GB
4 GB
4 GB
4 GB
4 GB
Velocidad
[MHz]
4.71
6
4.71
6
4.7, 8, 12
25, 33
33, 66, 100
75 … 233
266 … 450
450 … 1,300
1,300 … 3,600
Organización
Intel organiza el Datapath de estos microprocesadores en dos unidades lógicas: La unidad
de ejecución (EU) y la Unidad de Interfaz de Bus (BIU). La EU contiene a la ALU, los
registros de propósito general y punteros así como el de banderas. Algunos autores
defienden que también contiene a la unidad de control. La BIU contiene los registros de
control de programa (PC) y direccionamiento segmentado, la lógica de acceso al bus y
una cola de instrucciones (de 2 a 8 instrucciones según CPU).
Página 6
Prof. José Díaz Chow
A R Q U I T E C T U R A
D E
M Á Q U I N A S
C O M P U T A D O R A S
I I
Figura 2. Organización básica del 8086
3.3.2
Modelo de Memoria
La memoria principal a que acceden estos procesadores se compone en parte de
RAM de lectura/escritura y ROM que contiene el software del sistema (Programa de
configuración del sistema y la BIOS).
El esquema básico de direccionamiento de la PC original, con arquitectura de 16 bits,
permitía el acceso a 1MB de direcciones de memoria. Esta arquitectura estaba bastante
relacionada con el sistema operativo MS-DOS que administraba las PC en esa época. La
figura 2 muestra su mapa de memoria que integra 640KB de memoria RAM para
ejecución de programas de usuario, denominada Memoria Convencional. El resto del
1MB, es denominada memoria alta o superior, aloja la ROM con un espacio de 64KB
básicos para setup y 192KB para extensión y el BIOS.
Prof. José Díaz Chow
Página 7
A R Q U I T E C T U R A
D E
M Á Q U I N A S
C O M P U T A D O R A S
I I ,
C U R S O
2 0 0 4 .
Figura 3. Mapa de la memoria 8086.
Un aspecto importante a considerar del sistema de memoria que manejan los 80x86 es el
ordenamiento de bytes. Intel emplea para estos little endian, es decir que el byte menos
significativo se almacena en la posición más baja, al inverso de cómo se ordenan a lo
interno de los registros. (Big endian es al contrario: más significativo en posición más
baja).
La arquitectura de 16 bits implementa un modelo de memoria denominado segmentado,
donde cada programa de usuario, reside en segmentos de memoria. Cada programa puede
tener uno o más segmentos para datos, uno o más segmentos para código, otro para la pila
y un extra segmento. La arquitectura de 32 bits, en cambio, emplea un modelo de
memoria flan, donde cada programa de usuario tiene un espacio virtual de 32 GB de
memoria.
En el modelo de programación segmentado se emplean registros de base de segmento
para llevar el control del inicio de cada segmento cargado en la memoria. Esto permite
que los programas sean relocalizables. Se definen cuatro segmentos básicos: Uno para
Datos, otro para Código, uno para Pila (stack) y otro extra. Los registros base para éstos
son: DS, CS; SS y ES respectivamente.
Las direcciones físicas de memoria de 1MB (20 bits) se obtienen mediante un modo de
direccionamiento desplazado, donde el registro base del segmento se desplaza 4
posiciones a la derecha y luego se suma al valor del desplazamiento para obtener la
dirección física de 20 bits. Por ejemplo, suponga que el DS tiene 045FH y el
desplazamiento para el dato X es 32H, entonces, DS se desplaza 4 posiciones volviéndose
su contenido 045F0H a lo que se suma el 32H para obtener 04622H.
Página 8
Prof. José Díaz Chow
A R Q U I T E C T U R A
D E
M Á Q U I N A S
C O M P U T A D O R A S
I I
Es importante recordar que el modelo de programación del 8086 es segmentado y que el
modo [dirección] que podríamos considerar como “absoluto” (porque definimos
directamente la dirección de memoria a la que queremos acceder) se refiere a una
dirección que implícitamente está desplazada. Por ejemplo, basándonos en el caso del
párrafo anterior, la instrucción MOVE AX, [0032] carga en el registro AX el valor de
M(DS:32).
La figura 3 muestra comparativamente la evolución de los micros de la familia Intel x86
de 16 y 32 bits respecto a sus modelos de memoria:
Micros de 16bits
8086
80186 80286
Micros de 32bits
80386 486
Pentium
P5
8088
Pro PII
MMX
(P6)
PIII
PIV
Bus externo
de 8 bits
Bus de datos de 16 bits
Modo Real o Segmentado
Bus de datos
de 32 bits
Bus externo de datos de 64 Bits
Modelo FLAT
Figura 4. Procesadores de la familia ix86.
3.3.3
Registros del CPU y su uso
Los procesadores ix86 poseen diversos registros. En dependencia de su generación, estos
registros pueden ser de 16 o 32 bits. La mayoría de ellos, sin embargo, puede accederse
en campos de bits de 8 y 16. Según su uso o función, los podemos clasificar en
diferentes grupos:

Registros de propósito general (GPRs) o de datos: Estos registros sirven para las
operaciones regulares de programación, aunque intel propone una función para
cada uno de ellos, como veremos más adelante. Desde su introducción y por
asuntos de compatibilidad con el modo byte tan difundido en esa época, los
registros de propósito general se pueden acceder en subgrupos o campos de bits
de 8, 16 o 32 bits según se requiera. Si su denominación tiene como prefijo E,
significa que el registro pertenece a un procesador de 32 bits y nos estamos
refiriendo a todos los 32 bits del registro, Sin prefijo y con sufijo X, indica que el
registro es de 16 bits o nos referimos a la porción menos significativa de 16 bits
de un registro de 32. Finalmente, estos 16 bits menos significativos se pueden
acceder como dos registros por separado, referenciando en uno a la parte alta
Prof. José Díaz Chow
Página 9
A R Q U I T E C T U R A
D E
M Á Q U I N A S
C O M P U T A D O R A S
I I ,
C U R S O
2 0 0 4 .
(sufijo H) y en el otro a la baja (sufijo L), cada una de 8 bits. Por ejemplo, el
registro EAX es el acumulador de 32 bits. Sus 16 bits menos significativos se
denominan AX, quien a su vez se divide en AH y AL. Los registros de propósito
general de la familia son;
o AX (EAX, AX, AH, AL): Acumulador. Es el registro principal, utilizado en
la mayoría de operaciones binarias. Además se emplea de manera
implícita en algunas instrucciones de multiplicación y división y en
algunas instrucciones aritméticas especializadas, así como en ciertas
operaciones de carácter específico como entrada, salida y traducción.
o BX (EBX, BX, BH, BL): Registro Base. Usado como registro base para
referenciar direcciones de memoria con direccionamiento indirecto,
manteniendo la dirección de la base o comienzo de tablas o matrices. De
esta manera, no es preciso indicar una posición de memoria fija, BX.
o CX (ECX, CX, CH, CL): Contador. Se utiliza comúnmente como contador
en bucles y operaciones repetitivas de manejo de cadenas. En las
instrucciones de desplazamiento y rotación se utiliza como contador de 8
bits.
o DX (EDX, DX, DH, DL): Datos. Este registro sirve como almacén auxiliar
de datos y en conjunción con AX.
Cabe mencionar que los registros AX-DX, EAX-EDX así como BX-CX, EBXECX se concatenan en algunas instrucciones específicas para obtener operandos o
resultados del doble del tamaño de cada uno de ellos.

REGISTROS DE PUNTEROS:
o SP: Stack Pointer. Mantiene la dirección tope del elemento de pila.
o BP:Base Pointer. Registro auxiliar en cálculos de la Pila.

REGISTROS DE INDICE:
o SI: Source Index. Utilizado como registro de índice en ciertos modos de
direccionamiento indirecto, también se emplea para guardar un valor de
desplazamiento en operaciones de cadenas.
o DI: Destination Index. Se usa en determinados modos de direccionamiento
indirecto y para almacenar un desplazamiento en operaciones con cadenas.

REGISTROS DE SEGMENTO: Son aquellos registros que apuntan al inicio de
un segmento.
o CS: Segmento de código.
o DS: Segmento de Datos.
o SS: Puntero que señala el inicio de segmento de pila.
Página 10
Prof. José Díaz Chow
A R Q U I T E C T U R A
D E
M Á Q U I N A S
C O M P U T A D O R A S
I I
o ES (Extra Segment): Segmento de ampliación para zona de datos. Es
extraordinariamente útil actuando en conjunción con DS, con ambos se
puede definir dos zonas de 64 Kb, tan alejadas como se desee en el espacio
de direcciones, entre las que se pueden intercambiar datos.

REGISTROS DE INSTRUCCIONES:
o IP: Lleva la dirección de la próxima instrucción dentro del segmento.
o IR: Mantiene la instrucción en ejecución.
 REGISTRO DE ESTADO O DE INDICADORES (flags).
Es un registro de 16 bits de los cuales 9 son utilizados para indicar diversas
situaciones durante la ejecución de un programa. Los bits 0, 2, 4, 6, 7 y 11 son
indicadores de condición, que reflejan los resultados de operaciones del programa; los
bits del 8 al 10 son indicadores de control y el resto no se utilizan. Estos indicadores
pueden ser comprobados por las instrucciones de salto condicional, lo que permite
variar el flujo secuencial del programa según el resultado de las operaciones.
15 14 13 12 11 10 9 8
7
6 5 4 3 2 1 0
OF DF IF TF SF ZF









AF
PF
CF
CF (Carry Flag): Indicador de acarreo. Su valor más habitual es lo que nos
llevamos en una suma o resta.
OF (Overflow Flag): Indicador de desbordamiento. Indica que el resultado de una
operación no cabe en el tamaño del operando destino.
ZF (Zero Flag): Indicador de resultado 0 o comparación igual.
SF (Sign Flag): Indicador de resultado o comparación negativa.
PF (Parity Flag): Indicador de paridad. Se activa tras algunas operaciones
aritmético-lógicas para indicar que el número de bits a uno resultante es par.
AF (Auxiliary Flag): Para ajuste en operaciones BCD.
DF (Direction Flag): Indicador de dirección. Manipulando bloques de memoria,
indica el sentido de avance (ascendente/descendente).
IF (Interrupt Flag): Indicador de interrupciones: puesto a 1 están permitidas.
TF (Trap Flag): Indicador de atrape (ejecución paso a paso).
Prof. José Díaz Chow
Página 11
A R Q U I T E C T U R A
3.3.4
D E
M Á Q U I N A S
C O M P U T A D O R A S
I I ,
C U R S O
2 0 0 4 .
Modos de direccionamiento
En ensamblador de la familia 80x86, tenemos los modos básicos de direccionamiento
inmediato, directo de registro y directo de memoria. En este último modo es necesario
especificar que dado el modelo segmentado del 8086, las variables deben ser
relocalizables en cualquier segmento de memoria en que se carguen, por tanto, el directo
de memoria con que trata el programador normalmente es en realidad una modo
desplazado relativo al segmento de datos activo en el momento. Por ejemplo,
mem8
.data
db
25
.code
. . .
move
al, mem8
En este caso, mem8 representa una variable de memoria relocalizable. Suponga que
mem8 inicia a partir del byte 18 del segmento de datos, entonces mem8 equivaldría a
escribir [18] y su dirección absoluta sería en realidad CS:18, es decir: CS << 4 + 18.
Usted puede especificar una dirección efectivamente absoluta, si es preciso,
especificando el registro de segmento a considerar de la forma Registro de Segmento:
Desplazamiento, como se muestra:
Move
ax,
ES:bx
Existe también una serie de modos complejos muy poderosos. Tenemos el modo
indirecto de registro: Move ax, [bx], muy utilizado. En este caso nótese que los
corchetes en ensamblador ix86 se denominan especificadores de índice y representan una
referencia a memoria o indirección.
Tenemos también una serie de modos desplazados: base-desplazamiento, indizados, baseíndice y los base-índice con escalación. Normalmente los registros BP, BX se llaman
registros base y SI y DI registros de índice. Un modo base, parte de un registro base + un
desplazamiento inmediato. Un modo indizado, parte de una dirección base + un registro
de índice opcional + un desplazamiento inmediato opcional. El modo base-índice parte de
una dirección base + un registro de índice + un desplazamiento inmediato opcional y el
modo con escalación, que está disponible solo en arquitectura de 32 bits, permite una
dirección generada a partir de un registro base o general + un registro de índice que puede
estar escalado, es decir multiplicado por un factor (0, 1, 2, 4 u 8) + un desplazamiento
opcional.
Ejemplos:
Página 12
base:
Indice:
b-i:
escalado:
[bx+4], BX[4]
TABLA [2], [TABLA+2], TABLA[DI]
Tabla[bx][di]
[BX+DI*4+2]
Prof. José Díaz Chow
A R Q U I T E C T U R A
3.3.5
D E
M Á Q U I N A S
C O M P U T A D O R A S
I I
El Conjunto de Instrucciones
3.3.5.1
Listado general de instrucciones:
Aritméticas
ADD: Suma binaria.
ADC: Suma con acarreo.
INC: Incremento en uno.
SUB: Resta binaria.
SUBB: Resta con el bit prestado.
DEC: Decremento en uno.
MUL: Multiplicación.
IMUL: Multiplicación con signo.
DIV: División entera.
IDIV: División entera con signo
NEG: Negación aritmética.
Lógicas
AND:
NOT:
OR:
XOR:
Y lógica.
Negación lógica.
O lógica.
O Exclusiva lógica.
Corrimiento de bits
RCL: Rotación a izquierda con acarreo.
RCR: Rotación a derecha con acarreo.
ROL: Rotación a izquierda.
ROR: Rotación a derecha.
SAL: Corrimiento aritmético a izquierda.
SAR: Corrimiento aritmético a derecha.
SHL: Corrimiento lógico a izquierda.
SHR: Corrimiento lógico a derecha.
SHLD: Corrimiento lógico a izquierda en doble precisión.
SHRD: Corrimiento lógico a derecha en doble precisión.
Comparación
CMP: Comparación
CMPS: Comparación de cadenas de caracteres
TEST: Verificación de bits
BSF/BSR: Exploración de bits (32bits).
BT/BTC/BTR/BTS: Prueba o test de bits (32 bits).
Prof. José Díaz Chow
Página 13
A R Q U I T E C T U R A
D E
M Á Q U I N A S
C O M P U T A D O R A S
I I ,
C U R S O
2 0 0 4 .
Conversión de Tipo
CBW: Convierte byte a palabra.
CDQ: Convierte palabra doble a cuádruiple.
CWD: Convierte palabra a palabra doble.
CWDE: Convierte palabra a palabra doble extendida.
Conversión ASCII-BCD
AAA:
AAD:
AAM:
AAS:
DAA:
DAS:
Ajuste ASCII después de sumar.
Ajuste ASCII antes de dividir
Ajuste ASCII después de multiplicar
Ajuste ASCII después de restar.
Ajuste decimal después de sumar.
Ajuste decimal después de restar.
Transferencia de datos
MOV: Transfiere o copia datos enteros.
MOVS: Transfiere cadenas de caracteres.
MOVSX: Mueve con extensión de signo.
MOVZX: Mueve con extensión de cero.
LEA: Carga dirección efectiva.
LDS: Carga el registro de segmento de datos.
LES: Carga el registro de segmento extra.
LSS: Carga el registro de segmento de pila.
LODS: Carga una cadena.
STOS: Almacena una cadena.
XCHG: Intercambia el contenido de los operandos.
XLAT: Traducción.
Operaciones con la pila
PUSH: Introduce un elemento a la pila.
POP: Remueve un elemento de la pila.
PUSHA: Introduce los GPR a la pila.
POPA: Restaura los GPR desde la pila.
Transferencia de Entrada-Salida
IN:
Lee desde un puerto E/S a un registro.
OUT: Escribe a un puerto de E/S.
Página 14
Prof. José Díaz Chow
A R Q U I T E C T U R A
D E
M Á Q U I N A S
C O M P U T A D O R A S
I I
Operaciones con banderas
CLC: Limpiar acarreo.
CLD: Limpiar dirección.
CLI: Limpiar interrupción.
STC: Establece la bandera de acarreo.
STD: Establece la bandera de acarreo.
STI: Establece la bandera de acarreo.
CMC: Complementa acarreo.
LAHF: Cargar banderas en AH.
SAHF: Cargar AH en banderas.
PUSHF: Introduce las banderas a la pila.
POPF: Restaura banderas desde la pila.
Operaciones con cadenas
CMPS: Compara cadenas.
LODS: Carga cadena.
MOVS: Mueve una cadena.
REP: Repite una cadena.
REPE: Repite la cadena mientras sea igual a.
REPZ: Repite la cadena mientras sea cero.
REPNE: Repite la cadena mientras sea igual a.
REPNZ: Repite la cadena mientras sea cero.
SCAS: Explora una cadena.
STOS: Almacena una cadena.
Operaciones de control de programa
CALL: Llamada a procedimiento.
RET: Regreso de procedimiento.
RETN/RETF: Regreso cercano / lejano.
INT: Llamada a Interrupción.
IRET: Regreso de la interrupción.
INTO: Interrupción de desborde.
JMP: Salto incondicional.
JA/JNBE: Salta si mayor / No menor o igual.
JAE/JNB: Salta si mayor o igual / No es menor.
JB/JNAE: Salta si es menor / No es mayor o igual.
JBE/JNA: Salta si es menor o igual / No es mayor.
JC/JNC: Salta si hay acarreo / No hay acarreo
JCXZ: Salta si CX es cero,
JE/JZ: Salta si es igual / Es cero.
JG/JNLE: Salta si es mayor / No es menor o igual.
JGE/JNL: Salta si es mayor o igual / No es menor.
Prof. José Díaz Chow
Página 15
A R Q U I T E C T U R A
D E
M Á Q U I N A S
C O M P U T A D O R A S
I I ,
C U R S O
2 0 0 4 .
JL/JNGE: Salta si es menor / No es mayor o igual.
JLE/JNG: Salta si es menor o igual / No mayor.
JNE/JNZ: Salta si no es igual / No es cero.
JNP/JPO: Salta si no hay paridad / Paridad es par.
JO/JNO: Salta si hay desbordamiento / No hay desbordamiento.
JP/JPE: Salta si hay paridad / Paridad es par.
JS/JNS: Salta si el signo es negativo / Es positivo.
Ciclos
LOOP: Repetir el ciclo.
LOOPE: Repetir mientras sea igual a.
LOOPZ: Repetir mientras sea cero.
LOOPNE: Repetir mientras no sea igual a.
LOOPNZ: Repetir mientras no sea cero.
Control del procesador
ESC: Escape.
HLT: Introduce en estado de detención.
LOCK: Bloquea el bus.
NOP: No operar.
WAIT: Pone el procesador en estado de espera.
3.3.5.2
Listado más detallado:
En la siguiente tabla se muestran encolumnados los Mnemónicos (como MOV), los
operandos (como fuente, destino) y la descripción de la operación. Los operandos son
combinaciones entre tipos (registro, memoria e inmediato) con los direccionamientos
admitidos en cada instrucción. Las instrucciones IN y OUT admiten un cuarto tipo de
operando: puertos de I/O, con direccionamiento registro o inmediato.
 Instrucciones de movimientos de datos
MOV
destino, fuente ;la única instrucción que utiliza todos los tipos de direccionamiento
XCHG
destino, fuente ;Intercambia los contenidos de destino y fuente
XLAT
tabla_fuente
;carga el registro AL con el byte direccionado por (BX+AL)
LAHF
;carga las flags S, Z, A, P y C en AH
SAHF
;guarda AH en el registro de flags
LDS
destino,fuente
;transfiere un puntero de 32 bits al registro DS y al registro destino
LES
destino,fuente
;transfiere un puntero de 32 bits al registro ES y al registro destino
Página 16
Prof. José Díaz Chow
A R Q U I T E C T U R A
D E
M Á Q U I N A S
C O M P U T A D O R A S
I I
LEA
destino,fuente
;transfiere el offset de fuente (una dirección) a destino (un registro)
PUSH
fuente
;guarda fuente en el stack (en la dirección SS:SP)
POP
destino
;recupera del stack (dirección SS:SP-1) y guarda en registro destino
PUSHF
;almacena el registro de flags en/desde el stack
POPF
;recupera el registro de flags en/desde el stack
PUSHA
; almacena los reg DI,SI,BP,SP,BX,DX,CX,AX en/desde el stack
POPA
;recupera los reg DI,SI,BP,SP,BX,DX,CX,AX en/desde el stack
IN
origen
;carga desde un puerto origen un byte o word en AL o AX
OUT
destino
;escribe Al o AX en el puerto destino (direccionamiento inmediato o DX)
 Las operaciones aritméticas
ADD
destino,fuente
;suma fuente + destino y guarda el resultado en destino
ADC
destino,fuente
;suma fuente + destino + Carry y guarda el resultado en destino
SUB
destino,fuente
;resta destino - fuente y guarda el resultado en destino
SUB
destino,fuente
;resta destino - fuente - Carry y guarda el resultado en destino
MUL
fuente
;multiplica AL o AX * fuente y guarda el resultado en DX:AX
IMUL
fuente
;igual que la anterior pero con numeros enteros con signo
DIV
fuente
;divide DX:AX / fuente y guarda cociente en AX y resto en DX
IDIV
fuente
;igual que la anterior pero con numeros enteros con signo
AND
destino,fuente
;opera destino AND fuente y guarda resultado en destino
OR
destino,fuente
;opera destino OR fuente y guarda el resultado en destino
XOR
destino,fuente
;opera destino XOR fuente y guarda el resultado en destino
NOT
destino
;el NOT cambia todos los 1 en 0 y los 0 en 1 de destino.
NEG
destino
;NEG realiza el complemento a 2 de destino
INC
destino
;Incremente en 1 el contenido de destino
DEC
destino
;Decrementa en 1 el contenido de destino
DAA / DAS
;Efectúa el ajuste decimal en suma / resta del registro AL
AAA/AAD/
AAM/AAS
;ajustan el registro AL a valor decimal desempaquetado (para aplicar en
operaciones suma, resta, multiplicación y división)
 Instrucciones de rotación
RCL
destino,contador
;rota destino a través de carry a la izquierda contador veces
RCR
destino,contador
;rota destino a través de carry a la derecha contador veces
ROL
destino,contador
;rota destino a la izquierda contador veces
ROR
destino,contador
;rota destino a la derecha contador veces
Prof. José Díaz Chow
Página 17
A R Q U I T E C T U R A
D E
M Á Q U I N A S
C O M P U T A D O R A S
I I ,
C U R S O
2 0 0 4 .
SAL
destino,contador
;desplaza destino a la izquierda contador veces y rellena con ceros
SAR
destino,contador
;desplaza destino a la derecha contador veces y rellena con bit SF
SHR
destino,contador
;desplaza destino a la derecha contador veces y rellena con ceros
 Instrucciones de comparación
CMP
destino,fuente
;compara fuente y destino. Modifica las flags V, Z, S, C, P y AC
TEST
destino,fuente
;AND entre fuente y destino . Ninguno de los operandos cambia.
TEST modifica las mismas flags que CMP pero siempre deja a V = 0 y C = 0.
 Instrucciones de strings
CMPS
string_destino,string_fuente
;compara las dos cadenas de a bytes o words
CMPSB
string_destino,string_fuente
;origen y destino indicados por DS:SI y ES:DI (bytes)
CMPSW
string_destino,string_fuente
;origen y destino indicados por DS:SI y ES:DI (words)
LODS
string_fuente
;mueve un byte o una word desde fuente a AL o AX
LODSB
string_fuente
;origen indicado por DS:SI (mueve un byte a AL)
LODSW
string_fuente
;origen indicado por DS:SI (mueve una word a AX)
STOS
string_destino
;mueve un byte o una word al destino desde AL o AX
STOSB
string_destino
;destino indicado por ES:DI (mueve AL a un byte)
STOSW
string_destino
;destino indicado por ES:DI (mueve AX a una word)
MOVS
string_destino,string_fuente
;mueve un byte o word de fuente a destino
MOVSB
string_destino,string_fuente
;origen y destino indicados por DS:SI y ES:DI (un byte)
MOVSW string_destino,string_fuente
;origen y destino indicados por DS:SI y ES:DI (una word)
SCAS
string_destino
;compara la cadena de destino con AL o AX
SCASB
string_destino
;destino indicado por ES:DI (compara AL con un byte)
SCASW
string_destino
;destino indicado por ES:DI (compara AX con una word)
En todos los casos, si se utiliza el prefijo REP, la cantidad de elementos de la cadena a
operar está dada por el contenido del registro CX, si no es un solo elemento de la cadena.
A cada operación, CX es decrementado y SI y DI son incrementados o decrementados de
acuerdo con el estado de la flag de dirección (Si D=0, se incrementan). El incremento o
decremento de estos registros se hace de a uno si son operaciones de bytes o de a dos si
son de a words. Para los casos en que se especifica el largo del operando con la B o W
final, la string_destino está apuntada por ES:DI, la string_fuente está apuntada por DS:SI
.
Página 18
Prof. José Díaz Chow
A R Q U I T E C T U R A
D E
M Á Q U I N A S
C O M P U T A D O R A S
I I
 Instrucciones de repetición
LOOP
offset
;decrementa CX. Si CX no es cero, salta a offset (IP = IP + offset)
LOOPZ
offset
;decrementa CX, Si CX <> 0 y Z = 1 , salta a offset (IP = IP + offset)
LOOPNZ offset
;decrementa CX, Si CX <> 0 y Z = 0 , salta a offset (IP = IP + offset)
* Ver además el grupo REP en instrucciones de cadenas
 Instrucciones de salto
CALL
destino
;llama a procedimiento. IP <-- offset de destino y CS <-- segmento de destino
RET
valor
;retorna desde un procedimiento (el inverso de CALL), valor es opcional
INT
número
;llamado a interrupción. CS:IP <-- vector de INT.Las flags se guardan en el stack
INTO
;llama a la INT 4 si la flag de overflow (V) está en 1 cuando se ejecuta la
instrucción
IRET
;retorna de interrupción al programa restaurando flags
JMP
dirección
;Salta incondicionalmente al lugar indicado por dirección
JA
offset
;salta a IP + offset si las flags C=0 Y Z=0 (salta si primer operando es mayor)
JAE
offset
;salta a IP + offset si la flag C=0 (salta si primer operando es mayor o igual)
JB
offset
;salta a IP + offset si las flags C=1 (salta si primer operando es menor)(igual a JC)
JBE
offset
;salta a IP + offset si las flags C=1 o Z=1 (salta si primer operando es menor o
igual)
JZ
offset
;salta a IP + offset si las flags Z=1 (salta si primer operando es igual al
segundo)(=JE)
JG
offset
;salta a IP + offset si las flags S=V Y Z=0 (salta si primer operando es mayor)
JGE
offset
;salta a IP + offset si las flags S=V (salta si primer operando es mayor o igual)
JL
offset
;salta a IP + offset si las flags S<>V (salta si primer operando es menor)
JLE
offset
;salta a IP + offset si las flags S<>V o Z=1(salta si primer operando es menor o
igual)
JNC
offset
;salta a IP + offset si la flag C=0 (salta si no hay carry)
JNZ
offset
;salta a IP + offset si la flag Z=0 (salta si no son iguales o no es cero)
JNO
offset
;salta a IP + offset si la flag V=0 (salta si no hay overflow)
JNP
offset
;salta a IP + offset si la flag P=0 (salta si no hay paridad -o la paridad es impar
=JPO)
JNS
offset
;salta a IP + offset si la flag S=0 (salta si no hay hay bit de signo)
JO
offset
;salta a IP + offset si la flag V=1 (salta si hay desbordamiento -overflow)
JP
offset
;salta a IP + offset si la flag P=1 (salta si la paridad es par ) (=JPE)
JS
offset
;salta a IP + offset si la flag S=1 (salta si el signo es negativo)
JCXZ
offset
;salta a IP + offset si la flag CX=0 (salta si el registro CX es cero)
Prof. José Díaz Chow
Página 19
A R Q U I T E C T U R A
D E
M Á Q U I N A S
C O M P U T A D O R A S
I I ,
C U R S O
2 0 0 4 .
Las instrucciones de saltos por Above o Below se refieren entre dos valores sin signo
(JA, JAE, JB y JBE), mientras que las Greater y Less se refieren a la relación entre dos valores con
signo (JG, JGE, JL y JLE).
 Instrucciones que afectan flags
CLC/CMC/STC ;pone a cero / complementa / pone en 1 la flag C (carry)
CLD/STD
;pone a cero / uno la flag de dirección (D=0 hace que SI y DI se incrementen)
CLI/STI
;deshabilita / habilita las interrupciones por hardware enmascarables
 Instrucciones misceláneas
NOP
;no-operación: el procesador pasa a la instrucción siguiente sin hacer nada
CBW
;convierte el byte de AL en palabra (AX), copiando el bit 7 a todo el registro AH
CWD
;convierte word en double-word, copiando bit 15 de AX a todo el registro DX
HLT
;el procesador se detiene hasta que llegue un Reset o una interrupción por hard.
3.3.6
Los servicios de la ROM BIOS
Uno de los recursos más valiosos que asiste al programador de ensamblador de la PC son
los servicios de la ROM BIOS. Estos servicios se refieren a una serie de rutinas de
entrada salida (Basic Input Output Services) que se encuentran almacenadas en la
memoria ROM del sistema. Estas rutinas permiten acceder y programar el hardware
básico de la PC.
Todos los servicios de la BIOS se invocan mediante interrupciones. Estos servicios
pueden agruparse en cinco temas de acuerdo al objetivo. Cada tema contiene una serie de
servicios organizados en torno a la estructura hardware o función que soportan,
empleando una interrupción diferente para cada grupo de servicios, según muestra la
tabla:
Interrupción
Hex
Dec
10H
13H
14H
15H
16H
17H
16
19
20
21
22
23
11H
12H
17
18
Página 20
Uso
Servicios de dispositivos periféricos
Servicios de video
Servicios de disco
Servicios de comunicaciones seriales
Servicios del sistema
Servicios del teclado
Servicios de impresión
Servicios de estado del equipo
Listado de equipamiento del sistema
Tamaño de memoria
Servicios de fecha y tiempo
Prof. José Díaz Chow
A R Q U I T E C T U R A
1AH
26
5H
5
18H
19H
24
25
D E
M Á Q U I N A S
C O M P U T A D O R A S
I I
Servicios de hora y fecha
Servicio de impresión de pantalla
Impresión de la pantalla
Servicios especiales
Activar la ROM Basic
Activar rutina de arranque
Llamadas al sistema operativo DOS: INT 21H
Aunque el DOS reserva para su uso muchas interrupciones (desde la 20H hasta la 3FH),
normalmente los servicios del sistema los proporciona a través de solo cinco de ellas:
20H, 21H, 25H, 26H y 27H.
Interrupción
Hex
Dec
20H
32
21H
33
25H
37
26H
38
27H
39
Descripción
Terminación de programa
Servicios generales del DOS
Lectura absoluta de disco
Escritura absoluta en disco
Terminar y quedar residente
Para efectos de este curso nos centraremos en los servicios generales o interrupción 21H.
La interrupción 21h, provee una serie de funciones. Para invocar a un servicio del DOS
mediante la interrupción 21H, se establece el número de función en AH y el parámetro en
AL.
Por ejemplo:
Mov
Mov
Int
ah, 4CH
al, 0
21H
; Función regresar al DOS
; Valor de retorno = 0, normal.
; Llama al DOS.
ax, 4C00H
21H
; Función regresar al DOS normalmente.
; Llama al DOS.
Equivale a:
Mov
Int
Un programa en lenguaje ensamblador está compuesto por una secuencia de
sentencias. Estas sentencias representan tanto instrucciones del procesador como
directivas o comandos al ensamblador.
3.3.7
El lenguaje ensamblador.
El lenguaje ensamblador permite al programador a bajo nivel escribir código
directamente interpretable por el CPU sin necesidad de conocer exactamente el lenguaje
Prof. José Díaz Chow
Página 21
A R Q U I T E C T U R A
D E
M Á Q U I N A S
C O M P U T A D O R A S
I I ,
C U R S O
2 0 0 4 .
de máquina. Un programa en ensamblador se compone por una secuencia de sentencias
ensamblador. Una sentencia en ensamblador se estructura de la siguiente forma:
[[nombre:]] [[operacion]] [[operandos]] [[;comentario]]
Donde nombre: es un identificador de etiqueta de código, que es una referencia simbólica
a la dirección de la instrucción y a la instrucción misma. El componente opcional
operacion representa una instrucción del procesador o una directiva o comando del
ensamblador. Los operandos representan los operandos de las instrucciones o parámetros
de las directivas y finalmente, un comentario es una facilidad para documentar la
sentencia e inicia con un punto y coma (;) y termina al final de la línea.
Un identificador es un nombre que se asigna a una definición a fin de poder referirse a
ella de forma única. Usamos identificadores para nombrar constantes, variables,
procedimientos, segmentos, tipos de datos definidos por el usuario y etiquetas de código.
Los identificadores pueden tener una longitud máxima de 247 caracteres. No pueden
comenzar con un dígito y no pueden usarse como nombres las palabras reservadas.
Aunque pueden usarse algunos caracteres especiales (como _ y $) es mejor evitarlos si no
se requieren.
Los operandos pueden expresarse en diferentes modos de direccionamiento, por ejemplo
de forma inmediata o mediante el uso de contenedores (operandos en registros o en
memoria). Existen diferentes tipos de datos, esncialmente Enteros. Por defecto estos
tipos son:
BYTE (8 bits), WORD (16 bits), DWORD (32 bits), QWORD (64 bits) y TBYTE (80
bits).
Mediante la directiva Dx podemos definir variables de memoria de un tipo de datos x,
donde x ( Mem8 db ? ; Define la variable tipo byte sin inicialización).
Se puede tratar secuencias de unidades de datos del mismo tipo como arreglos. Por
ejemplo, se pueden tratar secuencias de bytes como cadenas.
Página 22
Prof. José Díaz Chow
A R Q U I T E C T U R A
D E
M Á Q U I N A S
C O M P U T A D O R A S
I I
3.4 Los Chips de Apoyo
3.4.1
El temporizador del sistema 8253-5
El temporizador del sistema 8253-5 implementa las funciones de base de tiempo
requeridas por la computadora para marcar el inicio del ciclo de refrescamiento de la
memoria RAM y el contador de tiempo real de la máquina. El chip en realidad contiene 3
temporizadores internos accedidos mediante canales, cada uno con una función
específica:



3.4.2
Canal 0: Provee soporte para implementar el reloj de tiempo real, interrumpe al
CPU cada 55ms.
Canal 1: Apoya los ciclos de DMA. Está programado para solicitar una
transferencia DMA cada 15.2 s. El DMA responde con un ciclo de
refrescamiento de memoria.
Canal 2: Soporte a la interfaz del disquete y el speaker de audio.Se puede usar
para grabar tonos en una tape o activar el speaker para implementar alarmas
auditivas, música rudimentaria y otros sonidos. Note que a partir de la PC XT, se
suprimió el soporte a disquete.
El controlador de DMA
El controlador de DMA permite mejorar la velocidad de transferencia de datos desde
los dispositivos de almacenamiento masivo hacia la memoria. Las transferencias por
DMA en la PC original son al menos 4 veces más rápidas que las dirigidas por
programas. El 8237-5 que se empleó en la PC original, tenía las siguientes características:





Cuatro canales de DMA independientes
Registros de direcciones y conteo de 16 bits
Cuatro tipos de transferencia: MM, MIO, IOIO e IOM.
Esquema de prioridades programable
Condiciones de sincronización y terminación programables.
En la IBM PC, sin embargo, se limitaba la flexibilidad del chip por cuanto las
transferencias requerían ser entre M e IO. Además, dado que los registros de direcciones
eran de 16 bits y no de 20, se requerían tres registros de 4 bits para completar las
direcciones de 20 bits del 8086. Estos registros se denominaron de ‘página’. Un efecto
limitante de esta característica fue que las trasferencias no se podían realizar entre
fronteras de página que eran de 64KBytes cada una. Finalmente, en la PC el DMA Chip
se programó en el modo de ‘transferencia simple’ que obliga al controlador a liberar el
bus del sistema después de cada transferencia, limitando la tasa de frecuencia máxima
soportada a 422 kHz.
Prof. José Díaz Chow
Página 23
A R Q U I T E C T U R A
D E
M Á Q U I N A S
C O M P U T A D O R A S
I I ,
C U R S O
2 0 0 4 .
Los canales del DMA en la IBM PC daban soporte a las siguientes tareas:




Canal 0: Ciclos de refrescamiento de memoria.
Canal 1: No usado.
Canal 2: Soporte al disquete.
Canal 3: Soporte al disco duro.
La prioridad de cada canal es inversa a su identificación (Canal 0 es el de máxima
prioridad).
3.4.3
El Controlador programable de Interrupciones (PIC)
El soporte a las interrupciones de la PC está dado por el 8086 a través de dos líneas de
control: NMI e INTR. El pin NMI es disparado por flanco y normalmente se usa para
notificar situaciones severas como fallo de memoria o de energía. INTR se emplea para
las interrupciones del hardware regulares. Las interrupciones regulares pueden ser
enmascaradas, es decir, deshabilitadas mediante el apagado de la bandera de
interrupciones (instrucción CLI) y habilitadas encendiendo dicha bandera (STI). En la
IBM PC, existen 3 fuentes para NMI: Error de paridad de Memoria, Error de paridad del
canal de E/S y la interrupción del 8087.
Para lidiar con las múltiples fuentes de INTR, se emplea el Controlador programable de
interrupciones (PIC) en la PC. El 8259A es un chip que permite controlar por esquema de
prioridades hasta 8 líneas de solicitud de interrupciones. En las PC AT ya se brinda
soporte a 16 interrupciones mediante la característica de conexión en cascada del PIC.
En la IBM PC, la IRQ 0 estaba asignada al reloj de tiempo real, la 1 al teclado, la 3 y 4 a
los puertos de comunicación; la 5 al disco duro, la 6 al disquete y la 7 a la impresora.
Nuevamente la mayor prioridad se aplica al IRQ de identificador menor.
Bus de Direcciones/Datos/Control de la CPU
INTA*
INTA*
INT
Esclavo 8259A
Control
IRQ8
IRQ10
IRQ12
IRQ14
IRQ9
IRQ11
IRQ13
IRQ15
INT
Master 8259A
IRQ0
IRQ2
IRQ4
IRQ6
IRQ1
IRQ3
IRQ5
IRQ7
Bus ISA (AT)
Organización de dos PIC en cascada en el sistema PC AT
Página 24
Prof. José Díaz Chow
A R Q U I T E C T U R A
D E
M Á Q U I N A S
C O M P U T A D O R A S
I I
3.5 La entrada y salida estándar.
3.5.1
El video de la PC
El video en la PC se obtiene gracias a un adaptador gráfico que genera las señales de
video y un monitor que las presenta en una pantalla. Existen básicamente dos modos
generales de video en la PC: el Modo carácter o texto y el modo gráfico.
En el contexto de este curso, solamente consideraremos el modo texto, a las funciones
más básicas y simples de video.
3.5.1.1
La pantalla
La pantalla de la PC en modo texto representa una matriz de caracteres organizados en
filas y columnas. El modo de video de texto más conocido es el de 25 filas por 80
columnas. El primer carácter en la esquina superior izquierda de la pantalla tiene la
posición fila 0, columna 0 (0,0). El carácter en la esquina inferior izquierda tiene la
posición (24,0). El de la esquina superior derecha (0,79) y el de la inferior derecha es la
(24, 79).
La pantalla del monitor puede presentar los datos que se escriben en un buffer de video
que es un área de memoria a la que tiene acceso el programador.
Esta área de memoria de video está organizada en páginas, de la cual solo una se muestra
a la vez. Esto que permite escribir varias pantallas de video directamente en memoria y
luego intercambiar entre ellas para hacer cambios rápidos de contenido en la pantalla.
Cada carácter pintado en la pantalla se representa por dos bytes en la memoria. Uno
almacena los atributos de visualización y el otro el código ASCII del carácter. Los
atributos pueden ser: Color de frente, color de fondo, intensidad y parpadeo.
3.5.1.2
Procesamiento básico de pantalla
En este curso abordaremos brevemente las funciones más básicas de procesamiento en
pantalla proporcionadas por algunas funciones de la interrupción 10H de la BIOS:
Limpiar la pantalla, posicionar el cursor, pintar un carácter con y sin atributo. Finalmente
estudiaremos como escribir una cadena completa mediante el servico 09H de la
interrupción de servicios del sistema del DOS, int 21H.
Prof. José Díaz Chow
Página 25
A R Q U I T E C T U R A
D E
M Á Q U I N A S
C O M P U T A D O R A S
I I ,
C U R S O
2 0 0 4 .
En términos generales, la Int 10H espera que la función a ejecutar se escriba en el registro
AH y en AL los parámetros básicos. Si la cantidad de parámetros crece, emplea los otros
registros generales para completarlos. Por ejemplo, BH y BL sirven regularmente para
definir ya sea atributo en modo texto o el número de la página de video a afectar. CX y
DX para coordenadas de la ventana (CH, CL: Fila, Columna de la esquina superior
izquierda; DH, DL: Fila, Columna de la esquina inferior derecha).
 Borrar la pantalla
La función 6H de la int 10H permite definir una ventana rectangular y deslizar su
contenido. Esto puede emplearse para borrar la pantalla.
El siguiente código limpia la pantalla completa:
Mov
Mov
Mov
Mov
Mov
Int
ah,
al,
bh,
cx,
dx,
10H
06h
00h
07h
0000h
184fh
;Selecciona función
; Limpiar toda la ventana seleccionada
; Blanco sobre negro.
; Esquina Sup. Izq: (0,0)
; Esquina Inf. Der: (24,79)
 Posicionar el cursor
La función 02h de la Int 10H del BIOS permite posicionar el cursor en la pantalla. Según
lo acostumbrado de escribe en AH la función (Ah2h). En BH se escribe el número de
página (por defecto 0), y en DH, DL, la Fila, Columna de la posición a establecer para el
cursor.
Mov
Mov
Mov
Mov
Int
ah,
bh,
dh,
dl,
10H
02h
00h
05
12
; Selecciona función
; Página por defecto.
; Posiciona el cursor en
; la posición (5,12)
 Escribir un carácter en la posición actual del cursor
La función 09h de la Int 10H del BIOS permite escribir (y repetir) un carácter con un
atributo determinado en la posicionar actual del cursor en la pantalla. La función 0Ah
hace lo mismo pero sin considerar atributo (el carácter se escribe con el atributo actual).
Como siempre, en AH se escribe la función (Ah09h | 0Ah). En Al se pone el carácter a
escribir. En BL se escribe el atributo de video y en CX, la cantidad de veces a escribir el
carácter en pantalla.
Mov
Mov
Mov
Mov
Int
Página 26
ah,
al,
bl,
cx,
10H
09h
‘A’
14h
01
;
;
;
;
Selecciona función escribe con atributo
Escribir una A
Atributo de color rojo sobre azul.
Solo pintarla 1 vez
Prof. José Díaz Chow
A R Q U I T E C T U R A
Mov
Mov
Mov
Int
ah, 0ah
al, ‘A’
cx, 01
10H
D E
M Á Q U I N A S
C O M P U T A D O R A S
I I
; Selecciona función escribe sin atributo
; Escribir una A
; Solo pintarla 1 vez
 Despliegue de cadenas en pantalla con función del DOS
La función 09h de la Int 21H del DOS permite desplegar una cadena completa. Esta
cadena debe estar delimitada por el “guardián” del DOS, el carácter ´$´. Similar a las
interrupciones del BIOS, la Int 21H requiere recibir la función en AH. La dirección de la
cadena a desplegar se requiere en DX:
.data
Saludo db
“Hola amigos,”, 01H, ‘$’
.code
. . .
Mov
lea
Int
3.5.2
ah, 09h
dx, Saludo
21H
; Selecciona función de despliegue del DOS
; Dirección de inicio de la cadena
La entrada estándar de la PC
En la IBM PC y compatibles, se ha definido el teclado como el dispositivo de entrada
estándar. El teclado es un dispositivo que presenta un conjunto de teclas en una
disposición estándar. Cuando el usuario presiona una tecla, en realidad cierra un circuito
al unir el contacto en la intersección de la fila y columna correspondiente a la tecla. Estas
señales alimentan un codificador que genera un código de exploración del teclado en
función de la posición de la tecla en la matriz. Por ejemplo, la tecla ESC que se encuentra
en la esquina superior izquierda del teclado corresponde al código de exploración 1, F1
que le sigue es 2, y así en lo sucesivo.
Además de generarse el código de exploración, el controlador del teclado, genera una
interrupción de hardware. La BIOS trata esta interrupción llevando al Buffer del teclado
el carácter correspondiente a la tecla pulsada pero ya en código ASCII. Por ejemplo, el
ESC sería un 27.
3.5.2.1
Procesamiento básico de teclado
En el contexto de este curso, exploraremos algunas de las funciones más básicas de
teclado, empleando la interrupción 16H de la BIOS y el servicio 0AH del DOS.
Prof. José Díaz Chow
Página 27
A R Q U I T E C T U R A
D E
M Á Q U I N A S
C O M P U T A D O R A S
I I ,
C U R S O
2 0 0 4 .
 Leer el siguiente carácter del teclado
La función 00H de la Int 16H del BIOS, permiten esperar y leer el próximo carácter
desde el teclado. Si no hay un carácter en el buffer, la función se queda esperando
indefinidamente por la pulsación de un carácter. El carácter leído queda en AL. Cabe
mencionar que si se pulsó un carácter especial, como las teclas de función, se generan dos
bytes, el primero es un 0 y el segundo es la definición de la tecla.
El siguiente código lee el próximo carácter del teclado:
Mov
Int
ah, 00h
16H
; Selecciona función de lectura
al, 27
; Se tecleó ESC?
. . .
Cmp
 Comprobar si existe un carácter en el buffer del teclado
Frecuentemente, no queremos esperar a que presionen un carácter sino, que queremos
monitorear si se hizo de forma transparente. Esto nos lo permite la función 01h de la Int
16H del BIOS. Si se encontraba un carácter en el buffer, la función establece la bandera Z
a 1 y retorna en AL el carácter en el buffer, pero no lo retira de allí. Habría que invocar la
función 00h para hacerlo. El siguiente código muestra el uso de la función:
leerCar:
Mov
Int
jz
Jmp
HayCaracter :
Mov
Int
ah, 01h
16H
HayCaracter
leerCar
; Selecciona función verificar
; Invoca a función
; Página por defecto.
ah, 00h
16H
; Selecciona función leer
; lee el carácter en AL
 Leer una cadena completa desde el teclado
El DOS nos provee una importante función o servicio que permite leer toda una cadena
desde el teclado, poniendo a disposición nuestra todas las teclas de edición además
(BackSpace, Delete, etc).
Requiere la definición de un espacio de memoria en el área de datos donde especificar
parámetros de la función y guardar la cadena leída. El ejemplo a continuación lee una
cadena de un máximo de 20 caracteres desde el teclado.
.data
Página 28
Prof. José Díaz Chow
A R Q U I T E C T U R A
D E
M Á Q U I N A S
C O M P U T A D O R A S
I I
; Definición de la lista de parámetros
ParLeer Label
MaxLon db
LonReal db
Cadena db
Byte
20
?
20
dup(‘ ‘)
.code
mov ah, 0ah
lea dx, ParLeer
int 21h
3.5.3
; Solicita función de lectura
; provee la dirección de la lista de par
; invoca al DOS
Las interfaces estándares de la PC
En la IBM PC original, las interfaces estándares que se definieron son la serie o
de comunicaciones y la interfaz paralelo o de impresora. Con el desarrrollo de la
tecnología y la expansión del uso de las computadoras en diversas áreas del
conocimiento, se identificó el potencial y flexibilidad de tener estas interfaces que hacían
innecesario a los productores de aplicaciones hardware nuevas, tener que desarrollar un
módulo controlador de entrada salida en forma de una tarjeta de expansión. Sin embargo
tales interfaces tienen ciertos limitantes debido a que su diseño original fue destinado a
una aplicación en específico. Además, su velocidad de transferencia estaba limitada por
la tecnología empleada.
Con el objetivo de mejorar el soporte a aplicaciones varias mediante estas interfaces, en
la PC se han ido introduciendo mejoras que mantienen la compatibilidad hacia atrás.
Finalmente, el estándar USB, introducido primeramente en las computadoras Apple, fue
acogido por los fabricantes de PC. Hoy día IBM basa su estrategia de conectividad con
periféricos en USB.
Los puertos seriales envían y reciben un bit de dato a la vez sobre una única línea de
comunicación, por tanto toma al menos ocho pulsos o tiempos de bits transferir cada byte
de dato sobre esta vía. Estas interfaces permite comunicación full-duplex con solamente
tres líneas separadas, una para enviar, una para recibir y una señal común a tierra. La
interfaz serial de la PC sigue el estándar RS-232-C de la EIA.
Los puertos paralelos envían y reciben ocho bits de datos a la vez sobre ocho líneas
separadas. Esto permite a los datos ser transferidos rápidamente, sin embargo, el cable
requerido es más grueso debido al número de líneas individuales que debe contener. Los
puertos paralelos son típicamente utilizados para conectar una PC a una impresora, sin
embargo se han desarrollado una serie de aplicaciones que le permiten extender las tareas
que este puerto ha realizado en la PC.
Prof. José Díaz Chow
Página 29
A R Q U I T E C T U R A
D E
M Á Q U I N A S
C O M P U T A D O R A S
I I ,
C U R S O
2 0 0 4 .
3.6 El subsistema de almacenamiento.
El subsistema de almacenamiento masivo o secundario nos provee de gran
cantidad de espacio de almacenamiento, por lo general, permanente. Aunque por función
este es identificable como parte de la memoria, por estructura, corresponde al sistema de
entrada / salida por cuanto se implementa mediante dispositivos periféricos como discos
magnéticos u ópticos o dispositivos de cintas.
El acceso a la memoria principal es mediante palabras, sin embargo, al sistema de
almacenamiento no podemos acceder de esa forma tan fina porque los tiempos de acceso
son bastante menores que a la memoria principal y la cantidad de datos bastante mayores.
Por tanto, el acceso al almacenamiento se organiza por bloques de bytes.
Los discos magnéticos, que constituirán nuestro caso de estudio en este curso, organizan
su espacio en base a la geometría del disco y se accede al mismo mediante ‘sectores’ que
son normalmente, bloques de 512 bytes.
Como estos bloques de datos se almacenan de manera permanente, es necesario
implementar un mecanismo para poder acceder a ellos cuando se requiera. Para esto se
implementó el concepto de archivo que permite tener una serie de bytes de información
relacionada en una sola entidad de acceso al disco. Para la manipulación y administración
de los archivos en una computadora se implementó el sistema de archivos. En este
Curso nos centraremos en el sistema de archivos del MS-DOS, que a pesar de ser
rudimentario, tiene todos los elementos necesarios para nuestro estudio.
3.6.1
La geometría del Disco
El disco se organiza tanto lógicamente como en su formato físico en pistas y
sectores. Una pista es un anillo de datos en la superficie del disco, concéntrico a su eje o
centro. Las pistas se encuentran numeradas a partir del 00, la más externa. Un sector es
un sector circular sobre tal pista. Los disquetes pueden tener una o dos caras en cambio
en los discos duros, que en realidad se componen internamente por más de un disco, se
contabilizan las cabezas lectoras (que equivale a la cantidad de caras en las que se escribe
datos). Dado que el conjunto de pistas de todas las caras de todos los discos internos de
un disco duro se acceden a la vez, se incide sobre una estructura tridimensional de datos,
por lo cual, en estos discos no se denomina pista este elemento de la geometría, sino
cilindro.
Dado que los tamaños de los sectores se han estandarizado (normalmente a 512 bytes), es
posible determinar el tamaño de un disco en base a su geometría o la geometría de su
formato. Por ejemplo, un disquete de 720 Kb tiene la siguiente geometría:
2 caras * 80 pistas * 9 sectores/pista * 512 bytes/sector = 720 KBytes
Página 30
Prof. José Díaz Chow
A R Q U I T E C T U R A
D E
M Á Q U I N A S
C O M P U T A D O R A S
Head 0
I I
Head 2
Geometría y estructura de un disco duro
Track
Sec
to
r
Geometría de un disquete
3.6.2
Estructura lógica del disco según DOS
El MS-DOS, estructura el disco de manera lógica para dar soporte a su sistema de
archivos. Primero, establece un número de sector lógico en vez de emplear la dirección
física del sector (cabeza o lado, pista o cilindro, sector). El número lógico del sector se
forma mediante un procedimiento simple: primero los sectores de la pista 0 de la cara 0,
Prof. José Díaz Chow
Página 31
A R Q U I T E C T U R A
D E
M Á Q U I N A S
C O M P U T A D O R A S
I I ,
C U R S O
2 0 0 4 .
luego secuencialmente a partir de allí, los de la pista 0 lado 1 y en lo sucesivo para todos
los lados o cabezas. Segundo, para facilitar el acceso a los archivos, establece unidades de
asignación o clusters. Tercero, define dos áreas en el disco: el área del sistema y el área
de datos de usuario. En el área del sistema se encuentran estructuras de datos especiales
que permiten el trabajo del sistema de archivo: Boot record, FATs y Directorio.
Area de datos del usuario.
Contiene los datos agropados
en archivos
Directorio Raiz.
Contiene entradas
describiendo
archivos, volumen,
nombres y
subdirectorios.
Primer
sector del
disco
Boot area
Jump
Code
Vendor
Identification
BIOS
Parameter
Block
Segunda FAT
Boot
Code
Primera FAT (File Allocation Table)
contiene informatción de todos los
clusters del area de datos de usuario
Áreas lógicas del disco definidas por DOS
Vamos a ejemplificar la ubicación física de estas estructuras con un caso de estudio
simple: el disquete de 360K:
Página 32
Side 0
Pista 0
Sector 1
Sector 2
Sector 3
Sector 4
Sector 5
Sector 6-9
Boot Record (sector de arranque)
FAT 1 s1 (copia uno de la FAT)
FAT 1 s2
FAT 2 s1
FAT 2 s2
Directorio
Side 1
Pista 0
Sector 1…3
Directorio
Prof. José Díaz Chow
A R Q U I T E C T U R A
3.6.3
D E
M Á Q U I N A S
C O M P U T A D O R A S
I I
El sistema de archivos de DOS
El MS-DOS establece un sistema de archivos, que en general se denomina FAT.
La implementación de FAT requiere de dos estructuras de datos: El Directorio, donde se
almacena una entrada por cada archivo en el disco y la FAT que implementa una lista
enlazada con los clusters de datos que pertenecen al mismo cada archivo. Parte de la
información en el directorio es el cluster de inicio, que nos permite referirnos de manera
única a una entrada de la FAT, por cuanto esta tiene una entrada por cada cluster en el
disco.
Para darle flexibilidad al sistema de achivos, el directorio acepta entradas especiales que
son a su vez directorios, permitiendo así toda una jerarquía de directorios con
subdirectorios en una unidad o volumen de disco.
La siguiente tabla muestra la estructura del Directorio raíz de un disquete:
OFFSET
Tamaño
0
8
8
3
Nombre
ext
11
12
22
24
1
10
2
2
atributos
……..
hora de creación / actualización
Fecha de creación / actualizacion
26
28
2
4
cluster
tamaño
La FAT es una tabla que contiene información del siguiente cluster de datos del archivo.
Existen tres versiones de FAT: FAT12, FAT16 y FAT32. Cada una indica la cantidad de
bits que componen la entrada. Nótese particularmente la dificultad que encierra
manipular FAT12, que es la que se implementa en los disquetes. Para acceder a una
entrada de la FAT12 se requiere acceder solo 3 nibbles. Las implementaciones de esta
han optado por multiplicar por 1.5 el número de cluster a acceder, eliminar el nibble
sobrante y leer la parte correpondiente de la entrada. Hay que recordar además que la
memoria esta organizada en little endian.
Para acceder a los datos de un archivo, primero se localiza su entrada en el árbol de
directorios. Ahora se obtiene la información del cluster inicial y se puede obtener los
datos del primer bloque del disco. Acto seguido, de debe acceder a la entrada
correspondiente al cluster en la FAT. Si el contenido de la entrada es el indicador de
Prof. José Díaz Chow
Página 33
A R Q U I T E C T U R A
D E
M Á Q U I N A S
C O M P U T A D O R A S
I I ,
C U R S O
2 0 0 4 .
Ultimo cluster (FFF, FFFF o FFFFFFFF, respectivamente), hemos completado nuestra
tarea, sino, la entrada de la FAT leída tiene el número del siguiente cluster del archivo. Se
trae ese cluster con el siguiente bloque de datos y luego se vuelve a consultar la FAT y
así en lo sucesivo hasta dar con el último cluster del archivo.
En el ejemplo a continuación, el directorio muestra que el primer cluster del Archivos es
6, con esta información nos referimos a la FAT y vemos que la entrada 6 nos indica que
el siguiente cluster es el 7 y así al acceder el cluster 7, obtenemos el último cluster del
archivo, indicado por el marcador FFF en la FAT12.
Root
Directory
ArchivoX
Cluster= 6
Cluster
2
0
3
0
4
5
5
FFFH
6
7
7
FFFH
8
0
Nótese que las entradas desocupadas de la FAT tienen valor 0. Note también que todo el
procedimiento implementa en la FAT una lista enlazada, según se representa abajo:
ArchivoX
6 
7 
0FFH X
≡
El código a continuación permite acceder a la entrada de la FAT12 . Requiere que en AX
se haya escrito el número de cluster o entrada FAT a leer.
Requisto: AX  N° de cluster, FAT cargada en ES:00
GetFatEntry
G1:
GetFatEntry
Página 34
Proc
push si ; guardar el valor para restaurarlo
push cx
mov si, ax
; si  N° de cluster
shl si, 1
; si  N° de cluster * 2
add si, ax
; si  N° de cluster * 3
shr si, 1
; si  N° de cluster * 3/2 = N° de cluster * 1.5
mov ax, es: [bx + si] ; lee dos bytes
jnc G1
; Shr puso en carry el lsb. Si NC, entonces es par
mov cl, 4
; Si impar, desplazar 4 posiciones a la derecha
shr ax, cl
and ax, 0FFH ; Si par, eliminar nibble más significativo
pop cx
pop si
EndP
Prof. José Díaz Chow
A R Q U I T E C T U R A
D E
M Á Q U I N A S
C O M P U T A D O R A S
I I
0
1
Entrada de FAT o cluster 20 (bytes 30 y 31)
.
.
.
30
M1
L1
31
L2
H1
32
H2
M2
n
L2
H1
M1
L1
H2
M2
L2
H1
Entrada de FAT o cluster 21 (bytes 31 y 32)
Estructuración de la FAT12
Para acceder a los cluster en el disco, es importante saber la dirección física de los
sectores del mismo si deseamos acceder mediante las funciones de la interrupción 13H de
la BIOS o conocer el sector lógico para acceder mediante las interrupciones 25H y 26H
del DOS.
La INT 13H del Bios, accede sector por sector:
Funciones:
02H – leer
03H – escribir
04H – verificar
05H – formatear pista
01H – estado del disco
Int 25H: Lee un sector del disco
Int 26H: Escribe en un sector al disco
AL: drive (al que se desea acceder): 0=A
Prof. José Díaz Chow
Página 35
A R Q U I T E C T U R A
D E
M Á Q U I N A S
C O M P U T A D O R A S
I I ,
C U R S O
2 0 0 4 .
CX: cantidad de sectores
DX: sector inicial
DS: BX: memoria destino (buffer)
3.6.4
Acceso a archivos
Sistema de archivo del DOS permite el acceso a los archivos mediante dos técnicas
diferentes: El bloque de control de archivos (FCB) que permite tratar los archivos como
secuencias de registros, y el método de cadena ASCIIZ. En esta última se define el path
del archivo a abrir o crear.
El método de FCB no será tema de nuestro estudio porque implica una serie de
limitaciones en el manejo de los mismos. Estudiaremos el método ASCIIZ.
Para abrir o crear un archivo con esta técnica se provee el path del archivo a la función
del DOS 3CH (crear) o 3D (abrir). Esta retorna un andel o manejador del archivo en ax.
Con este handle se puede manipular el archivo con las adecuadas funciones del DOS:
3FH (leer) y 40H (escribir), todas de la INT 21H.
Es importante anotar que DOS define una serie de manejadores o handles de archivos
predefinidos que siempre están abiertos:
0: entrada estándar
1: salida estándar
2: error
3: dispositivo auxiliar
4: impresora LPT
3.6.4.1
Ejemplo1: Crear y escribir en archivo.
El ejemplo a continuación solicita nombres y crea con ellos un archivo de texto con el
nombre NameFile.txt en el directorio donde se ejecuta la aplicación.
.model small
.Stack 64
;------------------------------------------------------------.Data
NamePar
MaxLen
NameLen
NameRec
ErrCode
Handle
FilePath
Pregunta
Página 36
Label
db
db
db
db
dw
db
db
Byte
30
?
30
dup(' '), 0dh, 0ah
00
?
'NameFile.txt', 0
'Siguiente Nombre? : '
;
;
;
;
;
;
Inicia lista
longitud máxima
longitud real
Nombre ingresado
Indicador de error
Manejador del archivo
Prof. José Díaz Chow
A R Q U I T E C T U R A
D E
M Á Q U I N A S
C O M P U T A D O R A S
I I
Row
db
01
Omsg
db
'Error de apertura', 0dh, 0ah
Wmsg
db
'Error de escritura', 0dh, 0ah
;------------------------------------------------------------.Code
; Programa Principal
Inicio
Proc
Far
mov ax, @data
mov ds, ax
mov es, ax
mov ax, 0600h
Call ClrScr
Call SetCursor
Call Createfile
Cmp ErrCode, 00
jz Seguir
jmp Finalizar
Seguir:
Call GetName
cmp NameLen, 00
jne Seguir
Call CloseFile
Finalizar:
mov ax, 4c00h
int 21h
Inicio
Endp
;------------------------------------------------------------Createfile
CreateError:
Createfile
; Crear el archivo
Proc
Near
mov ah, 3ch
mov cx, 00
lea dx, FilePath
int 21h
jc CreateError
mov Handle, ax
ret
; Crear archivo
; Normal
lea dx, Omsg
Call PrintErrMsg
Ret
EndP
;------------------------------------------------------------; Solicitar nuevo nombre a guardar en el archivo
GetName
Proc
Near
mov ah, 40h
; Función de escritura de registro
mov bx, 01
; Handle de la salida estándar
mov cx, 20
; Longitud del prompt
lea dx, Pregunta
; Dirección del propmt
int 21h
; Despliega prompt
registro
Prof. José Díaz Chow
mov ah, 0ah
lea dx, NamePar
; Función de lectura de teclado
; Dirección de la variable a contener el
int 21h
; Lee desde el teclado
Página 37
A R Q U I T E C T U R A
D E
M Á Q U I N A S
GetName
I I ,
C U R S O
2 0 0 4 .
cmp NameLen, 00
jz GetOutGetName
; ¿Se escribió algo ?
; Si no, salir
mov
sub
mov
lea
add
neg
add
rep
; almacena en al el caracter blanco
; limpia ch
; cl <- Longitud del registro
; di <- Dirección del registro
; di <- posición del caracter siguiente al último
; Calculamos la cantidad de caracteres restantes
; del tamaño de 30 (deberìamos usar un EQU aquì)
; completa el resto de caracteres con blancos.
al, 20h
ch, ch
cl, NameLen
di, NameRec
di, cx
cx
cx, 30
stosb
call WriteRecord
call HandleScrScroll
GetOutGetName:
C O M P U T A D O R A S
; Escribe el registro en el archivo.
; Ajusta la posición en pantalla.
ret
EndP
;------------------------------------------------------------; Maneja Scroll
HandleScrScroll
Proc
Near
cmp Row, 18h
jae RowScr
inc Row
jmp PosCur
RowScr:
mov ax, 0601h
call ClrScr
PosCur:
call SetCursor
ret
HandleScrScroll
EndP
;------------------------------------------------------------;Escribe registro en archivo
WriteRecord
Proc
Near
mov ah, 40h
; Función de escritura de registro
mov bx, Handle
; Handle del archivo
mov cx, 32
; Longitud del registro
lea dx, NameRec
; Dirección del registro
int 21h
; Escribe registro
jnc GetOutWriteRec
lea dx, Wmsg
call PrintErrMsg
mov Namelen, 00
GetOutWriteRec:
ret
WriteRecord
EndP
; ¿Se escribió bien? Sí. Finalizar
; No: Escribir mensaje
;
;------------------------------------------------------------;Cierra el archivo
CloseFile
Proc
Near
mov NameRec, 1ah
; EOF
call WriteRecord
; Escribe el fin de archivo
mov ah, 3eh
; Función de cerrar archivo
mov bx, Handle
; Handle del archivo
int 21h
; Cierra
ret
CloseFile
EndP
;------------------------------------------------------------;Limpia la pantalla
ClrScr
Proc
near
Página 38
Prof. José Díaz Chow
A R Q U I T E C T U R A
ClrScr
D E
mov bh, 1eh
mov cx, 0000h
mov dx, 184fh
int 10h
ret
EndP
M Á Q U I N A S
;
;
;
;
C O M P U T A D O R A S
I I
Amarillo sobre azul
Desde la esquina superior izquierda
hasta la esquina inferior derecha.
Interrupción BIOS de video.
;------------------------------------------------------------;Posicionar el cursor
SetCursor
Proc
near
mov ah, 02h
; Función de posicionar cursor
mov bh, 00
; Normal
mov dh, Row
; Fila
mov dl, 00
; Columna
int 10h
; Interrupción BIOS de video.
ret
SetCursor
EndP
;------------------------------------------------------------;Imprime mensaje de error
PrintErrMsg
Proc
near
mov ah, 40h
; Función de escritura de registro
mov bx, 01
; Salida estandar
mov cx, 21
; Longitud del mensaje
int 21h
; Escribe registro
mov ErrCode, 01
; Define código de error
ret
PrintErrMsg
EndP
;------------------------------------------------------------;Fin del programa
End Inicio
3.6.4.2
Ejemplo2: Abrir y leer un archivo existente
Este otro ejemplo, muestra como abrir una archivo creado y desplegar su contenido.
.model small
.Stack 64
;------------------------------------------------------------.Data
ErrCode
db
00
; Indicador de fin
Handle
dw
?
; Manejador del archivo
IOArea
db
32 dup(' ')
FilePath
db
'NameFile.txt', 0
Row
db
00
Omsg
db
'Error de apertura', 0dh, 0ah
Rmsg
db
'Error de lectura ', 0dh, 0ah
;------------------------------------------------------------.Code
; Programa Principal
Inicio
Prof. José Díaz Chow
Proc
Far
mov ax, @data
mov ds, ax
mov es, ax
Página 39
A R Q U I T E C T U R A
D E
M Á Q U I N A S
C O M P U T A D O R A S
I I ,
C U R S O
2 0 0 4 .
mov ax, 0600h
Call ClrScr
Call SetCursor
Call OpenFile
Cmp ErrCode, 00
jnz Finalizar
Seguir:
Call LeeRegistro
cmp ErrCode, 00
jnz Finalizar
Call Despliega
jmp Seguir
Finalizar:
Inicio
mov ax, 4c00h
int 21h
Endp
;------------------------------------------------------------OpenFile
; Abrir el archivo
Proc
Near
mov ah, 3dh
mov al, 00
lea dx, FilePath
int 21h
jc Error
mov Handle, ax
ret
; Abrir archivo
; Normal
Error:
mov ErrCode, 01
lea dx, Omsg
Call PrintErrMsg
Ret
OpenFile
EndP
;------------------------------------------------------------; Lee próximo registro en el disco
LeeRegistro
Proc
Near
mov ah, 3fh
; Función de lectura
mov bx, Handle
; Handle del archivo
mov cx, 32
; Longitud del registro
lea dx, IOArea
; Dirección del buffer para registro
int 21h
; Lee
jc ErrorEnLectura
; ¿Error en lectura?
cmp ax, 00
; ¿Fin de archivo?
je ErrorTermina
cmp IOArea, 1ah
; ¿Caracter EOF?
je ErrorTermina
jmp Termina
ErrorEnLectura:
lea dx, Rmsg
call PrintErrMsg
ErrorTermina:
mov ErrCode, 01
Termina:
ret
LeeRegistro
EndP
;------------------------------------------------------------; Despliega registros
Página 40
Prof. José Díaz Chow
A R Q U I T E C T U R A
Despliega
Proc
mov
mov
mov
lea
int
cmp
jae
inc
jmp
RowScr:
PosCur:
Despliega
D E
M Á Q U I N A S
C O M P U T A D O R A S
I I
Near
ah, 40h
bx, 01
cx, 32
dx, IOArea
21h
Row, 18h
RowScr
Row
PosCur
;
;
;
;
;
Función de escritura
Salida estandar
Longitud del registro
Dirección del buffer
Escribe registro
mov ax, 0601h
call ClrScr
call SetCursor
ret
EndP
;------------------------------------------------------------;Limpia la pantalla
ClrScr
Proc
near
mov bh, 1eh
; Amarillo sobre azul
mov cx, 0000h
; Desde la esquina superior izquierda
mov dx, 184fh
; hasta la esquina inferior derecha.
int 10h
; Interrupción BIOS de video.
ret
ClrScr
EndP
;------------------------------------------------------------;Posicionar el cursor
SetCursor
Proc
near
mov ah, 02h
; Función de posicionar cursor
mov bh, 00
; Normal
mov dh, Row
; Fila
mov dl, 00
; Columna
int 10h
; Interrupción BIOS de video.
ret
SetCursor
EndP
;------------------------------------------------------------;Imprime mensaje de error
PrintErrMsg
Proc
near
mov ah, 40h
; Función de escritura de registro
mov bx, 01
; Salida estandar
mov cx, 21
; Longitud del mensaje
int 21h
; Escribe registro
mov ErrCode, 01
; Define código de error
ret
PrintErrMsg
EndP
;------------------------------------------------------------;Fin del programa
End Inicio
Prof. José Díaz Chow
Página 41
A R Q U I T E C T U R A
D E
M Á Q U I N A S
C O M P U T A D O R A S
I I ,
C U R S O
2 0 0 4 .
3.7 Programación en ensamblador con macros.
Las macros son herramientas que nos permten simplificar la cantidad de código
que se escribe. Se emplean para reusar código repetitivo en el programa. Las macros se
expanden en tiempo de compilación y reemplazan todo el texto contenido en la macro en
cada instancia donde se le invoca.
3.7.1
Definición de macro
Las macros se definen mediante la directiva macro, y se completa con la directiva Ende,
según se muestra en el ejemplo:
INITZ
Macro
Mov ax, @data
Mov ds, ax
Mov es, ax
EndM
El programa fuente podría parecer así
InitZ
Macro
Mov ax, @data
Mov ds, ax
Mov es, ax
ende
.model Small
.Stack 64
.Data
MyDato1
Start:
db
‘Test de Macro’
.Code
InitZ
….
End Start
Obviamente, esta macro no es muy útil por cuanto solo se inicializa una ves en el
programa el ds.
3.7.2
Macros con parámetros
Una mejora grande que permite dotar de versatilidad a las macros es la posibilidad de
emplear paso de parámetros.
Msg
Página 42
macro Mensaje
; Esta macro despliega un mensaje
Mov ah, 9
Lea dx, Mensaje
Int 21h
Prof. José Díaz Chow
A R Q U I T E C T U R A
D E
M Á Q U I N A S
C O M P U T A D O R A S
I I
EndM
Note el uso del parámetro Mensaje que en este caso debe ser una cadena definida con
DB. Note también el uso de comentarios. El ensamblador obvia los comentarios al
expandir la macro por defecto.
3.7.3
Uso anidado de macros
Una macro puede incluir el llamado a otra macro en su definición:
Dos21
Macro Funcion
Mov ah, Funcion
Int 21H
EndM
Disp
Macro Char
Mov dl, Char
Dos21 2
EndM
Note el llamado a Dos21 en la macro Disp.
3.7.4
Directiva LOCAL
Las macros se pueden invocar en diferentes partes de un mismo código fuente. Si
ellas definen etiquetas estas podrían colisionar al parecer repetidas. La directiva local
permite enclaustrar un identificador al entorno de la macro evitando repeticiones. Al
expandirlas el ensamblador genera el símbolo de reemplazo adecuado.
MiMacro
Etiqueta1:
Etiqueta2:
Macro P1, P2
Local Etiqueta1
Local Etiqueta2
…
…
EndM
3.7.5
Directivas Include y PURGE
La directiva include permite incluir macros definidas en un archivo aparte de
librería de macros en nuestro código fuente:
Include c:\Asm\Lib\M1.lib
Algunos ensambladores como masm, que hacen dos pasadas requieren los operadores de
compilación condicional IF1..ENDIF a fin de no incluir dos veces el archivo.
Prof. José Díaz Chow
Página 43
A R Q U I T E C T U R A
D E
M Á Q U I N A S
C O M P U T A D O R A S
I I ,
C U R S O
2 0 0 4 .
Es probable que nuestro código fuente esté redefiniendo alguna macro de la librería o
simplemente no la use. En ese caso, la directiva purge nos permite decirle al ensamblador
que la omita.
IF1
EndIf
Include c:\Asm\Lib\M1.lib
PURGE Dos21, Disp
Página 44
Prof. José Díaz Chow