Sunteți pe pagina 1din 47

INDICE

0. Introducción 2

1. Sistemas que componen la computadora XT 3

2. Características del procesador 8088/8086 5

3. Funcionamiento en general 15

4. Sistema descrito por bloques y por circuitos 23

5. Esquemático del sistema completo Sistema de Aplicación. 32

6. Muestra de una Mainboard AT con identificación de dispositivos 32


Etiquetado y accesorios.

7. Registros del 8088 32

8. Modos de direccionamiento 35

9. Set de instrucciones 37

10. Lenguaje máquina, macroensamblador 41

11. Debuger, y simuladores del 8088 44

12. Anexos 46

1
INTRODUCCIÓN

En junio de 1978 Intel lanzó al mercado el primer microprocesador de 16 bits: el 8086.


En junio de 1979 apareció el 8088 (internamente igual que el 8086 pero con bus de
datos de 8 bits) y en 1980 los coprocesadores 8087 (matemático) y 8089 (de entrada y
salida). El primer fabricante que desarrolló software y hardware para estos chips fue la
propia Intel. Reconociendo la necesidad de dar soporte a estos circuitos integrados, la
empresa invirtió gran cantidad de dinero en un gran y moderno edificio en Santa Clara,
California, dedicado al diseño, fabricación y venta de sus sistemas de desarrollo que,
como se explicó anteriormente, son computadoras autosuficientes con el hardware y
software necesario para desarrollar software de microprocesadores.

Los sistemas de desarrollo son factores clave para asegurar las ventas de una empresa
fabricantes de chips. La inmensa mayoría de ventas son a otras empresas, las cuales
usan estos chips en aparatos electrónicos, diseñados, fabricados y comercializados por
ellas mismas. A estas empresas se las llama "fabricantes de equipo original", o en
inglés, OEM (Original Equipment Manufacturer). El disminuir el tiempo de desarrollo
de hardware y software para las OEM es esencial, ya que el mercado de estos
productos es muy competitivo. Necesitan soporte pues los meses que les puede llevar
el desarrollo de las herramientas apropiadas les puede significar pérdidas por millones
de dólares. Además quieren ser los primeros fabricantes en el mercado, con lo cual
pueden asegurarse las ventas en dos áreas importantes: a corto plazo, ya que al
principio la demanda es mucho mayor que la oferta, y a largo plazo, ya que el primer
producto marca a menudo los estándares.

De esta manera la empresa Intel había desarrollado una serie completa de software
que se ejecutaba en una microcomputadora basada en el 8085 llamada "Intellec
Microcomputer Development System". Los programas incluían ensambladores
cruzados (éstos son programas que se ejecutan en un microprocesador y generan
código de máquina que se ejecuta en otro), compiladores de PL/M, Fortran y Pascal y
varios programas de ayuda. Además había un programa traductor llamado CON V86
que convertía código fuente 8080/8085 a código fuente 8086/8088. Si se observan de
cerca ambos conjuntos de instrucciones, queda claro que la transformación es sencilla
si los registros se traducen así: A -> AL, B -> CH, C -> CL, D -> DH, E -> DL, H -> BH y L ->
BL. Puede parecer complicado traducir LDAX B (por ejemplo) ya que el 8088 no puede
utilizar el registro CX para direccionamiento indirecto, sin embargo, se puede hacer
con la siguiente secuencia: MOV SI, CX; MOV AL,[SI]. Esto aprovecha el hecho que no
se utiliza el registro SI. Por supuesto el programa resultante es más largo (en cantidad
de bytes) y a veces más lento de correr que en su antecesor 8085. Este programa de
conversión sólo servía para no tener que volver a escribir los programas en una
primera etapa. Luego debería reescribirse el código fuente en assembler para poder
obtener las ventajas de velocidad ofrecidas por el 8088. Luego debía correr el
programa en la iSBC 86/12 Single Board Computer basado en el 8086. Debido al
engorro que resultaba tener dos plaquetas diferentes, la empresa Godbout Electronics

2
(también de California) desarrolló una placa donde estaban el 8085 y el 8088, donde
se utilizaba un ensamblador cruzado provisto por la compañía Microsoft. Bajo control
de software, podían conmutarse los microprocesadores. El sistema operativo utilizado
era el CP/M (de Digital Research).

El desarrollo más notable para la familia 8086/8088 fue la elección de la CPU 8088 por
parte de IBM (International Business Machines) cuando en 1981 entró en el campo de
las computadoras personales. Esta computadora se desarrolló bajo un proyecto con el
nombre "Acorn" (Proyecto "Bellota") pero se vendió bajo un nombre menos
imaginativo, pero más correcto: "Computadora Personal IBM", con un precio inicial
entre 1260 dólares y 3830 dólares según la configuración (con 48KB de memoria RAM
y una unidad de discos flexibles con capacidad de 160KB costaba 2235 dólares). Esta
computadora entró en competencia directa con las ofrecidas por Apple (basado en el
6502) y por Radio Shack (basado en el Z-80).

1.-SISTEMAS DE LA COMPUTADORA XT:

El corazón del PC-XT es el microprocesador 8088, que actúa como CPU (unidad central de
proceso). El procesador Intel 8088, elegido por IBM para su primer modelo de PC era una
versión "simplificada" de un procesador más potente, el 8086, que tenía registros y bus de
datos de 16 bits. Sin embargo, se eligió el 8088, con registros de 16 bits, pero bus de
datos de 8 (el de direcciones es de 20 bits), coincidente con el bus de datos la placa-base,
que era también de 8 bits, por razones de simplificación y economía. No solo el ancho del
bus, otros muchos detalles de diseño han hecho especular largamente acerca de que
nadie en IBM parecía tener mucha fe en el futuro del recién nacido.

Los fits horizontales del system board “sistema mínimo “ están en la base de la unidad del
sistema y son aproximadamente 8-1/2 a 12 pulgadas. Es una singular multicapa por canal
en planos de diseño, con tierra o ground provista.

La fuente DC y su señal entran a través de un par de conectores de 16 pines. Otros


conectores en el board son para el teclado y el speaker. Hay ocho grupos (sockets) o
tarjetas de 62 pines montadas en la placa (board).

El canal de I/O es direccionado a través de esos 8 slots, J8 es ligeramente diferente de los


otros.

El Dip Switch de 8 canales montado puede configurarse para leer un programa de control.
Este provee la información del software al manipular las operaciones en el modo deseado
con los switches.

El sistema mínimo consiste de 5 áreas funcionales:

3
• El subsistema procesador y los elementos de soporte,
• La ROM,
• La memoria de (R/W)
• Adaptadores de I/O
• El canal de I/O

Diagrama de bloques

s0
s1 8288 Memória
s2 Controlador RAM
de ROM
barramento

8088
A0
P |
Teclado
A19 Buffer de 8255
Alto falante
Endereço PPI

D0 Som
|
D7 Buffer de 8253
IRQ0
Dados PIT Refresh

C R
l e
o s Intr
c e
k t
8259 8237

Controlador Controlador
de de
8284 Interrupção DMA
CLOCK

C E D
o n a
n d d
t e o
r r s
o e Barramento
l ç
de
e o
Expansão

4
2.-Características del procesador 8088/8086

El corazón del sistema es el MP8088, este es una versión de 8 bits (bus externo) de Intel
de 16 bits, el software es compatible con el 8086 que tiene operaciones de 16 bits
incluyendo multiplicación y división y 20 bits direccionables (1Mb de almacenaje).

El procesador opera a 4.77 Mhz, esta frecuencia es derivada del cristal de 14.31818 MHz
la cual es dividida por tres por el reloj del procesador; y por cuatro se obtiene 3.58 Mhz (la
señal requerida para los televisores de color).

Los 4.77 Mhz del reloj, los ciclos del bus del 8088 son cuatro relojes de 210 ns ó 840 ns, los
ciclos de I/O toman 5*210 ns ó 1.05 us.

El procesador es respaldado por el set de funciones provistas por cuatro canales de 20 bits
de acceso directo a memoria (DMA), tres grupos de canales del Timer de 16 bits y ocho
niveles de interrupciones.

5
Tres de los cuatro canales de DMA están disponibles en el bus de I/O y hay una alta
velocidad para transferencia de datos entre las memorias y los canales de I/O sin
intervención de la memoria del procesador.

El cuarto canal es programado para refrescar el sistema dinámico de memoria, esto esta
hecho para el programa del Timer-contador e informe periódicamente de la transferencia
DMA.

La acción anterior crea un ciclo de lectura de la memoria disponible para el refresco del
almacenaje (both) en el sistema y en los slots de expansión.

Todos los datos del DMA excepto el canal de refresco toman 5 ciclos de reloj ó 1.05 s; si
una línea de la lectura del procesador no esta deshabilitada. Los ciclos de refresco de DMA
toman 4 ciclos ó 840 ns. El tercer Timer programable es usado como se muestra.

El canal cero es usado en un propósito general del Timer provee un tiempo base
constante para implementar el time-of-delay. El canal uno es usado para el tiempo de
pregunta y refresco del ciclo de DMA; el canal 2 es usado para el respaldo de la generación
de tonos de audio del speaker. El otro canal tiene un tiempo mínimo de resolución de 1.05
us.

De las ocho interrupciones, 6 son direccionadas a los slots de expansión para el uso de las
tarjetas, dos son usadas en el sistema mínimo. Las más altas prioridades están en el nivel
cero del Timer-contador y proveen interrupciones periódicas. El nivel uno esta asignado al
teclado, circuitos y receptores de interrupción para otros códigos; la interrupción no
enmascarable del 8088 es usada para el reporte de errores de paridad de la memoria.

