Documente Academic
Documente Profesional
Documente Cultură
0. Introducción 2
3. Funcionamiento en general 15
8. Modos de direccionamiento 35
9. Set de instrucciones 37
12. Anexos 46
1
INTRODUCCIÓN
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).
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.
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.
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
Diferencia 8086/8088:
A) ARQUITECTURA EN PIPELINE
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.
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.
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
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.
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.
4.El Bus C
1) REGISTROS DE SEGMENTOS
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:
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.
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.
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.
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
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:
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.
1.Unidad de control
3.Registros de índice
4.ALU
5.Registro de Banderas
6.Bus A
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).
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.
19
de servicio, la CPU recupera los registros grabados y continua con la tarea que había
dejado suspendida como si nada hubiera pasado.
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.
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.
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:
El Sector de Arranque
El sector de arranque o cargador primario, será lo único que necesitemos para poder
pasar el control a nuestro SOTR.
22
o Tiene un tamaño de 512 bytes
o En la posición 1FEh (510 en decimal) debe tener la palabra AA55h
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
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)
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
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
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.
SECCION DMA
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:
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
Se muestra la descripción del canal del computador personal IBM XT. Todas las
instrucciones son compatibles con TTL.
29
Los siguientes voltajes están disponibles en el canal de I/ O del sistema:
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
Vdc Salida
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
Anexo
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.
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:
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
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.
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
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.
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.
Modos de Direccionamiento
Las operaciones deben de obtener sus operados, ya sea de los registros o de la 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}
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.
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 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.
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
Las instrucciones de desplazamiento se subdividen a su vez en dos categorías:
desplazamiento aritmético y desplazamiento lógico.
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.
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.
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
- 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