El sistema mínimo esta respaldado por la ROM y memoria R/W, tiene un espacio de 64
Kbits por 8 de ROM o de EPROM. Dos sockets (módulos) de los provistos pueden aceptar
artificios de 32K ó 8K. Un socket tiene 32K por 8 de ROM, el otro tiene 8K por 8 bits. La
ROM contiene el power-on-self-test, I/O drivers de patrones para 128 caracteres en el
modo grafico y un cargador bootstrap de diskette. La ROM es un encapsulado (modulo) de
28 pines y tiene un tiempo de acceso y un ciclo de 250 ns.

El system board también tuvo 128K por 9 a 256K por 9 de memoria de lectura/escritura.
Un sistema mínimo tendra 128K de memoria con módulos (sockets ) para un adicional de
128K.

Una gran memoria de un máximo del sistema mínimo de 256K es obtenida por adición de
tarjetas de memoria en los slots de expansión. La memoria consiste de 64K dinámicos por
un chip por un tiempo de acceso de 200 ns y un tiempo de ciclo de 345 ns. Toda la
memoria de lectura/escritura es de paridad chequeada.

6
El system board contiene un adaptador para circuitos para juntar una interface serial
desde el teclado. Esos circuitos generan una interrupción al procesador cuando se
completa la búsqueda del código o es recepcionado. Esta interfase puede preguntar la
ejecución del diagnostico (test) en el teclado. La interfase del teclado es un conector DIN
de 5 pines en la placa que se extiende a través del panel de la unidad.

El Procesador 8088

CARACTERISTICAS

• Tecnología HMOS. Canal N


• Empaquetado DIP 40
• Una sola fuente de voltaje. Vcc = 5 V (275 mA)
• Velocidad de 5 MHz
• 20 bits de direcciones (1 MByte)
• Lenguaje ensamblador compatible con 8080/8085
• 14 registros de 16 bits
• 24 modos de direccionamiento
• Operaciones con Bit, Byte, Word o con bloques
o * Aritmética binaria o decimal, de 8 y 16 bits, con o sin signo. Incluye
operaciones de multiplicación y división
• Interfaz de sistema compatible con Multibus

Diferencia 8086/8088:

• el tamaño de la cola (6 vs.4 bytes)


• Bus externo de datos ( 16 vs. 8 bits )

A) ARQUITECTURA EN PIPELINE

Los procesadores previos al 8086, estaban limitados en su desempeño por la necesidad de


realizar los dos pasos principales de ejecución del procesador: Fetch/Execute, en forma
secuencial. Es decir, no se puede ejecutar una instrucción hasta que se traiga de memoria
(Fetch); y no podían traerse instrucciones de memoria mientras ejecutaba una instrucción,
pues el procesador estaba ocupado.

7
Resumiendo, un alto porcentaje del tiempo, el procesador estaba ocupado haciendo
Fetch, cuando su función debiera ser ejecutar las instrucciones. La capacidad de ejecutar
instrucciones sólo se ocupaba en un bajo porcentaje.

Para solucionar esto, Intel desarrolló la arquitectura en pipeline del Fetch/Execute, en la


cual simplemente se divide la tarea en dos secciones: una encargada del Fetch (BIU), y
otra del Execute (EU). De esta manera, existen circuitos separados para cada función, los
cuales trabajan en paralelo. Si bien el proceso aún es secuencial, solamente al principio se
requiere desperdiciar tiempo en el Fetch. A partir de ahí, Fetch va adelante del Execute, y
trae instrucciones al procesador mientras este ejecuta las anteriores.

B) BUS DE DATOS DE 16 BITS

Los procesadores dominantes antes de la introducción del IBM PC, basado en el 8086,
eran todos de 8 bits; con lo que nos refereimos al bus de datos. Esto quiere decir que se
podía accesar un byte de memoria en un solo ciclo de reloj, pues existían 8 cables entre la
memoria y el procesador, por donde viajaban a la vez 8 bits de información. Que el
procesador ahora sea de 16 bits, quiere decir que pueden viajar a la vez 16 bits (2 bytes)
entre el procesador y la memoria; por tanto, el procesador puede mover bloques de
memoria en la mitad del tiempo, y con la mitad de instrucciones. Esto hace más eficiente
el acceso a memoria por parte del procesador.

Al tamaño del bus de datos también suele llamársele tamaño de palabra.

C) BUS DE DIRECCIONES DE 20 BITS

También antes del 8086 había una limitante en la memoria de la que el procesador podía
disponer. Los procesadores anteriores contaban con un bus de direcciones de 16 bits, con
lo que podían indexar 65536 localidades distintas en memoria; siendo éstas bytes. Por
tanto, su memoria máxima era de 64 Kb. Intel reconoció que pronto, esta memoria sería
insuficiente, por lo que decidió ampliarla. Sin embargo, no pudieron imaginar usos para
una memoria mayor a 1 Mb.; parecía infinita para los estándares de entonces. Por lo que
aumentaron las líneas del bus de direcciones a 20, con lo cual se pueden indexar
memorias con 1'048,576 elementos (1 Mb.)

Bus Operation

En el 8088 el bus de direcciones/datos se divide en tres partes:


1. Los 8 bits menos significativos de direcciones/datos (AD0 – AD7). Multiplexados
entre direcciones y datos.
2. Los 8 bits del medio de direcciones (A8 – A15). No multiplexados
3. Los 4 bits más altos de las direcciones (A16 – A19). Multiplexados entre direcciones
y señales de control.
Se puede trabajar con los buses multiplexados o demultiplexarlos.

8
Ciclo de Bus, General
Cada ciclo de bus consiste de al menos 4 ciclos de clock, los cuales se denominan T1, T2,
T3 y T4.
Las direcciones son emitidas durante T1 y la transferencia de datos ocurre entre T3 y T4.
T2 se usa para cambiar la dirección del bus durante operaciones de lectura.
• T1: Se envían las direcciones y también se proporcionan las señales de control ALE,
DT/R y IO/M
• T2: Se proporcionan las señales DEN, RD (lectura) o WR (escritura). En el caso de
escritura aparecen los datos que se van a escribir en el bus de datos. Al final de T2
se muestrea la señal de READY.
• T3: Se produce para dar tiempo a la memoria para acceder a los datos. En el caso
de que sea un ciclo de lectura el bus de datos se muestrea al final de T3.
• T4: Se desactivan todas las señales de control para prepararse para el siguiente
ciclo de bus. En este momento, el flanco positivo de WR transfiere datos a la
memoria, los cuales se activan y escriben cuando la señal WR retorna a 1.

Ciclo de Lectura
Comienza en T1 con la aparición de la señal de ALE, cuyo flanco negativo se usa para
latchear las direcciones, que son válidas en el bus de direcciones/datos (AD0-AD7) en este
momento.
La líneas de direcciones A8-A15 no necesitan ser latcheadas ya que permanecen válidas en
todo el ciclo de bus.
Desde T1 a T4 la señal IO/M indica si es una operación a memoria o a un I/O.
En T2 las direcciones se sacan del bus de direcciones/datos y el bus se pone en alta
impedancia (AD0-AD7).
La señal de control de lectura (RD) aparece en T2 y causa que el dispositivo direccionado
habilite su bus de datos.
Un tiempo después, debe estar disponible el dato válido sobre el bus.
Cuando el 8088 retorna la señal RD a un nivel alto, el dispositivo direccionado pondrá en
alta impedancia su salida de datos.
Si usamos un buffer en el bus, las señales DT/R y DEN están disponibles para ello.
Para medir el tiempo de acceso a la memoria, vemos en el diagrama que hay una línea
desde el final de T3 hasta el bus de datos ya que es allí donde el 8088 muestrea los datos.
El tiempo de acceso a la memoria comienza cuando aparece la dirección en el bus de
direcciones de la memoria (esto es un tiempo TCLAV después del inicio de T1) y dura hasta
el final de T3 (en realidad hasta un tiempo de setup TDVCL antes del final de T3 que
necesita el 8088), por lo tanto el tiempo de acceso de la memoria debe ser como mínimo:
3 ciclos de clock – TCLAV – TDVCL.

9
Ciclo de escritura
También empieza con aparición de la señal de ALE y la emisión de las direcciones. La señal
IO/M también se suministra para indicar si es a memoria o a I/O.
En T2, inmediatamente después de la emisión de las direcciones, el 8088 emite el dato a
escribir en la locación direccionada.
Este dato permanece válido al menos hasta la mitad de T4.
Durante T2, T3 y Tw, el 8088 envía la señal de control de escritura (WR) que se pone en
estado activo en el comienzo de T2. Los datos se escriben en la memoria en el flanco
positivo de WR.
La señal de RD en la lectura está un poco más retrasada que la de WR en la escritura para
dar tiempo a que el bus quede en alta impedancia.

10
Ciclo de Reconocimiento de Interrupción (interrupt Acknowledge)
La diferencia básica entre el ciclo de lectura y el de reconocimiento de interrupción es que
en el de reconocimiento se envía la señal INTA en lugar de la de RD y el bus de direcciones
se mantiene en alta impedancia.

11
En realidad hay dos ciclos consecutivos de INTA, en el segundo, se lee un byte de
información del bus de datos. Este byte los da el sistema que pidió la interrupción y debe
ser el número de vector de interrupción.

D) BIU: BASIC INTERFACE UNIT

El BIU es la parte del 8086 que se encarga de hacer el Fetch; es decir, su función es estar
continuamente accesando la memoria, trayendo de ella las instrucciones para ser
ejecutadas por el procesador.

Contiene los siguientes elementos:

1.Los registros de segmentos

2.La cola de prefetch

3.El generador de direcciones físicas

4.El Bus C

1) REGISTROS DE SEGMENTOS

Registros de propósito general


+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| AH | AL | AX
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

12
| BH | BL | BX
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| CH | CL | CX
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| DH | DL | DX
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Registros índices
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| SI | Source Index
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| DI | Destination Index
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| BP | Base Pointer
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| SP | Stack Pointer
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Flags
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|- - - - O D I T S Z - A - P - C| Flags
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Registros de segmento
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| CS | Code Segmento
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| DS | Data Segment
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ES | Extra Segment
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| SS | Stack Segment
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Instruction Pointer
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| IP | Instruction Pointer
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Estos registros son localidades de 16 bits dedicados a las funciones de acceso a memoria.
Se decidió, como se describirá más adelante al analizar el mecanismo de segmentación,
dividir el Megabyte de memoria al que puede accesar un 8086, en 65536 partes
(segmentos), iniciadas cada 1 Mb / 65536 = 16 bytes. Así, podemos en general decir que
los registros de segmentos nos van a indicar qué sección de memoria seleccionamos.

13
Existen 4 registros de segmentos:

DS: Data Segment (Segmento de Datos)

Este registro selecciona una sección de 64 Kb. que se dedica generalmente a colocar en
ella nuestras variables, por lo cual toma su nombre: sección de memoria dedicada a datos.

CS: Code Segment (Segmento de Código)

Este registro selecciona el área de 64 Kb. que generalmente dedicamos al código. En este
caso, el CPU (específicamente, el BIU), siempre toma las instrucciones de esta región de
memoria; por lo que cuando requerimos más de 64 Kb. de código (instrucciones), este
registro tendrá que moverse, tomando distintos valores según recorremos distintas
regiones de memoria.

SS: Stack Segment (Segmento de Pila)

Este registro selecciona la región de 64 Kb. que va a contener la pila del sistema. Como su
nombre lo indica, tendremos una estructura de datos, con política LIFO (Last In, First Out =
El último elemento en entrar, es el primero en salir), con instrucciones básicas PUSH y POP
para su manejo. Esta estructura es usada por los programas de aplicación, pero también
por el procesador para el control de instrucciones que lo requieren, tales como las
llamadas a subrutinas yla atención de interrupciones.

ES: Extra Segment (Segmento Extra)

Este registro nos permite seleccionar una sección de 64 Kb., que no está destinada a
ningún uso específico; por lo que el programador puede aplicarla como comodín,
generalmente como un segundo segmento de datos; o bien, para el acceso a regiones de
memoria del sistema, tales como la memoria de video o las variables del BIOS.

2. Cola de prefetch

Ya que el BIU trabaja en paralelo con el EU, requieren de un mecanismo para


comunicarse. Esto se logra con una cola, estructura de datos que permite que el EU
obtenga instrucciones para ejecutar en el mismo orden en que el BIU las colocó en la
misma. Así, el EU puede solicitar instrucciones en cuanto esté listo para ejecutar la
siguiente, sin importar en qué paso está el BIU en la obtención de instrucciones; y
viceversa, el BIU puede continuar su búsqueda de instrucciones, depositando la que acaba
de obtener en la cola, sin importar si el EU en este momento está ocupado ejecutando.

3. Generador de direcciones físicas

14
Como las direcciones son de 20 bits, y los registros que nos permiten accesarlas son de 16,
se requiere de 2 registros para que en combinación formen la dirección.

Esta combinación está basada en la arquitectura segmentada que veremos más adelante.
La función del generador de direcciones físicas consiste en realizar esa combinación, para
lo cual contiene la circuitería necesaria para calcular la fórmula:

Dirección Fisica = Segmento * 0010h + Desplazamiento

4. Bus C

Este bus interno del procesador permite que la información fluya entre la interfaz con la
memoria y los distintos elementos del BIU. Se requiere un bus independiente, para que la
información que usa el EU no se interfiera con la que está procesando el BIU.

E) EU: Execution Unit

El EU es la parte del 8086 que Contiene los siguientes elementos:

1.Unidad de control

2.Registros de propósito general

3.Registros de índice

4.ALU

5.Registro de Banderas

6.Bus A

3.- FUNCIONAMIENTO GENERAL DEL PC-XT

Dada la complejidad del esquema completo de la placa principal del microcomputador


XT, se procede a su descripción dividiéndolo en las siguientes secciones
fundamentales:

A) PROCESADOR CENTRAL 8088 Y CHIPSET

Este bloque actúa como controlador general del sistema y esta basado en la CPU 8088,
trabajando a 8 Mhz. Se configura alrededor de 9 circuitos integrados, que son:
-CPU: microprocesador 8088
-Coprocesador matemático 8087 (opcional)

15
-Generador de señales de reloj 8284
-Controlador de bus 8288
-Basculas de direcciones 74LS373 (2) y 74LS244
-Buffer bidireccional para los datos 74LS245
-Controlador de interrupciones 8259

El 8088 comparte con el coprocesador matemático 8087 un bus local por el que pasan
las instrucciones que ha de ejecutar este ultimo, asi como los resultados que este
produce y se dirigen a la memoria.
El procesador de datos numérico aumenta el juego de instrucciones del 8086/8088
mejorando su capacidad de tratamiento de números. Se utiliza como procesador
paralelo junto al 8088 añadiendo 8 registros de coma flotante de 80 bits así como
instrucciones adicionales. Utiliza su propia cola de instrucciones para controlar el flujo
de instrucciones del 8088, ejecutando sólo aquellas instrucciones que le
corresponden, e ignorando las destinadas a la CPU 8088. Las instrucciones del 8087
incluyen un juego completo de funciones aritméticas así como un potente núcleo de
funciones exponenciales, logarítmicas y trigonométricas
Mediante las basculas de direcciones, el buffer de datos y el controlador de bus, se
obtienen los buses normalizados de datos, direcciones y control, que conforman el
“bus del sistema”. El controlador de interrupciones 8259 recibe las peticiones de
interrupción procedentes de los periféricos y las gestiona, teniendo en cuenta las
prioridades, transmitiéndoselas a la CPU (linea INT).
El 8259 puede controlar hasta 8 interrupciones vectorizadas. Además, a un 8259 se le
pueden conectar en cascada un máximo de 8 chips 8259 adicionales, lo que permite
gestionar sistemas con hasta 64 interrupciones
Cuando la CPU reconoce la interrupción, envía la señal -INTA. Nada más recibida la
señal -INTA de la CPU, el 8259 activa el bit correspondiente a la interrupción de mayor
prioridad (la que va a ser procesada) La instrucción CALL provoca que la CPU envíe dos
pulsos -INTA. El 8259 utiliza estos dos pulsos -INTA para depositar en el bus de datos,
sucesivamente, la parte baja y alta de la dirección de memoria del ordenador de la
rutina de servicio de la interrupción (16 bits).

16
Bloques que configuran a la sección del procesador central, junto a los circuitos
integrados que se usan.

B) MEMORIA RAM
La memoria RAM de un ordenador es utilizada para almacenar programas o datos con
los que el procesador trabaja. Todos los ordenadores necesitan memoria para
almacenar
programas e información, así como para cargar y ejecutar los programas. Por lo
general,
cuanto más compleja es la tarea que se desea realizar, más memoria necesita el
ordenador.

Direccionamiento de la memoria
Todos los programas y datos se cargan en localidades de memoria específicas
determinadas por sus direcciones. Esa información es almacenada como una
secuencia de bytes de manera que cada uno de ellos tiene un número asociado
correspondiente al lugar que ocupan. A ese número se lo denomina dirección de
memoria.
Dado que el 8086/8088 tiene una longitud de palabra de direcciones de 20-bits es
posible direccionar hasta 1.048.576 (= 210) localidades distintas de memoria, es decir,

17
podemos almacenar hasta 1Mbyte de información. Sin embargo, la CPU sólo procesa
palabras de 16 bits en sus registros de direcciones, como ya se ha visto en los
apartados anteriores, y las direcciones de memoria son de 20 bits, por lo que una
dirección no cabe en un registro.
Por lo tanto, en principio, teóricamente sólo se podría acceder hasta el byte número
65.535 (216, el número mayor posible de 16 bits) contando a partir del inicio, que es el
byte 0.
Para solucionar este inconveniente, se ideó el dividir la dirección de un byte en dos
partes, denominadas segmento (o Base) y desplazamiento (u offset), ambos de 16 bits.
Adoptada dicha medida, la dirección real de un byte en la memoria es:
Dirección real = Valor base x 16 + valor desplazamiento3
De esta forma, se pueden direccionar el millón de bytes y se tiene acceso a toda la
memoria del PC (a cada uno de los 1024 Kbytes).
La notación más empleada para indicar la dirección de un par segmento –
desplazamiento consiste en separar esos dos valores con dos puntos, utilizando
notación
hexadecimal (por ejemplo: 123h:12h4, representa la dirección con segmento 123h y
desplazamiento 12h).
Esta forma de direccionar la memoria presentó un pequeño problema que ha
entorpecido la elaboración de grandes programas, y no es otro que éste: como ya se
ha visto se accede a memoria dando un valor de segmento y otro de desplazamiento;
pues bien, si se mantiene el valor del segmento fijo (lo que ocurre en los programas) y
se varía únicamente el valor del desplazamiento sólo es posible acceder a 65535 bytes
(64 Kbytes), que es el valor máximo alcanzable con los 16 bits del registro de
desplazamiento. Con esto, la información
máxima que se puede almacenar en la memoria, modificando únicamente el
desplazamiento, es de 64 Kb. A esta cantidad de almacenamiento se le denomina
segmento de memoria.
De este modo, un segmento es un área continua de memoria que puede tener 64K-
bytes,
que debe comenzar en una localidad de memoria cuya dirección sea límite de 16 bytes
(cantidad denominada párrafo) y que puede solaparse con otros segmentos. Así, por
ejemplo, la dirección AB00:0012, (es decir, 43776:8 con valores decimales), tiene la
misma dirección real que AB01:0002 (es decir, 43777:2 con valores decimales), pues
ambas equivalen a la dirección real 700.434 (valor que se obtiene al aplicar la fórmula
anterior).

Segmentos de memoria de un programa


Por lo general, los programas ejecutables disponen de cuatro segmentos (4 zonas de
64 Kb):
- El segmento de código (tiene como base el contenido del registro CS). En este
segmento se encuentran las instrucciones que forman el programa. Para acceder a
los datos contenidos en él, se usa el registro IP como desplazamiento.

18
Para obtener 20 bits de direcciones a partir de dos registros de 16, lo que se hace es
desplazar uno de ellos (el segmento) 4 bits a la izquierda, añadiendo para ello 4 ceros
por la derecha (lo que equivale a multiplicar por 16). Se obtiene así un valor de 20 bits
(16 iniciales + 4 ceros añadidos) que no es más que la dirección de inicio del segmento.
Para acceder a los datos del segmento, habrá que sumar una cantidad a esa dirección
(dicha cantidad es el desplazamiento). Es así como se obtiene la fórmula en cuestión.

- El segmento de datos (que tiene como base el registro DS). Contiene los datos que
utiliza el programa (variables, etc.) Para acceder a los datos contenidos en él, se suele
utilizar los registros SI y DI como desplazamiento.
- El segmento de pila5 (con SS como base). En él se desarrolla la pila del programa,
utilizada para trasvases temporales de datos, llamadas a funciones, etc. Debe estar
presente en todos los programas EXE de forma obligada. Se utiliza el registro SP para
acceder a los datos de este segmento.
- El segmento extra (con ES como base). Su uso es opcional, y en él se encuentra un
segmento definido por el usuario y que, regularmente, contiene datos adicionales.
Al igual que ocurre con el segmento de datos, para acceder a los datos contenidos en
él, se suelen utilizar los registros SI y DI.
El hecho de que haya más de un registro de segmento hace posible crear programas
que controlen varios bloques de memoria simultáneos de hasta 64 Kb cada uno.

C) ROM BIOS

La mayoría de personas piensa que el DOS es el que controla el IBM PC, y aunque
básicamente esto es cierto, no tiene en cuenta la asistencia de la ROM BIOS de IBM
(Basic Input/Output System), sistema básico de entrada / salida que realiza una gran
parte del trabajo necesario para el PC DOS. Muchas de las rutinas de utilidad que
aparecen es este libro dependen de llamadas al PC DOS o a la ROM BIOS. En ambos
casos, estas llamadas se consiguen mediante interrupciones software. En esta breve
sección se da un repaso al concepto de interrupción Software y a como se materializa
este concepto mediante el procesador 8088.

Una interrupción es una llamada de atención a la CPU, indicándole que debe prestar
cuidado a algo ahora. Los mecanismos de interrupción siempre han formado parte de
los sistemas microprocesadores. Hasta el desarrollo del 80886 y el 8088, todas las
interrupciones se realizaban mediante Hardware.

El funcionamiento de una interrupción por hardware es el siguiente: una señal


eléctrica sobre una patilla de chip de la CPU provoca que la lógica interna de éste
circuito guarde el contador de programas, los registros de indicadores y el registro de
segmento de código (CS). La CPU queda entonces libre para prestar servicio a la
petición recibida desde el exterior ejecutando una determinada sección de código
independiente de la tarea que estaba llevando a cabo. Una vez satisfecha la petición

19
de servicio, la CPU recupera los registros grabados y continua con la tarea que había
dejado suspendida como si nada hubiera pasado.

Con la arquitectura de la familia 8086, Intel presentó el concepto de interrupción por


software. Este tipo de interrupciones funciona exactamente igual que las
interrupciones por hardware. Excepto en que la condición que dispara la petición es
una instrucción máquina (software) en vez de una señal eléctrica sobre un corrector
de la CPU (Hardware).

Existía un cierto numero de razones para adoptar esta filosofía. Ya que la única
diferencia es de las interrupciones por hardware y por software es la forma mediante
la que se dispara la petición, es posible comprar el servicio prestado por una
interrupción hardware antes de disponer del hardware que provoca dicha
interrupción, utilizando software para simular el dispositivo hardware externo del que
se carece.

Una utilización mucho más importante de las interrupciones software consiste en el


diseño de un mecanismo de puntos de entrada estándar para un sistema software.
Cuando se produce cualquier tipo de interrupción, la CPU guarda primero los registros
esenciales y después realiza un “ gran salto” a la posición de la rutina de servicio de la
interrupción, que se encuentra en alguna parte de la memoria.

La forma en que la CPU localiza esta rutina de servicio de la interrupción es crítica. Las
256 interrupciones de 8088 están numeradas, del 0 al 255. Cuando se produce una
interrupción, la CPU debe recibir de alguna forma el número de la interrupción
requerida. Para interrupciones hardware, éste número procede de un circuito externo
a la CPU: el controlador de prioridad de interrupción software, el número de
interrupción que provoca la interrupción. Por ejemplo: la instrucción del 8088
disparará la interrupción software número $21.

Los primeros 1024 bytes del mapa de memoria del 8088 están reservados para los
vectores de interrupción. Vectores que en este caso son punteros, precisamente son
los que ocupan estos 1024 bytes de memoria. Cada una de las 256 interrupciones
diferentes tiene su propia región de 4 bytes dentro de ese bloque de memoria
(256x4=1024). Esta región de cuatro bytes contiene un puntero de 32 bits a la primera
instrucción de la rutina de servicio de la interrupción.

Los primeros 4 bytes del mapa de memoria del 8088 contienen el vector de la
interrupción 0. Los siguientes 4 bytes contienen el vector interrupción 1 y así
sucesivamente hasta llegar a 255. Evidentemente si la CPU conoce el número de la
interrupción, puede multiplicarlo por cuatro para saber inmediatamente la dirección
de servicio de cualquier interrupción que se produzca. Los dos primeros bytes del
vector de interrupción forman el valor del contador de programa para el comienzo de
la rutina de servicio y los dos segundos bytes son el valor del segmento de código en el

20
que se encuentra dicha rutina de servicio. La CPU solamente necesita cargar el valor
del segmento de código en el registro CS y el valor del contador de programa en el
registro correspondiente para poder empezar a ejecutar la rutina de servicio.
El hecho importante aquí es que el código que pretenda utilizar una interrupción
software como rutina de servicio no necesita conocer en que parte de la memoria se
encuentra dicha rutina. Solamente necesita el número de interrupción. De hecho, la
posición real de la rutina de servicio puede cambiar a lo largo del tiempo, cuando sea
modificada o ampliada. Mientras el código de iniciación del ordenador grabe los
vectores de interrupción correctos en las 1024 posiciones más bajas de la memoria, las
rutinas de servicio soportadas por interrupciones software pueden ser utilizadas por
los programas de aplicación desde cualquier punto rápida y fácilmente.

Esta es la filosofía de la ROM BIOS del IBM PC. El BIOS es una colección de rutinas de
servicio soportadas por interrupciones software grabadas en una ROM (Read Only
Memory) en la parte superior del espacio de direccionamiento de memoria del 8088.
Los números de interrupción se asignan de acuerdo a la función general realizada por
la rutina de servicio de la interrupción. Por ejemplo, la interrupción 166 ($10) controla
los servicios de video del PC. La interrupción 22 ($16) controla el acceso al teclado.

No todas las interrupciones software están reservadas para su utilización por parte de
la ROM BIOS. EL PC BIOS. EL PC DOS emplea unas pocas y la mayoría de ellas no las
utiliza el sistema. El controlador de ratón de Microsoft hace uso de una interrupción
software. De hecho, la mayoría de los programas de gestión de periféricos las utilizan.
El IBM PC, tal y como se le conoce habría sido imposible sin ellas.

Arranque del Sistema

Secuencia de Arranque del Procesador


Después de encender o resetear el PC, éste inicializa los bits necesarios de la cache, los
buffers y los registros a un valor conocido. El procesador arranca en Modo-Real. Se
inicializan los registros EIP a 0000FFF0h y CS a F000h, lo que hace apuntar a una
dirección base FFFF0000h.

De esta forma se comienza a ejecutar en la dirección FFFFFFF0h, a 16 bytes del límite


de la memoria física, en una EPROM. La EPROM está normalmente localizada en una
dirección física mucho menor, pero se 'mapea' a una dirección mucho mayor por el
chipset del sistema
(por ejemplo el Intel 430HX).

Normalmente, en un PC, esta EPROM inicializa una IDT (Interrupt Descriptor Table) del
Modo-Real, y salta a la rutina de la BIOS. Entonces comienza lo que denominamos
secuencia de arranque:

21
La BIOS realiza el POST (Power On Self Test), consistente en la inicialización y
comprobación del hardware. Luego inicializa sus datos:

o Tabla de interrupciones BIOS ( 10h-1Ah)


o Zona de Datos BIOS (40h:0)

Después comienza a buscar un sector de arranque. La secuencia de búsqueda más


usual (en el SETUP de la BIOS se puede configurar otra secuencia) es mirar primero en
el 'floppy', en su primer sector. Si lo encuentra, lo carga en memoria y comienza a
ejecutarlo. Si no lo encuentra en el 'floppy' lo intenta en el disco duro primario (su
primer sector se conoce como MBR : Master Boot Record). Si lo encuentra lo carga y
ejecuta. Si no lo encuentra sale con un error.
(NOTA: La secuencia de arranque desde un disco duro suele ser algo distinta. El MBR se
carga en la dirección 0000h:7C00h, que al ejecutarse, normalmente (no hay un
estándar), mueve su código a la dirección 0000h:0600h y sigue ejecutándose desde ahí.
Procede entonces a escanear la tabla de particiones buscando una que sea de
arranque, para cargar su primer sector en la dirección 0000h:7C00h.)

Por lo tanto el sector de arranque debe colocarse en el Sector 1, cilindro 0 y cabeza 0


de la unidad desde la que se desea arrancar.
La BIOS carga el sector de arranque en la dirección de memoria 7C00h y comienza a
ejecutarlo desde esa dirección. Para ello coloca los siguientes valores: CS = 0, EIP
=7C00h. Además en DL coloca un valor indicativo de la unidad desde la que se ha
cargado el sector de arranque: 1h = floppy 1,
80h = disco duro primario.
El sector de arranque cargado por la BIOS toma el control. Puede hacer muchas cosas.
Para nuestros propósitos bastaría con inicializar lo que sea necesario , hacer
comprobaciones y luego pasar el control al SOTR.
Este sector lo llamaremos cargador primario. Normalmente este cargador primario se
encargaría de mirar la tabla de particiones, buscando una que fuese ejecutable (con un
SO).
La elección se puede hacer mediante un menú en el caso de que hubiese varias. Una
vez elegida la partición la carga en memoria, normalmente se trata de un cargador
secundario, que será el que cargue en memoria el kernel elegido. Si el kernel es mayor
de 512k o 640k, deberá pasar del modo real (donde se pueden usar las llamadas a la
BIOS) al Modo-Protegido desde el cual se puede acceder a toda la memoria.

El Sector de Arranque
El sector de arranque o cargador primario, será lo único que necesitemos para poder
pasar el control a nuestro SOTR.

Las características del sector de arranque son:

22
o Tiene un tamaño de 512 bytes
o En la posición 1FEh (510 en decimal) debe tener la palabra AA55h

También debe tenerse en cuenta que la BIOS lo carga en la posición de memoria


7C00h, de forma
que a la hora de programarlo hay que tener cuidado con las referencias a memoria. En
la práctica
esto puede hacerse de varias formas:

o Mediante la directiva del ensamblador ORG 7C00h (no válido para GAS).
o Inicializar los registros de segmento de forma que apunten al comienzo del sector
de arranque

4.- Sistema descrito por bloques:

CONTROL DE PERIFÉRICOS
A) CONTADOR TEMPORIZADOR PTI 8253

El 8253 es un chip temporizador que puede ser empleado como reloj de tiempo
real, contador de sucesos, generador de ritmo programable, generador de
onda cuadrada, etc.
Tiene 5 modos de operación:
- MODO 0: Interrupt On Terminal Count (Interrupción al final de la cuenta). Es
empleado típicamente para contar sucesos.
- MODO 1: Hardware Retriggerable One-Shot (Monoestable programable). Se
redispara con flanco de subida de GATE, permaneciendo en bajo hasta que el
contador alcance el cero.
- MODO 2: Rate Generator (Generador de ritmo). En este modo, el contador
funciona como un divisor por N. Es empleado típicamente para las
interrupciones de los relojes de tiempo real.
- MODO 3: Square Wave Mode (Generador de onda cuadrada). Este modo es
empleado normalmente para la generación de una señal de onda cuadrada.
- MODO 4: Software Triggered Mode (Pulso Strobe iniciado por software). OUT
está en alto al principio; cuando la cuenta inicial expira, OUT baja durante un
pulso de reloj y luego vuelve a subir.
- MODO 5: Hardware Triggered Strobe (Pulso Strobe iniciado por hardware).
OUT estará en alto al principio: con el flanco de subida de la señal GATE, el
contador comienza a decrementar la cuenta. Cuando llega a cero, OUT baja
durante un pulso CLK y luego vuelve a subir.

Los tres contadores que dispone este circuito integrado, se destinan a las siguientes
funciones:

23
- CONTADOR 0: Genera una petición de interrupción cada cierto tiempo, que se
aplica a la línea IRQ0 del controlador de interrupciones 8259(ligado a la INT 8,
que a su vez invoca a INT 1Ch). Esta interrupción envia a la CPU a ejecutar una
rutina de actualización del calendario y el reloj del sistema.
- CONTADOR 1: Se emplea de refresco de la DRAM. Cada cierto tiempo solicita
atención del controlador DMA 8237, que se encarga de efectuar el refresco de
las DRAM, cuyo valor normal para el divisor es 18; aumentándolo se puede
acelerar el funcionamiento del ordenador, en los PC/XT se puede aumentar
entre 19 y 1000 sin demasiados riesgos, acelerándose en ocasiones hasta casi
un 10% la velocidad de proceso del equipo.
- CONTADOR 2: Genera frecuencias audibles para el altavoz. . Este contador ha
sido conectado con el doble propósito de temporizar y de generar sonido. Para
emplearlo en las temporizaciones, es preciso habilitar la puerta GATE activando
el bit 0 del puerto 61h; también hay que asegurarse de que la salida del
contador no está conectada al altavoz (a menos que se desee música mientras
se cronometra) poniendo a 0 el bit 1 del mismo puerto (61h)

B) ADAPTADOR DE PERIFÉRICOS PARALELO, PPI 8255

El PPI 8255 es un dispositivo de E/S general, programable, capaz de controlar


24 líneas con diferentes configuraciones (entrada/salida) y en hasta 3 modos
de operación.
El 8255 de los PC/XT está conectado a la dirección base E/S 60h; por ello, los
puertos A, B y C se acceden, respectivamente, a través de los puertos de E/S
60h, 61h y 62h; la palabra de control se envía por el puerto 63h: la BIOS del PC

24
y XT programa el 8255 con una palabra de control 10011001b, que configura
todos los puertos en el modo 0, con el A y C de entrada y el B de salida.
En la XT el PPI esta dedicado especialmente a la adaptación y almacenaje de los
datos que llegan del teclado, pero también se usa para realizar pequeñas
tareas, como leer el estado de los microruptores (PC0-PC3 y PB3) y de controlar
el modulo de audio (PB0,PB1,PC4, PC5) que maneja al altavoz y la velocidad en
los XT-Turbo.
El teclado envía la información de cada tecla pulsada en serie y el conversor
serie/paralelo paralelo/serie 74ls322 la traduce a formato paralelo y la
introduce a la puerta A del PPI.
Las líneas PB2,PB6,PB7 del PPI tienen distintas funciones de control de teclado.
Las líneas PB4,PC6 y PC7 se usan para la detección y el control de los posbles
errores de paridad

El 8255 tiene 3 modos de operación:

- MODO 0: funciones de entrada/salida para cada bit de los 2 puertos de 8 bits y


los 2 puertos de 4 bits; los datos son leídos y escritos sin más, sin ningún tipo
de control adicional. Los puertos pueden ser configurados de entrada (sin
latch) o salida (los datos permanecen memorizados en un latch).
- MODO 1: strobed input/output (entrada/salida a través de un protocolo de
señales). Existen dos grupos (A y B) formados por los puertos A y B más el
puerto C, que es repartido a la mitad entre ambos grupos para gestionar las
señales de control.
- MODO 2: bus bidireccional de 8 bits, por el que los datos pueden ir en un
sentido o en otro, siendo el flujo regulado de nuevo por señales de control a
través del puerto C. Tanto las entradas como salidas son almacenadas en latch.

C) DECODIFICADOR DEL MAPA DE E/S

Se usa le 74LS138, que decodifica las señales procedentes del bus interno del
sistema (XA5-XA9,/CPUBUSON,/XIOW) y obtiene las señales de control para la
selección de los periféricos situados en el mapa de E/S (DMA.PIC,PPI,PTI)

D) ADAPTADOR DE TECLADO

El componente fundamental que soporta la adaptación del teclado a la placa es


el 74LS322, que es un adaptador serie/ paralelo y paralelo/serie, basado en un
registro universal interno de 8 bits. Dispone de 8 líneas de entrada y salida
paralelo, multiplexadas y de carácter tri-state y una línea para entrada y salida
serie.

25
Cada vez que se mandan datos serie desde el teclado se genera una
interrupción en la CPU, mediante la activación de la línea IRQ1. La IRQ1 es
gestionada por el Controlador programable de interrupciones 8259
El adaptador puede trabajar en 4 modos y en el caso que se estudia funciona
con entrada serie y desplazamiento a la derecha.

MICRORUPTORES PARA LA CONFIGURACION DEL SISTEMA

Según la posición de estos microruptores o switch se configura al


microcomputador, de acuerdo con las tarjetas colocadas en los zócalos de
expansión y la memoria físicamente implementada. El control de los microruptores
lo realiza el buffer unidireccional 74ls244, que se encarga de transmitir la
información procedente de los microrruptores a las 4 lineas de menor peso del
puerto C del PPI.

SECCION DMA

El acceso directo a memoria es una técnica de diseño del hardware que


permite a los periféricos conectados a un sistema realizar transferencias sobre
la memoria sin la intervención del procesador.

26
Como la memoria del ordenador sólo puede ser accedida a un tiempo por una
fuente, en el momento en que el DMA realiza las transferencias el
microprocesador se desconecta de los buses, cediéndole el control. El
funcionamiento del controlador de DMA se basa en unos registros que indican
la dirección de memoria a ser accedida y cuántas posiciones de memoria
quedan aún por transferir.
Esta secciona esta implementada básicamente por el 8237 que es un
controlador de DMA de 4 canales programables en 3 modos diferentes, con
posibilidad de ser conectado en cascada con otros de su misma especie. se
encarga de realizar 2 importantes misiones, mediante los 4 canales de DMA
que dispone:

- Refresco de las memorias DRAM, mediante canal 0.


- Transferencias directas entre la memoria principal y periféricos de memoria de
masa, tales como discos , cintas, etc. Para esto dedica los 3 canales restantes

Cuando funciona el DMA, previamente solicita al a CPU la concesión del control de


los buses. Una vez que han pasado a tri-state las líneas de la CPU, el CDMA
(controlador de DMA) pasa a gobernarlas y las carga con direcciones, comandos y
señales de control.
El 8237 puede atender 4 dispositivos diferentes la mismo tiempo, c/u a través
de un canal.
Las operaciones fundamentales del DMA son:
1) Lectura: Transferencia del mapa de memoria al de E/S
2) Escritura: Transferencia del mapa de E/S al de memoria principal
El 74LS670 denominado “page register file”, almacena el estado de las 4 líneas
de mas peso del bus de direcciones.

SECCION DE EXPANSIONES

El canal de entrada/salida es una extensión del bus del Microprocesador 8088. Estos
son como demultiplexadores, repotenciadores y alzadores para la adición de
interrupciones y las funciones del acceso directo a memoria (DMA).
El canal de entrada/salida contiene un data-bus bidireccional de 8 bits, 20 líneas de
direcciones, 6 niveles de interrupción, líneas de control para la memoria de I/O lectura
o escritura, líneas de tiempo del reloj, 3 canales de DMA channel-check line, y fuente
y tierra para los adaptadores. Cuatro niveles de voltaje son provistos para las tarjetas
de I/O: +5Vdc, -5Vdc, +12Vdc, y -12Vdc. Esas funciones son provistas en el
conector de 62 pines con 100-mil card-tab-spacing.
Esta formada por 8 conectores o zócalos hembra, para soportar tarjetas de expansión
que se precisen. Se distinguen 2 tipos de conectores: los denominados J1-J7 y el J8 que
es diferente a los demás.

27
Los conectores J1-J7 se usan para añadir hardware adicional al sistema básico del
microcomputador. Cada uno dispones de 62 contactos o pines, que suministran todas
las líneas de direcciones, datos y control precisas en el acoplamiento de gran variedad
de opciones.
Los circuitos existentes en las tarjetas de expansión no pueden gobernar directamente
el bus, funcionando siempre como slave. Con el fin de facilitar las transferencias de
datos a la memoria principal, a elevada velocidad, se emplean los canales 1,2 y 3 del
CDMA

Descripción del Canal de I/O

Se muestra la descripción del canal del computador personal IBM XT. Todas las
instrucciones son compatibles con TTL.

Señal I/O Descripción.


OSC O Oscilador: Reloj de alta velocidad con un periodo de 70ns
(14.31818 MHz) Tiene un ciclo de duración del 50% .
28
CLK O Sistema de reloj: Esta dividido por tres (del oscilador) y
tiene un periodo de 210 ns (4.77 MHz) El reloj tiene un ciclo
de duración del 33%.
RESET DRV O Esta instrucción es usada para resetear o inicializar el
sistema o por power-up (apagado) durante una baja de salida
de voltaje.
A0-A19 O Los bits de direcciones son de 0 a 19. Esas instrucciones
son usadas en la dirección de memoria y los artificios de I/O con
el sistema; las 20 líneas de dirección permiten accesar a la parte
superior de 1Mb de memoria. A0 es el bit menos significativo
(LSB) y el A19 es el mas significativo (MSB). Esas instrucciones
son generadas por el octavo controlador DMA del procesador.
Tienen nivel activo alto.
D0-D7 I/O Bits de datos del 0 al 7: Estas instrucciones proveen bits
0 al 7 al bus de datos del procesador, los artificios de la memoria
de I/O. D0 es el bit menos significativo (LSB) y el D7 es el bit mas
significativo (MSB). Tienen nivel activo alto.
ALE O Address Latch Enable: Estas instrucciones son provistas
por el controlador del bus 8288 y usan el latch valido del system
board direccionado del procesador. Esta disponible al canal de
I/O como un indicador de dirección de proceso valido (cuando es
usado con AEN). Las direcciones del procesador son latcheadas
con el edge de fallo de ALE.
/MEMR O Memory Read Command: Este comando instruye al
artificio de I/O para almacenar un dato del bus de datos. Esto
puede ser conducido por el procesador o el controlador de DMA,
es de nivel activo bajo.
/DACK0-3 O DMA Acknowledge 0 a 3: Estas instrucciones son usadas
para el reconocimiento de peticiones DMA (DRQ1-DRQ3) y el
refresco del sistema de memoria dinámica (DACK0) Ellos son de
nivel bajo.
AEN O Address Enable: Esta instrucción es usada para liberar al
procesador y otros artificios del canal de I/O para permitir la
transferencia de DMA al lugar a tomar. Cuando esta instrucción
esta activa (alto) el controlador de DMA tiene el control de la
dirección del bus, bus de datos, comando de lectura (I/O y
memoria) y el comando de escritura (I/O y memoria).
T/C O Terminal Count: Esta instrucción provee un pulso cuando
el terminal de cuenta para el canal de DMA es alcanzado. Esta
señal es de nivel activo alto.
/CARD SLCTD I Card Select: Esta instrucción es activada por la tarjeta de expansión
J8, estas señales indican al sistema que la tarjeta ha sido
seleccionada y que los drivers apropiados en el sistema serán
direccionados a la octava (J8), lectura de, o escritura para, slot

29
Los siguientes voltajes están disponibles en el canal de I/ O del sistema:

+5Vdc + 5% localizado en dos pines del conector.


-5Vdc + 10% localizado en un pin del conector.
+12Vdc + 5% localizado en un pin del conector.
-12Vdc + 10% localizado en un pin del conector.
GND (tierra) localizado en 3 pines del conector.

SECCION DE CONTROL EXTERNO

Se encarga de recoger las informaciones de los “buses del sistema” y transformarlas


en las que requiere el “bus externo ” que utilizan los elementos que se acoplan al
microcomputador.
Para formar el bus de datos se utiliza el transceptor 74LS245, que recibe al bus de
datos del sistema y proporciona el bus de datos externo.
Las líneas del bus de direcciones del sistema son conformadas en bus de direcciones
externo mediante 3 amplificadores o driver 74LS244 . En los ciclos DMA las líneas de
bus de direcciones externo XA0-XA7 son proporcionadas directamente desde el DMA,
necesitándose otro driver 74LS244 para producir líneas desde el CDMA hasta el bus de
direcciones del sistema.

SECCIÓN DE FUENTE DE ALIMENTACIÓN

La fuente DC del sistema es a 130 watt, regulador switching de nivel 4 de voltaje. Esto
esta integrado dentro del sistema y las unidades de fuentes para el sistema, estas
opciones están en el teclado. La fuente provee 5V a 15A con el 5% mas o menos, +12V
a 4.2A al 5%-5Va 300mA al 10%, y -12V a 250mA al 10%. Todos los niveles de voltaje
estan regulados con sobre-voltaje y proteccion contra sobre-corriente. La entrada es
de 120V a.c. con fusible, si existen condiciones de sobrecarga de voltaje dc. La fuente
automáticamente cierra la conexión hasta que las condiciones sean adecuadas, es
diseñada para operar continuamente a 130 watts.

La fuente de poder esta localizada en el área derecha de la unidad del sistema. Estas
fuentes operan los voltajes del system board y el Display Monocromo IBM y proveen
dos conexiones separadas para alimentar a la disquetera de 5-1/4 pulgadas y la
disquetera normal.
La potencia nominal requerida y los voltajes de salida están listados en las tablas
mostradas:

30
Voltaje @ 50/60 Hz
Nominal Vac Mínimo Vac Máximo Vac
110 90 137

Requerimientos de entrada

Frecuencia : 50/60 Hz +/- 3Hz


Corriente : 4.1ª max @ 90 Vac

Voltaje Corriente(Amps Regulación


Vdc .) (Tolerancia
)
Nominal Mínimo Máximo +% -%
+5.0 2.3 15.0 5 4
-5.0 0.0 0.3 10 8
+12.0 0.4 4.2 5 4
-12.0 0.0 0.25 10 9

Vdc Salida

Voltaje Vac Corriente(Amps.) Voltaje limite Vac


Nominal Mínimo Máximo Mínimo Máximo
120 0.0 1.0 88 137

Los conectores de la fuente del sistema son 12 pines conector (hembra) que se
acoplan alos conectores de la fuente de poder .Ahora mostramos las configuraciones
de los pines :

31
5.- Esquemático del sistema completo Sistema de Aplicación.

Anexo

6.- Muestra de una Mainboard XT con identificación de dispositivos.


Etiquetado y accesorios

Anexo

7.- Registros del 8088

Los registros del i8086 e i8088 se basaron en el diseño del Intel 8080 y el Intel 8085, y de
hecho son compatibles a nivel de lenguaje ensamblador con el i8080. El conjunto de
registros también es similar al del i8080, pero ampliados a 16 bits. Tanto el i8086 como el
i8088 tienen cuatro registros de propósito general de 16 bits, que también pueden ser
accedidos como ocho registros de 8 bits, y tienen cuatro registros índice de 16 bits
(incluyendo el puntero de pila). Los registros de datos se usan a veces de forma implícita
por las instrucciones, haciendo más difícil la organización de los registros para emplearlos
con valores temporales.

Los registros del procesador, se usan para contener los datos con que se está trabajando
ya que el acceso a los registros es mucho mas rápido que los accesos a memoria. Se
pueden realizar operaciones aritméticas y lógicas, comparaciones, entre otras. Se pueden
hacer estas operaciones con todos los registros excepto los de segmento, el IP, y los flags.

Registros de Propósito General

Los registros de propósito general son el AX, BX, CX, y DX, de 16 bits. Cada uno de ellos se
divide en dos registros de 8 bits, llamados AH y AL, BH y BL, CH y CL, y, DH y DL, H
significando Hight (alto) y L significando Low (bajo), indicando la parte alta o la parte baja
del registro correspondiente de 16 bits (ver esquema). Un programa podía usar tanto los
registros de 16 bits como los registros de 8 bits. Aparte del uso general de los registros
para hacer cálculos aritméticos y lógicos, existen instrucciones que usan estos registros
con un uso particular especializado, como se indica a continuación:

• Registro AX: El registro AX es el registro acumulador, es utilizado para operaciones


que implican entrada/salida, y multiplicación y división (estas dos últimas en
conjunto con el registro DX)
• Registro BX: El registro BX es el registro base, y es el único registro de propósito
general que puede ser un índice para direccionamiento indexado

32
• Registro CX: El registro CX es conocido como el registro contador. Puede contener
un valor para controlar el número de veces que un ciclo se repite o un valor para
corrimiento de bits
• Registro DX: El registro DX es el registro de datos. En algunas operaciones se indica
mediante este registro el número de puerto de entrada/salida, y en las
operaciones de multiplicación y división de 16 bits se utiliza junto con el
acumulador AX

Registros Índice

Los registros SI y DI están disponibles para direccionamiento indexado y para operaciones


de cadenas de caracteres.

• Registro SI: El registro índice fuente de 16 bits es requerido por algunas


operaciones con cadenas de caracteres. El SI está asociado con el segmento DS.
• Registro DI: El registro índice destino también es requerido por algunas
operaciones con cadenas de caracteres. El DI está asociado con el segmento ES.

Registros Apuntadores

Los registros SP (apuntador de pila) y BP (apuntador base) están asociados con el registro
SS y permiten al sistema acceder a datos en el segmento de la pila.

• Registro SP: El apuntador de pila de 16 bits está asociado con el segmento SS y


proporciona un valor de desplazamiento que se refiere a la palabra actual que está
siendo procesada en la pila. El sistema maneja de manera automática este registro,
aunque el programa puede hacer ciertas manipulaciones con él.
• Registro BP: El apuntador base de 16 bits facilita la referencia de parámetros
dentro de la pila.

Registros de Banderas

Es un registro de 16 bits, de los cuales nueve sirven para indicar el estado actual de la
máquina y el resultado del procesamiento. Muchas instrucciones aritméticas y de
comparación cambian el estado de las banderas y apoyándose en ellas se pueden tomar
decisiones para determinar la acción subsecuente.

La tabla contiene 16 posiciones (de 0 a 15), que son los 16 bits del registro de banderas,
numeradas de derecha a izquierda. La posición 0 la encontraremos a la derecha y la
posición 15 a la izquierda.

- - - - OF DF IF TF SF ZF - AF - PF - CF

Los bits de las banderas son las siguientes:

33
• OF (overflow, desbordamiento): Indica desbordamiento del bit de mayor orden
después de una operación aritmética de números con signo (1=existe overflow;
0=no existe overflow). Para operaciones sin signo, no se toma en cuenta esta
bandera.
• DF (dirección): Controla la selección de incremento o decremento de los registros
SI y DI en las operaciones con cadenas de caracteres (1=decremento automático;
0=incremento). La bandera DF se controla con las instrucciones STD y CLD.
• IF (interrupción): Controla la ejecución de las interrupciones (1=habilita las
interrupciones; 0=deshabilita las interrupciones). El estado de la bandera IF se
controla con las instrucciones STI y CLI.
• TF (trampa): Permite la operación del procesador en modo de depuración (paso a
paso)
• SF (signo): Contiene el signo resultante de una operación aritmética (0=positivo;
1=negativo).
• ZF (cero): Indica el resultado de una operación aritmética o de comparación
(0=resultado diferente de cero; 1=resultado igual a cero).
• AF (acarreo auxiliar): Contiene el acarreo del bit 3. Esta bandera se prueba con las
instrucciones DAA y DAS para ajustar el valor de AL después de una suma o resta
BCD.
• PF (paridad): Indica si el número de bits 1, del byte menos significativos de una
operación, es par (0=número de bits 1 es impar; 1=número de bits 1 es par).
• CF (acarreo): Contiene el acarreo del bit de mayor orden después de una operación
aritmética; también almacena el contenido del último bit en una operación de
desplazamiento o de rotación.

Registros de Segmento

Definen áreas de 64 Kb dentro del espacio de direcciones de 1 Mb del 8086. Estas áreas
pueden solaparse total o parcialmente. No es posible acceder a una posición de memoria
no definida por algún segmento: si es preciso, habrá de moverse alguno.

• Registro CS: El DOS almacena la dirección inicial del segmento de código de un


programa en el registro CS. Esta dirección de segmento, más un valor de
desplazamiento en el registro apuntador de instrucción (IP), indica la dirección de
una instrucción que es buscada para su ejecución. Para propósitos de
programación normal, no se necesita referenciar el registro CS.
• Registro DS: La dirección inicial de un segmento de datos de programa es
almacenada en el registro DS. Esta dirección, más un valor de desplazamiento en
una instrucción, genera una referencia a la localidad de un byte específico en el
segmento de datos.
• Registro SS: El registro SS permite la colocación en memoria de una pila, para
almacenamiento temporal de direcciones y datos. El DOS almacena la dirección de
inicio del segmento de pila de un programa en el registro SS. Esta dirección de
segmento, más un valor de desplazamiento en el registro del apuntador de la pila

34
(SP), indica la palabra actual en la pila que está siendo direccionada. Para
propósitos de programación normal, no se necesita referenciar el registro SS.
• Registro ES: Algunas operaciones con cadenas de caracteres utilizan el registro
extra de segmento para manejar el direccionamiento de memoria. El registro ES
está asociado con el registro DI (Índice). Un programa que requiere el uso del
registro ES puede inicializarlo con una dirección de segmento apropiada.

Registro Apuntador de Instrucciones

El registro IP de 16 bits contiene el desplazamiento de dirección de la siguiente instrucción


que se ejecuta. El IP está asociado con el registro CS en el sentido de que el IP indica la
instrucción actual dentro del segmento de código que se está ejecutando actualmente en
la memoria.

8.- Modos de direccionamiento

Modos de Direccionamiento

Las operaciones deben de obtener sus operados, ya sea de los registros o de la memoria.

Para acceder a estos operando se precisa especificar un modo de obtenerlos.


Los procesadores permiten especificar la posición de un operando de múltiples maneras.

Modo de Direccionamiento: Dado uno o varios campos de la instrucción, calcular la


dirección efectiva (de) de un operando.
La Dirección Efectiva no tiene por qué ser una dirección en memoria.
Hay infinidad de formas de calcular la dirección de un operando cada procesador
implementa un subconjunto de formas posibles.
Tanto los operando involucrados en el cálculo como las diferentes formas de calcular esta
dirección están todos Codificados en la instrucción.
Cuanto mías compleja sea la tarea de cálculo de la dirección efectiva, o mas operandos
incluya, más compleja será la decodificación y ejecución de la instrucción.
Existen dos espacios posibles de direcciones de operandos:

1. Dirección de Registro: Para aquellos operandos que están almacenados en


registro.

2. Dirección de Memoria: Para aquellos operandos que están almacenados en


memoria.

Nos referiremos a los diferentes campos de la instrucción como ci1, ci2, etc.

35
La expresión (ci1) significa el contenido del campo ci1 de la instrucción, o lo que es lo
mismo, el numero codificado en dicho campo.
La expresión (Ri), donde Ri es el nombre de un registro, significa el contenido del registro.
La expresión dato! R significa que se carga en el registro R el dato.

Modo Registro
Los registros pueden almacenar operandos.
La dirección de registro es diferente a la dirección de memoria
de = (ci)
Modo Registro Indirecto
La dirección efectiva está contenida en un registro codificado en la instrucción.
Util para acceder a un array de elementos.
de = ((ci))
Modo Autoincremento
El registro involucrado en el cálculo de la dirección efectiva se incrementa después de ser
utilizado.
El tamaño del incremento (1, 2, 4, etc.) está relacionado con el tamaño del operando (8,
16, 32 bits, etc.)
de = ((ci)); (Ri) + {1, 2, 4} ! Ri, donde Ri es el registro codificado en el campo ci.
Modo Autodecremento
El registro involucrado en el cálculo de la dirección efectiva se decremento antes de ser
utilizado.
El tamaño del decremento (1, 2, 4, etc.) está relacionado con el tamaño del operando (8,
16, 32 bits, etc)
de = ((ci)) − {1, 2, 4}; (Ri) − {1, 2, 4} ! Ri, donde Ri es el registro codificado en el campo ci.

Modo Absoluto
La dirección activa se encuentra en el campo de la propia instrucción.
Útil para acceder a constantes de un programa.
de = (ci)
Modo Base + Desplazamiento
La dirección se obtiene sumando el contenido de un registro y un valor codificado en la
instrucción.
Util para acceder a un campo de un record de datos.
de = (ci1) + ((ci2))
Modo Base + Indice
La dirección se obtiene sumando el contenido de dos registros.
Util para acceder a los elementos de un array secuencialmente, pues se conserva la
dirección de inicio de los datos y el índice.
de = ((ci1)) + ((ci2))
Modo Índice Escalado + Desplazamiento
La dirección se obtiene sumando el registro índice escalado al valor codificado en la
instrucción.

36
Útil para acceder a arrays que están en posiciones fijas y que contienen elementos de
tamaños 1, 2, 4 u 8 bytes.
de = (ci1) + ((ci2)) _ (ci3); tal que (ci3) 2 {1, 2, 4, 8}
Modo Base + Índice Escalado + Desplazamiento
Combinación de los modos base + índice e índice escalado + desplazamiento.
La dirección se obtiene sumando el desplazamiento, el registro base y el registro ´índice
multiplicado por el factor de escala pertinente.
de = (ci1) + ((ci2)) + ((ci3)) _ (ci4); tal que (ci4) 2 {1, 2, 4, 8}

9.- Set de instrucciones


Instrucciones de transferencia de datos
En esta categoría se incluyen las instrucciones que permiten la transferencia de datos
entre registros y memoria tales como MOV, PUSH, POP y XCHG.
La instrucción MOV recibe dos operandos y transfiere el dato indicado por el primer
operando al lugar indicado por el segundo. Dada la restricción que impone el procesador
de que en una instrucción con dos operandos no pueden estar ambos en memoria, si se
quiere transferir datos de un lugar de memoria a otro, se deben utilizar dos instrucciones
y utilizar un registro de propósito general.

Las instrucciones PUSH y POP también transfieren datos, aunque en este caso, uno de los
operandos es implícito y se refiere a la cima de la pila.

La instrucción XCHG (del inglés exchange) consta de dos operandos e intercambia sus
valores por lo que modifica los operandos (a no ser que tengan idéntico valor).
MOV $4, %al Almacena el valor 4 en el registro de 8 bits %al.
MOV contador1, %esi Almacena los cuatro bytes que se encuentran en memoria a partir
de la posición que representa contador1 en el registro %esi.
MOV $4, contador1 Instrucción ambigua, pues no se especifica el tamaño de datos en
ninguno de los dos operandos.
MOVL contador, $4 Instrucción incorrecta. El segundo operando es el destino al que
mover el primer operando, por lo tanto, no puede ser de tipo constante.
MOV %al, %ecx Instrucción incorrecta. El tamaño de los dos operandos es inconsistente. El
primero es un registro de 8 bits, y el segundo es de 32.
PUSH $4 Instrucción correcta. Almacena el valor 4, codificado con 32 bits en la cima de la
pila. No precisa sufijo de tamaño.

Instrucciones aritméticas
En este grupo se incluyen aquellas instrucciones que realizan operaciones aritméticas
sencillas con números enteros y naturales tales como la suma, resta, incremento,
decremento, multiplicación y división.

Instrucciones de suma y resta

37
Las instrucciones ADD y SUB realizan la suma y resta respectivamente de sus dos
operandos. En el caso de la resta, la operación realizada es la sustracción del primer
operando del segundo. Como tales operaciones precisan de un lugar en el que almacenar
el resultado, el segundo operando desempeña las funciones de fuente y destino por lo
que se sustituye el valor del segundo operando por el valor resultante.

El procesador ofrece también las instrucciones INC y DEC que requieren un único
operando y que incrementan y decrementan respectivamente el operando dado. Aunque
las instrucciones ADD $1, operando e INC operando realizan la misma operación y se
podría considerar idénticas, no lo son, pues INC no modifica el bit de acarreo.

Instrucciones de multiplicación
La instrucción de multiplicación tiene dos variantes, IMUL y MUL para números enteros y
naturales respectivamente y su formato supone un caso especial, pues permite la
especificación de entre uno y tres operandos.

La versión de IMUL y MUL con un único operando ofrece, a su vez la posibilidad de


multiplicar números de 8, 16 y 32 bits. Las instrucciones asumen que el segundo
multiplicando está almacenado en el registro %al (para números de 8 bits), %ax (para
números de 16 bits) y %eax (para números de 32 bits). El tamaño del número a multiplicar
se deduce del operando explícito de la instrucción.

La versión de IMUL y MUL con tres operandos es la más restrictiva de todas. Los dos
primeros operandos son los multiplicandos y el primero de ellos debe ser una constante.
El tercer operando es el lugar en el que se almacena el resultado y sólo puede ser un
registro de propósito general. Al igual que la versión con dos operandos, los únicos
tamaños que se permiten son de 16 y 32 bits, y el resultado se almacena en el mismo
tamaño que los operandos, por lo que de nuevo se corre el riesgo de pérdida de bits del
resultado.

Instrucciones de división entera


Las instrucciones de división de números naturales y enteros devuelven dos resultados, el
cociente y el resto, y se almacenan ambos valores. De manera análoga a las instrucciones
de multiplicación, existen dos versiones IDIV y DIV para división de enteros y naturales
respectivamente y el tamaño del dividendo es el doble del divisor. De esta forma, se
permite dividir un número de 16 bits entre uno de 8, uno de 32 entre uno de 16 y uno de
64 entre uno de 32.

Su formato admite de forma explícita un único operando que es el divisor, y que puede ser
un número de 8, 16 o 32 bits. El dividendo es implícito y está almacenado en %ax si el
divisor es de 8 bits, en el registro de 32 bits resultante de concatenar %dx:%ax si el divisor
es de 16 bits, y en el registro de 64 bits resultante de concatenar %edx:%eax si el divisor
es de 32 bits.

38
Instrucciones lógicas
En este grupo se incluyen las instrucciones de conjunción, disyunción, disyunción exclusiva
y negación.

La aplicación práctica de estas instrucciones no es a primera vista del todo aparente, sin
embargo, suelen estar presentes en la mayoría de programas.
Las cuatro instrucciones lógicas consideradas son AND, OR, NOT y XOR para la conjunción,
disyunción, negación y disyunción exclusiva, respectivamente.
Estas instrucciones tienen en común que realizan sus operaciones “bit a bit”. Es decir, el
procesador realiza tantas operaciones lógicas como bits tienen los operandos tomando los
bits que ocupan la misma posición y, por tanto, produciendo otros tantos resultados.

Instrucciones de desplazamiento y rotación


En este grupo se incluyen instrucciones que mediante desplazamientos efectúan
operaciones aritméticas de multiplicación y división por potencias de dos. Además, se
incluyen también instrucciones que manipulan sus operandos como si los bits estuviesen
dispuestos de forma circular y permite rotaciones en ambos sentidos.

Instrucciones de desplazamiento
Las instrucciones de desplazamiento se subdividen a su vez en dos categorías:
desplazamiento aritmético y desplazamiento lógico.

Las instrucciones de desplazamiento aritmético son aquellas que equivalen a multiplicar y


dividir un número por potencias de 2. Un desplazamiento de un bit quiere decir que cada
uno de ellos pasa a ocupar la siguiente posición (a derecha o izquierda) y por tanto,
dependiendo de cómo se introduzcan nuevos valores y cómo se descarte el bit sobrante,
dicha operación es idéntica a multiplicar por 2.
En adelante se asume que el bit más significativo de un número es el de más a su
izquierda.

Instrucciones de rotación
Las instrucciones de rotación permiten manipular un operando como si sus bits formasen
un círculo y se rotan en ambos sentidos un número determinado de posiciones.

Las instrucciones ROL y ROR rotan a izquierda y derecha respectivamente el contenido de


su segundo operando tantas posiciones como indica el primer operando. El último bit que
ha traspasado los límites del operando se almacena en el bit de acarreo CF.
Las instrucciones RCL y RCR son similares a las anteriores con la excepción que el bit de
acarreo CF se considera como parte del operando. El bit que sale del límite del operando
se carga en CF y éste a su vez pasa a formar parte del operando.
Al igual que las instrucciones de desplazamiento aritmético, el primer operando puede ser
o una constante o el registro %cl. El tamaño del dato a manipular se deduce del segundo
operando, y si este está en memoria, a través del sufijo de tamaño de la instrucción.

39
Instrucciones de salto
El procesador ejecuta una instrucción tras otra de forma secuencial a no ser que dicho
flujo de ejecución se modifique. Las instrucciones de salto sirven para que el procesador,
en lugar de ejecutar la siguiente instrucción, pase a ejecutar otra en un lugar que se
denomina “destino del salto”.

La instrucción de salto JMP (del inglés jump) tiene un único operando que representa el
lugar en el que el procesador debe continuar ejecutando. Al llegar a esta instrucción, el
procesador no realiza operación alguna y simplemente pasa a ejecutar la instrucción en el
lugar especificado como destino del salto. El único registro, por tanto, que se modifica es
el contador de programa.

40
En la tabla se incluyen instrucciones con diferente nombre e idéntica condición. Estos
sinónimos son a nivel de lenguaje ensamblador, es decir, las diferentes instrucciones
tienen una codificación.
Instrucciones de comparación y comprobación
Las instrucciones CMP (comparación) y TEST (comprobación) realizan sendas operaciones
aritméticas de las que no se guarda el resultado obtenido sino que únicamente se
modifican los bits de estado.

10.- Lenguaje máquina, macroensamblador


Para presentar esta parte usaremos dos ejemplos prácticos; el primero demostrara
además 7 modos de direccionamiento.

41
Método alternativo

42
El resultado en el Debugger

43
Este ejemplo ordena una lista de números, utilizando la técnica de ordenación por
intercambio.

11.- Debugger

C:\> Debug [Enter]


En la siguiente línea aparecerá un guión, éste es el indicador del Debug, en este momento
se pueden introducir las instrucciones del Debug. Utilizando el comando:

- r [Enter]
Se desplegaran todos los contenidos de los registros internos de la UCP; una forma
alternativa de mostrarlos es usar el comando "r" utilizando como parámetro el nombre
del registro cuyo valor se quiera visualizar. Por ejemplo:

- rbx
Esta instrucción desplegará únicamente el contenido del registro BX y cambia el indicador
del Debug de " - " a " : "

44
Estando así el prompt es posible cambiar el valor del registro que se visualizó tecleando el
nuevo valor y a continuación [Enter], o se puede dejar el valor anterior presionando
[Enter] sin teclear ningún valor.
Es posible cambiar el valor del registro de banderas, así como utilizarlo como estructura
de control en nuestros programas como se verá más adelante. Cada bit del registro tiene
un nombre y significado especial, la lista dada a continuación describe el valor de cada bit,
tanto apagado como prendido y su relación con las operaciones del procesador:

Overflow
NV = no hay desbordamiento;
OV = sí lo hay
Direction
UP = hacia adelante;
DN = hacia atras;
Interrupts
DI = desactivadas;
EI = activadas
Sign
PL = positivo;
NG = negativo
Zero
NZ = no es cero;
ZR = sí lo es
Auxiliary Carry
NA = no hay acarreo auxiliar;
AC = hay acarreo auxiliar
Parity
PO = paridad non;
PE = paridad par;
Carry
NC = no hay acarreo;
CY = Sí lo hay

45
46
47

S-ar putea să vă placă și