Вы находитесь на странице: 1из 62

INTRODUCCIÓN

Este trabajo tiene como finalidad básica estudiar y explicar el


direccionamiento y sus diferentes modos, en lo que respecta a registros y
memoria, así como operaciones permitidas para el traslado de datos entre
estos, soluciones de problemas aplicando operaciones permitidas y
operaciones de decisiones.

Así mismo se explicaran las operaciones aritméticas y lógicas permitidas entre


registros y en memoria en un Microprocesador, es muy importantes conocer
como se realizan este tipo de operaciones puesto que son conocimientos
básicos en una carrera que está en constante auge como lo es el área de la
Informática.

1) DIRECCIONAMIENTO Y MODOS:

1.1) Definición de Registros:

Los registros del procesador se emplean para controlar instrucciones en


ejecución, manejar direccionamiento de memoria y proporcionar capacidad
aritmética. Los registros son espacios físicos dentro del microprocesador con
capacidad de 4 bits hasta 64 bits dependiendo del microprocesador que se
emplee. Los registros son direccionables por medio de una viñeta, que es una
dirección de memoria. Los bits, por conveniencia, se numeran de derecha a
izquierda (15,14,13«. 3,2,1,0), los registros están divididos en seis grupos los
cuales tienen un fin especifico. Los registros se dividen en:

* Registros de segmento

* Registros de apuntadores de instrucciones

* Registros apuntadores

* Registros de propósitos generales

* Registro índice

* Registro de bandera.
1.1.1) Registros de segmento:

Un registro de segmento se utiliza para alinear en un limite de párrafo o dicho


de otra forma codifica la dirección de inicio de cada segmento y su dirección
en un registro de segmento supone cuatro bits 0 a su derecha. Un registro de
segmento tiene 16 bits de longitud y facilita un á rea de memoria para
direccionamientos conocidos como el segmento actual. Los registros de
segmento son:

* Registro CS

* Registro DS

* Registro SS

* Registro ES

* Registro FS y GS

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, mas un valor de
desplazamiento en el registro de apuntado de instrucción (IP), indica la
dirección de una instrucción que es buscada para sí ejecución. Para propósito
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. En términos sencillos, esta dirección, mas un
valor de desplazamiento en una instrucción, genera una r eferencia a la
localidad de un bytes especifico 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 (SP), indica la palabra actual en la pila que está siendo
direccionada. Para propósitos de programación normal, no se n ecesita
referenciar el registro SS.

Registro ES: Algunas operaciones con cadenas de caracteres (datos de


caracteres) utilizan el registro esta de segmento para manejar el
direccionamiento de memoria. En este contexto, el registro ES esta asociado
con el registro DI (índice) .un programa que requiere el uso del registro ES
puede inicializarlo con una dirección apropiada.
Registros FS y GS: Son registros extra de segmento en los procesadores
80386y posteriores a estos procesadores.

1.1.2) Registro Apuntador de instrucciones.(IP):

El registro apuntador de instrucciones (IP) de 16 bits contiene el


desplazamiento de dirección de la siguiente instrucción que se ejecuta. El
registro 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 el ejemplo siguiente, el registro CS contiene 25A4[0]H y el IP contiene


412H. Para encontrar la siguiente instrucción que será ejecutada el procesados
combina las direcciones en el CS y el IP así:

Segmento de dirección en el registro CS: 25A40HDesplazamiento de


dirección en el registro IP: + 412H Dirección de la siguiente instrucción:
25E52H

1.1.3) Registros apuntadores:

Los registros apuntadores están asociados con el registro SS y permiten al


procesador accesar datos en el segmento de pila los registros apuntadores son
dos:

* El registro SP

* El registro BP

Registro SP. El apuntador de pila IP de 16 bits esta asociado con el registro SS


y proporciona un valor de desplazamiento que se refiere a la palabra actual
que está siendo procesada en la pila.

El ejemplo siguiente el registro SS contiene la dirección de segmento


27B3[0]H y el SP el desplazamiento 312H Para encontrar la palabra actual
que esta siendo procesada en la pila el microprocesador combina las
direcciones en el SS y el PP: Dirección de segmento en el registro SS:
27B30H

Desplazamiento en el registro SP: + 312H Dirección en la Pila: 27E42H


27B3[0]H 312H, Dirección del segmento SS Desplazamiento del SP
Registro BP. El registro BP de 16 bits facilita la referencia de parámetros, los
cuales son datos y direcciones transmitidos vía lapida.

1.1.4) Registros de propósitos generales:

Los registros de propósitos generales AX, BX, CX y DX son los caballos de


batalla o las herramientas del sistema. Son los únicos en el sentido de que se
puede direccionarlos como una palabra o como una parte de un byte. El ultimo
byte de la izquierda es la parte "alta", y el ultimo byte de la derecha es la parte
"baja" por ejemplo, el registro CX consta de una parte CH (alta) y una parte
CL (baja), y usted puede referirse a cualquier parte por si nombre. Ñas
instrucciones siguientes mueven ceros a los registros CX, CH y CL
respectivamente.

Mov CX, 00

Mov CH, 00

Mov CL, 00

Los procesadores 80386 y posteriores permiten el uso de todos registros de


propósito general, mas versiones de 32 bits; EAX, EBX y EDCX.

Registros AX. El registro AX, el acumulador principal, es utilizado para


operaciones que implican entrada/salida y la mayor parte de la aritmética. Por
ejemplo, las instrucciones para multiplicar, dividir y traducir suponen el uso
del AX. También, algunas operaciones generan código más eficientes si se
refiere al AX en lugar de los otros registros.

Registro BX. El BX es conocido como el registro base ya que e s el único


registro de propósitos generales que pueden ser unos índices para
direccionamiento indexado. También es común emplear al BX para cálculos.

Registro CX. El 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, hacia la derecha o hacia la izquierda. El CX también es
usado para muchos cálculos.

Registro DX. El DX es conocido como el registro de datos. Algunas


operaciones de entrada/salida requieren su uso, y las operaciones de
multiplicación y división con cifras grandes suponen al DX y al AX
trabajando juntos. Puede usar los registros de propósitos para suma y resta de
cifras de 8, 16, 32 bits.

1.1.5) Registro índice:

Los registros SI y DI están disponibles para direccionamientos indexados y


para sumas y restas. Que son las operaciones de punta.

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


con cadenas (de caracteres). En este contexto, el SI está asociado con e l
registro DS. Los procesadores 80386 y posteriores permiten el uso de un
registro ampliado a 32 bits, el ESI.

Registro DI: El registro índice destino también es requerido por algunas


operaciones con cadenas de caracteres. En este contexto, el Di está asoc iado
con el registro ES. Los procesadores 80386 y posteriores permiten el uso de
un registro ampliado a 32 bits, el EDI.

1.1.6) Registro de bandera:

Los registros de banderas sirven parar indicar el estado actual de la maquina y


el resultado del procesamiento, Cuando algunas instrucciones piden
comparaciones o cálculos aritméticos cambian el estado de las banderas.

Las banderas están en el registro de banderas en las siguientes posiciones:

bits 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1

| | | |O |D |I |T |S |Z | |A
| |P | |C |

Las banderas más comunes son las siguientes:

OF (Over flow flag, desbordamiento).Indica el desbordamiento de un bit de


orden alto (mas a la izquierda) después de una operación aritmética.

DF (Directionflag, Direccion). Designa la dirección hacia la izquierda o hacia


la derecha para mover o comparar cadenas de caracteres.
IF (Interruptionflag, Interrupcion). Indica que una interrupción externa, como
la entrada desde el teclado sea procesada o ignorada.

TF (Trapflag, Trampa). Examina el efecto de una instrucción sobre los


registros y la memoria. Los programas depuradores como DEBUG, activan
esta bandera de manera que pueda avanzar en la ejecución de una sola
interrupción a un tiempo.

SF (Signflag, Signo). Contiene el signo resultante de una operación aritmética


(0=positivo y 1= negativo).

ZF (Zero flag, Zero). Indica el resultado de una operación aritmética o de


comparación (0= resultado diferente de cero y 1=resultado igual a cero).

AF (Auxiliarycarryflag, Acarreo auxiliar). Contiene un acarreo externo del bit


3 en un dato de 8 bits, para aritmética especializada.

PF (Parityflag, Paridad). Indica paridad par o impar de una operación en datos


de ocho bits de bajo orden (mas a la derecha).

CF (Carryflag, Acarreo). Contiene el acarreo de orden más alto (mas a la


izquierda) después de una operación aritmética; también lleva el contenido del
último bit en una operación de corrimiento o rotación.

Cuadro Comparativo

TIPOS DE REGISTROS | FUNCION |

Registros de Segmento | Un registro de segmento tiene 16 bits de longitud y


facilita un área de memoria para el direccionamiento conocida como el
segmento actual |

Registros de Apuntador de Instrucciones | Este registro esta compuesto


por 16 bits y contiene el desplazamiento de la siguiente instrucción que se va a
ejecutar. Los procesadores 80386 y posteriores tiene un IP ampliado de 32 bits
llamado EIP. |

Registros Apuntadores | Permiten al sistema accesar datos al segmento de


la pila. Los procesadores 80386 tiene un apuntador de pila de 32 bits llamado
ESP. El sistema maneja de manera automática estos registros. |

Registros de Propósito General | Son los caballos de batalla del sistema y


pueden ser direccionados como una palabra o como una parte de un bytes. Los
procesadores 80386 y posteriores permiten el uso de todos los registros de
propósitos general mas sus versiones ampliadas de 32 bits llamados EAX,
EBX,ECX y EDX. |

Registros Indices | Sirven para el direccionamiento de indexado y para las


operaciones de sumas y restas. |

Registros de Banderas | Sirven para indicar el estado actual de la maquina


y el resultado del procesamiento. De los 16 bits de registro de bandera 9 son
comunes a toda la familia de los procesadores 8086. |

1.2) Definición de Memoria:

La memoria (también llamada almacenamiento) se refiere a los componentes


de una computadora, dispositivos y medios de almacenamiento que retienen
datos informáticos durante algún intervalo de tiempo. Las memorias de
computadora proporcionan unas de las principales funciones de la
computación moderna, la retención o almacenamiento de información. Es uno
de los componentes fundamentales de todas las computadoras modernas que,
acoplados a una unidad central de procesamiento (CPU por su sigla en inglés,
central processingunit).

Las computadoras de propósito general son la unidad aritmético -lógica


(ALU), la unidad de control, espacio de almacenamiento y los dispositivos de
entrada/salida. Si se elimina el almacenamiento, el aparato sería una simple
calculadora en lugar de un computadora. La habilidad para almacenar las
instrucciones que forman un programa de computadora y la información que
manipulan las instrucciones es lo que hace versátiles a las computadoras
diseñadas según la arquitectura de programas almacenados

Una computadora digital representa toda la información usando el sistema


binario. Texto, números, imágenes, sonido y casi cualquier otra forma de
información puede ser transformada en una sucesión de bits, o dígitos
binarios, cada uno de los cuales tiene un valor de 1 ó 0. La unidad de
almacenamiento más común es el byte, igual a 8 bits. Una determinada
información puede ser manipulada por cualquier computadora cuyo espacio
de almacenamiento es suficientemente grande como para que quepa el dato
correspondiente o la representación binaria de la información.
La memoria primaria está directamente conectada a la CPU de la
computadora. Debe estar presente para que la CPU funcione correctamente. El
almacenamiento primario consiste en tres tipos de almacena miento:

Almacenamiento Primario:

* Los registros del procesador son internos de la CPU. Contienen


información que las unidades aritmético-lógicas necesitan llevar a la
instrucción en ejecución. Técnicamente, son los más rápidos de los
almacenamientos de la computadora, siendo transistores de conmutación
integrados en el chip de silicio del microprocesador (CPU) que funcionan
como "flip-flop" electrónicos.

* La memoria caché es un tipo especial de memoria interna usada en


muchas CPU para mejorar su eficiencia o rendimiento. Parte de la
información de la memoria principal se duplica en la memoria caché.
Comparada con los registros, la caché es ligeramente más lenta pero de mayor
capacidad. Sin embargo, es más rápida, aunque de mucha menor capacidad
que la memoria principal. También es de uso común la memoria caché multi -
nivel - la "caché primaria" que es más pequeña, rápida y cercana al dispositivo
de procesamiento; la "caché secundaria" que es más grande y lenta, pero más
rápida y mucho más pequeña que la memoria principal.

* La memoria principal contiene los programas en ejecución y los datos con


que operan. La unidad aritmético-lógica puede transferir información muy
rápidamente entre un registro del microprocesador y localizaciones del
almacenamiento principal, también conocidas como "direcciones de
memoria". En las computadoras modernas se usan memorias de acceso
aleatorio basadas en electrónica del estado sólido, que está directamente
conectada a la CPU a través de un "bus de memoria" y de un "bus de datos".

Almacenamiento Segundario:

La memoria secundaria requiere que la computadora use sus canales de


entrada/salida para acceder a la información y se utiliza para almacenamiento
a largo plazo de información persistente. Sin embargo, la mayoría de lo s
sistemas operativos usan los dispositivos de almacenamiento secundario como
área de intercambio para incrementar artificialmente la cantidad aparente de
memoria principal en la computadora. La memoria secundaria también se
llama "de almacenamiento masivo ".
Habitualmente, la memoria secundaria o de almacenamiento masivo tiene
mayor capacidad que la memoria primaria, pero es mucho más lenta. En las
computadoras modernas, los discos duros suelen usarse como dispositivos de
almacenamiento masivo. El tiempo ne cesario para acceder a un byte de
información dado almacenado en un disco duro es de unas milésimas de
segundo (milisegundos). En cambio, el tiempo para acceder al mismo tipo de
información en una memoria de acceso aleatorio (RAM) se mide en mil -
millonésimas de segundo (nanosegundos).

Esto ilustra cuan significativa es la diferencia entre la velocidad de las


memorias de estado sólido y la velocidad de los dispositivos rotantes de
almacenamiento magnético u óptico: los discos duros son del orden de un
millón de veces más lentos que la memoria (primaria). Los dispositivos
rotantes de almacenamiento óptico (unidades de CD y DVD) son incluso más
lentos que los discos duros, aunque es probable que su velocidad de acceso
mejore con los avances tecnológicos.

Por lo tanto, el uso de la memoria virtual, que es cerca de un millón de veces


más lenta que memoria ³verdadera´, ralentiza apreciablemente el
funcionamiento de cualquier computadora. Muchos sistemas operativos
implementan la memoria virtual usando términos como memoria virtual o
"fichero de caché". La principal ventaja histórica de la memoria virtual es el
precio; la memoria virtual resultaba mucho más barata que la memoria real.
Esa ventaja es menos relevante hoy en día. Aun así, muchos sistemas
operativos siguen implementándola, a pesar de provocar un funcionamiento
significativamente más lento.

1.3) Direccionamiento de memoria

El direccionamiento de la memoria puede considerarse desde dos puntos de


vista: Físico y lógico. El primero se refiere a los medios electrónicos
utilizados en el ordenador para acceder a las diversas posiciones de memoria.
El segundo, a la forma en que se expresan y guardan las direcciones. En este
epígrafe nos referiremos exclusivamente a la forma en que son tratadas las
direcciones de memoria del PC. Advirtiendo desde ahora, que este asunto,
como muchos otros, ha sufrido mutaciones a lo largo del tiempo, y que
arrastra modos que solo tienen una justificación de tipo histórico, en razón de
las características del hardware de los primeros PC's.
El sistema de numeración utilizado por los informáticos para representar las
direcciones de memoria en el texto escrito no suele ser la decimal (como
parecería razonable), sino el hexadecimal

La razón es que los números hexadecimales guardan c ierta concordancia con


las potencias de 2. Por ejemplo, un bus de direcciones de 8 bits puede acceder
a 256 posiciones (en hexadecimal es el rango 00 -FFh). En caso de direcciones
de 16 bits, se puede acceder 65.536 posiciones (es el rango 0000 -FFFFh). El
bus de direcciones del PC XT, que tiene 20 bits, las posibilidades son
1.048.576 (es el rango 00000 -FFFFFh).

Como veremos a continuación, puede utilizarse una doble notación:


Direcciones absolutas, indicadas por un hexadecimal de cinco dígitos, en el
rango 00000-FFFFFh, o en direcciones segmentadas, que utiliza dos grupos de
cuatro dígitos hexadecimales.

Direccionamiento segmentado

Hemos indicado que el bus de direcciones del PC XT era de 20 bits, por lo


que teóricamente podían manejarse un total de 220 posibilidades (1.048.576).
Sin embargo, el procesador 8088 utilizado tiene registros de 16 bits, por lo
que solo puede contener directamente 216 posiciones (65.536).

La solución consistió en expresar las direcciones mediante dos palabras de 16


bits, denominadas desplazamiento y segmento que, por consiguiente, pueden
ser representadas mediante un hexadecimal de cuatro cifras en el rango 0000 -
FFFFh. Estas dos palabras pueden ser traducidas a una dirección de 20 bits
mediante la operación denominada suma co n desplazamiento. Por ejemplo,
suponiendo que el desplazamiento y el segmento fuesen respectivamente
ABCDh y E1FAh, la forma de obtener la dirección resultante es como sigue:

Una de las palabras, el desplazamiento, se desplaza una posición añadiéndole


un cero a la derecha (equivale a multiplicarla por 16, ya que las direcciones se
expresan en hexadecimal). En nuestro caso, si el desplazamiento es ABCDh
resulta ABCD0h. Puesto que inicialmente es un hexadecimal de 4 cifras
(ABCD en nuestro caso), el desplazamiento la transforma en un hexadecimal
de 5 cifras (ABCD0). El valor obtenido se suma con el valor del segmento
(E1FAh), así que la dirección resultante, sería 69ECAh. Para distinguirla de
la anterior, esta última forma se denomina dirección absoluta.
Nota: Es frecuente escribir las direcciones segmentadas en forma de los dos
cantidades separadas por dos puntos, poniendo a la izquierda el valor más alto
(el desplazamiento) y a la derecha el más bajo (el segmento). En forma
segmentada, la dirección anterior se expresaría ABCD:E1FA , y es
equivalente a la dirección absoluta 69ECAh.

Segmentos y párrafos

Esta forma de representación segmentada de las direcciones es en realidad una


imagen de como son manejadas internamente en el procesador.

Los procesadores 8088 tienen registros de 16 bits que pueden servir para
almacenar los desplazamientos, es decir, cualquier dirección dentro de una
zona de 64 KB (que se conoce como segmento). Disponen además de 4
registros de segmento de 16 bits (CS, SS, DS y ES en los que se almacenan
las direcciones de inicio del segmento activo en cada momento. Resulta así,
que pueden direccionar un total absoluto de 1MByte, y hasta 64 x 4 = 256 KB
sin necesidad de cambiar los registros de segmento. Esto es lo que se conoce
como funcionamiento en modo real (como puede verse, en realidad es una
forma de manejar la memoria).

La figura adjunta muestra como se utilizan los registros para señalar las
direcciones de inicio de los diversos módulos de un programa cargado en
memoria dentro del espacio de memoria direccionable con 20 bits (00000 -
FFFFFh).

En la figura 1 se muestra una división de este "Mega" en 16 segmentos cuyos


desplazamientos son justamente 0h, 1h, 2h ...Fh.

Modelos de memoria DOS

Las 220 posibilidades de direccionamiento antes comentadas, constituyen el


famoso límite del "Megabyte" de memoria de los primeros PC's, de los cuales
se reservaron los no menos famosos 640 primeros KBytes como máximo
disponible para programas de usuario.

Nota: Como verá a continuación, gran parte del "Sistema" se cargaba en


realidad en la memoria supuestamente reservada a usuario, con lo que en
realidad el especio para programas de aplicación resultaba siempre muy
precario.
Desde entonces, y en referencia a que el sistema operativo era MS-DOS, el
primer Megabyte de memoria se conoce como Memoria DOS; los primeros
640 KB como memoria convencional o memoria base. Los 384 KB restantes
(1024 - 640) son la memoria superior o "del Sistema" ("Uppermemory"). Esta
zona superior contenía cosas como adaptadores y memoria de video; chips de
la ROM-BIOS; ROMs de los controladores de disco, y adaptadores de red,
aunque existían "agujeros" sin uso que podían ser aprovechados.

En la figura 1 se muestra un mapa aproximado de la distribución de esta


memoria en el Sistema MS DOS.

Nota: Aunque para el programador toda esta memoria RAM es un único


espacio lógico, muchas de estas "cosas" están físicamente fuera de lo que es la
memoria RAM (si se abre la caja del ordenador). Por ejemplo, gran parte de
la memoria de video está físicamente en las propias placas de los adaptadores
de video.

Los programas DOS requieren la existencia de una zona contigua de memoria


convencional (preferiblemente de 640 KB), aunque en realidad est e espacio
debe ser compartido con la tabla de vectores de interrupción; área de datos de
la ROM BIOS y buena parte del propio Sistema Operativo DOS. Por
ejemplo, controladores de dispositivos (los famosos "device=..." del fichero
CONFIG.SYS). Como consecuencia de la escasez de espacio, se
desarrollaron técnicas para permitir que controladores de dispositivos y TSR's
se cargaran en otras zonas de memoria. Generalmente este tipo de
instrucciones de carga se sitúan en los ficheros CONFIG.SYS y
AUTOEXEC.BAT, y aprovechan que no todo el espacio de memoria superior
es utilizado por el Sistema, de modo que existen zonas ociosas en las que
podían situarse los citados controladores.

Memoria expandida

Muy pronto se comprobó que el Megabyte de memoria inicialmente previsto


era claramente insuficiente, por lo que se arbitraron diversos tipos de
soluciones. Los ingenieros de software, en cooperación con los de hardware,
debieron hacer verdaderos juegos malabares para tratar de suplir la cortedad
de miras de los diseñadores del PC
Concretamente hubo dos soluciones que fueron muy utilizadas y populares en
su época. La primera, fue resultado de una iniciativa conjunta de Lotus e
Intel, que desarrollaron una variedad de la técnica de direccionamiento
conocida como conmutación de bancos, a la que llamaron EMS
("ExpandedMemorySpecification"), que proporcionaba 8 MB de espacio
adicional. Más tarde fue aceptada también por Microsoft con alguna pequeña
modificación, pasando a denominarse especificación de memoria expandida
LIM (Lotus, Intel Microsoft).

Poco más tarde Quadram, Ahston-Tate y el fabricante de tarjetas de memoria


AST publicaron otra más flexible denominada EEMS ("Enhanced EMS");
además, la especificación LIM fue perfeccionada para proporcionar 32 MB
adicionales mediante una combinación hardware/software. El procedimiento
consistía en añadir al ordenador una placa adicional de memoria de
conmutación de bancos de hasta 32 MB, que era conducida por un "d river"
adecuado, el EMM ("ExpandedMemory Manager") cargado por el
CONFIG.SYS.

El truco consiste en que en un área en desuso de la memoria superior, se sitúa


una zona 64 KB, denominada marco de página, en la que existen 4 secciones
de 16 KB (ventanas) que se emplean como punteros a una página más grande
en la memoria de conmutación de bancos. Los programas podían utilizar
segmentos de datos muy grandes ya que el gestor de memoria EMM se
encargaba de traer automáticamente a la "ventana" la zona necesaria en cada
momento.

Modo protegido y memoria extendida

La especificación EMS de Lotus/Intel/Microsoft, permitía manejar grandes


cantidades de datos (ahora no nos parecen tan grandes), pero no resolvía el
problema de grandes cantidades de código, ya que el segmento de código no
podía manejarse de esta forma. Esto presentaba problemas no solo para
programas grandes, sino para cualquier intento de multiprogramación cuando
varios programas deben coexistir en memoria.

Como siempre, la solución vino de la mano de otro avance tecnológico; en


este caso, la aparición del procesador Intel 80286, que en 1982 inició la era
del PC AT. Este micro permite un acceso a memoria que recuerda vagamente
la especificación EMS, pero de forma nativa, ya que los mecanismos están
incluidos en el procesador. Como la política de Intel ha sido mantener
compatibilidad con los micros anteriores, el 80286 podía trabajar en modo
real, imitando el funcionamiento del 8088, mientras que la nueva forma se
denominó modo protegido.

El modo protegido utiliza los registros de segmento como punteros a unos


nuevos registros de dirección de 24 bits denominados tablas de descripción
("descriptor tables"), que permiten acceder a un máximo de 224 (16 MBytes)
de memoria física, de forma que los registros de segmento son selectores que
marcan el inicio de una dirección de 24 bits. La memoria que se hacía
accesible mediante este sistema se denominó memoria extendida, para
distinguirla de la antigua EMS. La posterior introducción del 80386, con
registros de 32 bits, permitió direccionar hasta 232 (4 GBytes) de memoria
externa.

Los nuevos micros incluyeron otras mejoras que permitían al Sistema


Operativo un funcionamiento más cómodo y seguro de las aplicaciones
cuando operaba en modo protegido. Los mecanismos pe rtinentes estaban
incluidos en el hardware o al menos este proporcionaba recursos al SO para
realizarlos cómodamente, aunque desde luego, para sacar provecho de estas
mejoras el Sistema debía estar preparado ex profeso. El DOS no podía
utilizarlas, sí en cambio los sistemas más avanzados del momento, como
OS/2, Unix o Windows.

1.4) Operaciones de decisiones en registro y memoria:

1.4.1) Traslado de datos entre el registro y memoria

Una característica importante de presentación del método lógico de


transferencia entre registros es que esta relacionado muy de cerca de la forma
en que la gente prefiere especificar las operaciones del sistema digital estas se
describen de mejor manera especificando:

* El conjunto de registros en un sistema y sus funciones.

* La información en código binario almacenado en los registros.

* Las operaciones realizadas a partir de la información almacenada en los


registros.

* Las funciones de control que inician la secuencia de operaciones.


Estos cuatro componentes forman la base del método de lógica de
transferencia entre registros para describir sistemas digitales.

Una afirmación en un lenguaje de transferencia entre registros consiste de una


unida de control y una lista de micro operaciones. La función de control (la
cual pude ser omitida algunas veces) especifica la función de control y
secuencia de tiempos para ejecutar la lista de micro operaciones. Las micro
operaciones especifican las operacio nes elementales que se realizan con la
información almacenada en los registros las cuales se pueden clasificar en
cuatro categorías:

* microoperaciones de transferencia entre registros que no cambian el


contenido de la información cuando la información binaria se mueve de un
registro a otro.

* Las microoperaciones aritméticas realizan aritmética con los números


almacenados en los registros.

* Las microoperaciones lógicas realizan operaciones tales como AND y OR


con el par de bits individuales almacenados en los registros.

* Las microopraciones de desplazamiento especifican operaciones para los


registros de desplazamiento.

1.4.2) Transferencia entre registros

Los registros de un sistema digital son designados por letras mayúsculas


(algunas veces seguidas de números) para denotar la función de registro. Por
ejemplo, el registro que retiene una dirección para la unidad de memoria se
llama comúnmente registro de direcciones de memoria y se designa como
MAR (memoryaddressregister). Otras serian A, B, R1, R2, e IR.

La forma más común de representar un registro es por medio de un rectángulo


con el nombre del registro dentro del de la manera mostrada en las figuras.

Registro A Representación con celdas individuales

Los registros mostrados en un diagrama de bloque pueden convertirse


fácilmente en proposiciones de declaración para propósitos de simulación.

La transferencia de un registro a otro se designa en forma simbólica por medio


del operador de reemplazo. La proposición:
AðB

Denota la transferencia del contenido del registro B al registro A.

Una proposición que especifica una transferencia entre registro implica que
los circuitos están conectados entre las salidas de los registros fuente hasta las
celdas de entrada de los registros de destino. La condición que determina
cuando ocurre la transferencia se llama función de control. Una función de
control es una función de Boole que puede ser igual a 1 ó 0.

x'T1: A ð B

La función de control se determina con dos puntos. Esta simboliza las


necesidades que la operación de transferencia puede ejecutar por medio de los
materiales, solamente cuando la función de Boole x'T1 = 1.

Los símbolos básicos de la lógica de transferencia entre registros se listan en


la siguiente tabla. Los registros se denotan por letras mayúsculas y los
números pueden estar contiguos a las letras. Los suscritos se usan para
distinguir las celdas individuales del registro. Los paréntesis se usan para
definir una porción de un registro. La lecha denota una transferencia de
información y la di rección de la misma. Dos puntos terminan una función de
control y la coma se usa para separar dos o más operaciones que se ejecutan al
mismo tiempo.

1.4.3) Transferencia de memoria

Un registro de memoria o palabra se simboliza por medio de la letra M. El


registro particular entre los muchos disponibles en una unidad de memoria se
selecciona por medio de la dirección de memoria durante la transferencia. Es
necesario especificar la dirección de M cuando se escriben proposiciones de
transferencias de memorias. En algunas aplicaciones, solamente un registro de
direcciones se conecta a las terminales de direcciones de memoria.

Cuando se conecta solamente un registro a la dirección de memoria, se sabe


que este registro especifica la dirección y que se puede adoptar una
proposición que especifica la dirección y que se puede adoptar una
convención que simplifica la notación.

Definimos lectura como la transferencia de información a partir de un registro


de memoria exterior. La escritura se define como la transferencia de
información nueva au registro. Ambas operaciones se especifican por medio
de una dirección del registro de memoria seleccionado.

El registro de memoria (M) se selecciona por medio de la dirección de


memoria durante la transferencia. Es necesario especificar la dirección de M
cuando se escriben proposiciones para transferencia de memorias.

Cuando se coloca solamente un registro a la dirección de memoria se sabe que


este registro especifica la dirección. Si la letra M aparece por si sola en una
preposición designara siempre un registro de memoria seleccionado por la
dirección que esta presente en el MAR (MemoryAddressRegister). De otra
manera el registro que especifica la dirección se encierra entre llaves
cuadradas después del símbolo M.

Considérese una unidad de memoria con un registro de direcciones MAR y un


registro separador de memoria MBR. Existen dos operaciones de transferencia
de memoria, la primera la operación de lectura que es una transferencia de un
registro M de memoria seleccionando al MBR esto se representa como:

R : MBR M (donde R es la función de control de lectura)

La segunda que es la operación de escritura que básicamente es la


transferencia del MBR al registro de memoria seleccionado M representado
como:

W : M MBR (donde w es la función de control de lectura)

El tiempo de acceso de una unidad de memoria debe estar sincronizada por


pulsos de reloj. En memorias rápidas debe ser menor o igual al pulso de reloj
en memorias lentas pueden ser necesario varios pulsos de reloj y en memorias
de núcleos magnéticos, los registros del procesador deben esperar para el
tiempo de memoria se complete.

2) OPERACIONES ARITMETICAS Y LÓGICAS EN UN


MICROPROCESADOR

2.1) Operaciones Aritméticas

Las Microoperaciones aritméticas básicas son: suma, resta, complementar y


desplazar. Todas las demás operaciones aritméticas se derivan de las
Microoperaciones básicas. La suma aritmética es representada como:
FA+B

Donde el contenido del registro A se le va a sumar al contenido del registro B


y esto se transfiere al registro F.

La sustracción o resta se representa a menudo por medio de la


complementación y suma:

F A + B +1

Donde al registro A se le agrega el complemento de 2 al registro B.

Las operaciones de incremento y decremento se simbolizan por la operación


de más 1 o menos 1 respectivamente. La siguiente tabla nos muestra las
operaciones aritméticas.

Descripción Simbólica | Descripción |

FA+B | Contenido de A mas B se transfiere a F |

FA-B | Contenido de A menos B se transfiere a F |

B B | Se complementa el registro B (Complemento de 1) |

BB +1 | Forma el complemento de 2 del contenido del registro B |

FA+B +1 | A mas el complemento de 2 de B se transfiere a F |

AA+1 | Incrementar el contenido de A en 1 (cuenta creciente) |

AA+1 | Decrementar el contenido de A en 1 (cuenta decreciente) |

Debe recalcarse que las operaciones aritméticas multiplicación (*) y de


división (/) no se listan dentro de las operaciones aritméticas básicas. Ya que
la única forma de en que estas operaciones pueden llevarse a cabo es mediante
los circuitos combinacionales. En la mayoría de los computador es la
operación de multiplicación se ejecuta mediante una secuencia de operaciones
de suma y desplazamiento y la división se ejecuta de forma de operaciones de
resta y desplazamiento.

2.2) Operaciones lógicas


Las operaciones lógicas especifican operacion es binarias para una cadena de
bits almacenados en los registros. Estas operaciones consideran cada bit en los
registros separadamente y lo tratan como una variable binaria.

Existen 16 operaciones lógicas diferentes posibles que pueden realizarse con


dos variables binarias, las cuales se pueden representar en términos de AND,
OR y complemento.

Estos mismos términos AND y OR se representan con sus símbolos


correspondientes. Tenemos que para representar la operación AND utilizamos
(/\) y para representar OR utilizamos (\/) y para complemento usamos ( ).Las
operaciones lógicas se listan a continuación.

Descripción Simbólica | Descripción |

A A | Complementa todos los bits del registro A |

F A \/ B | Microoperación lógica OR |

F A /\ B | Microoperación lógica AND |

FA B | Microoperación lógica OR exclusiva |

A shl A | Registro A de desplazamiento a la izquierda |

A shr A | Registro A de desplazamiento a la derecha |

La razón por la cual se adoptan los signos es que la Microoperación OR puede


tener dos significados diferentes ya que él más aritmético (+) en una función
de control o de Boole denota OR y en las variables de registro denota suma
aritmética. Esto lo podemos constatar en el siguiente ejemplo:

T1 + T2 : A A + B, B D \/ F

Donde (+) entre T1 y T2 es una operación OR entre las variables de control y


el (+) entre A y B denota suma y (\/) da a conocer que es la Microoperación
OR entre D y F.

2.3) Operaciones de desplazamiento

Las operaciones de desplazamiento transfieren la información binari a entre


registros en los computadores en serie y también se usan para operaciones
aritméticas, lógicas y de control. No hay símbolos para esta Microoperaciones
pero pueden adoptarse los siguientes símbolos:

A shl A, B shr B

La primera expresión significa un desplazamiento de un bit a la izquierda del


registro A y la segunda un desplazamiento a la derecha de un bit del registro
B. La información transferida a los flip-flops extremos no se especifica por los
símbolos shl y shr, por lo tanto, una proposición de una Microoperación de
desplazamiento debe estar acompañada con otra Microoperación que
especifica el valor de la entrada en serie del bit transferido al flip-flop
extremo. Por ejemplo:

A shl A, A1 An

Es un desplazamiento circular que transfiere el bit del extremo izquierdo


desde An hasta el flip-flop de la extrema derecha A1.

CONCLUSIONES

Ha sido tanto el avance en el sector de tecnologías de la información y la


comunicación que hoy en día nos vemos beneficiados en ello, t eniendo la
posibilidad de escoger dispositivos que se adapten a nuestras necesidades y a
los requerimientos planteados para la elaboración o la puesta en marcha de
proyectos de automatización, o para el manejo adecuado y eficiente de datos.

Es así que nos es de gran importancia establecer cuáles son las principales
operaciones aritméticas y lógicas permitidas en un microprocesador.

Cada uno de ellas posee un sector de aplicación distinto en donde cada uno
establece algunos requerimientos de trabajo a si com o también poseen
especificaciones para su manejo dependiendo de las aplicaciones en las cuales
se van a utilizar.

BIBLIOGRAFIA

http://www.terra.es/personal/arey42/Micro.htm
http://www.monografias.com/trabajos16/modos+Direc.shtml

http://www.enciclonet.com/documento/operaciones+arit+logicas.htm/

http://www.buenastareas.com/ensayos/Microprocesadores/206033.html

V
ï 


 V

1. Registros
2. Unidad aritmético lógica
3. Memoria de programa
4. Diseño de un microprocesador
5. Conclusiones
6. Bibliografía

1. Ê 
V
 

Esencialmente, un microprocesador es un circuito de alta escala de integración (LSI),
compuesto de muchos circuitos mas simples como son los Fip-flops, contadores,
registros, decodificadores, comparadores, etc; todos ellos en una misma pastilla de
silicio, de modo que el microprocesador puede ser considerado un dispositivo lógico de
propósito general o universal. Todos estos componentes que llevan a cabo físicamente
la lógica y operación del microprocesador se denominan el hardware del micro. Además
existe una lista de instrucciones que puede realizar o acciones que puede llevar a cabo el
micro. Éstas constituyen el lenguaje del micro o software.
Pongamos de ejemplo un micro que puede realizar cuatro tareas lógicas: AND, OR,
NAND, XOR. Estas cuatro acciones serian el lenguaje del micro y a cada una le
corresponderá una combinación binaria de dos dígitos.

 V V

 V

V
V

 V
V

 V V

Tabla 1. Operaciones y su código


El hardware quedaría de la siguiente manera:

Fig 1. Ejemplo de procesador de operaciones lógicas.

En este ejemplo se puede ver claramente lo que es un microprocesador. Las señales de


control son las que ejecutan cada una de las cuatro instrucciones que el micro puede
realizar. Los datos se presentan en las líneas A y B.
Sin embargo, en la actualidad se requiere que un sistema cuente con una unidad de
control, unidad aritmético / lógica y algunos registros para que se le pueda denominar
microprocesador. La forma en que están conectados estas unidades se denomina la
organización de un microprocesador.
Los sistemas digitales simples pueden ser diseñados por medio de tablas de estado. De
esta manera se llega a circuitos lógicos secuenciales de grado no muy complejo. Sin
embargo, a la hora de diseñar circuitos lógicos complejos las tablas de estado se tornan
increíblemente complicadas, extensas y poco prácticas. Una manera de poder llegar a
este tipo de circuitos es describir el sistema digital desde el punto de vista operacional.
De esta manera se encuentran cuatro partes fundamentales en los sistemas digitales
complejos:

a) Registros
b) Información en código binario
c) Operaciones realizadas con la información en los registros
d) Funciones de control que inician las operaciones.

Esta manera de ver al sistema (operacionalmente) se conoce también como lógica de


transferencia ente registros y fue sumamente útil en el diseño de sistemas lógicos
complejos como los sistemas de procesamiento o procesadores. En la lógica de
transferencia entre registros la unidad   abarca una gran gama de circuitos
lógicos como son los contadores, registros de desplazamiento, unidades de la memoria,
etc. Una unidad de memoria se considera como una colección de registros de
almacenamiento donde se guarda la información. De hecho, un flip-flop se considera
como un registro de un bit. LaV
 
V
 puede ser código, números
binarios, decimales codificados en binario, etc. Dicha información es guardada en los
registros antes mencionados. Las operaciones realizadas con la información en los
registros se conocen como    
. Una microoperación es una operación
elemental que se realiza en paralelo durante un periodo del pulso de reloj. Por ejemplo,
sumar, restar, desplazar, borrar, cargar, etc. Las 

V V 
, son las
condiciones que deben de prevalecer para iniciar una secuencia de operación.

V
  V V
 

Es necesario a este punto normalizar el lenguaje de transferencia que se utilizará de aquí
en adelante. En nuestro caso utilizaremos los siguientes símbolos:

1.-  V : Los registros son nombrados con letras mayúsculas como
puede observarse en la figura 1.

Fig 2. Símbolo de un registro de 4 bits

En la figura anterior se muestra gráficamente cómo se representa un registro de 4 bits.


Los números colocados en las esquinas superiores del rectángulo son la numeración de
los bits que tiene el registro. La letra A es el nombre del registro.

2.- h 
 : En ocasiones es necesario conocer la información de cada uno de los
bits de manera singular, para estos casos se puede dividir el registro en cada una de sus
celdas numerándolas con subíndices.

Fig 3. Registro A con cada uno de sus bits.

Este tipo de registros se les conoce como direccionables bit a bit porque se puede tener
control de cada uno de sus bits de forma independiente aunque juntos formen un solo
registro.

3.- ] : Teniendo un registro A y otro B podemos denotar la transferencia de la


información del registro A al B de la siguiente manera:
B A

4.- Dos puntos: Para que esta transferencia pueda llevarse a cabo es claro que se
necesita que las salidas del registro A deben estar físicamente conectadas con las
entradas del registro B. Y no es eso lo único que se necesita; cada una de las
operaciones realizadas entre los registros necesitan, como ya hemos mencionado antes,
de una función de control, por ejemplo podría ser:

X T2: B A

Lo que nos indica la expresión anterior es que se necesita que la expresión X T2 sea
verdadera para que pueda darse la transferencia. Esto es, X debe tener un valor "uno"
lógico y también T2. ¿Cómo puede implementarse esto electrónicamente?

Fig 4. Representación gráfica de la función XT2: B A.

Como puede observarse en la figura 3 existe una parte de control para determinar en que
momento se lleva a cabo la transferencia de información. Si solo X tiene un valor "uno",
el circuito de control no manda señal de carga al registro B. Es necesario que ambos, X
y T2 tengan valores de "uno". Cada proposición escrita en lenguaje de transferencia de
registros implica una construcción con materiales electrónicos para configurar dicha
transferencia.

5.- p: Es posible realizar dos o mas operaciones de transferencia entre registros
bajo las mismas condiciones de una función de control. Esto se expresa de la siguiente
manera:

X T2: B A, R A

Cada microoperación es separada de la anterior por medio de una coma. Gráficamente


esto se representa como muestra la figura 4.
V

Fig 5. Representación gráfica de la función XT2: B A, R A

Es sencillo, la misma señal de carga sirve para activar el registro B y el registro R.


Lógicamente es necesario que las salidas del registro A estén físicamente conectadas
con las entradas del registro B y R.
Estas líneas de conexión (alambre físicamente) para lograr la transferencia entre los
registros conforman el bus del microprocesador. Para transferencias en paralelo el
numero de alambres del bus será igual al numero de bits de cada registro. Existen varias
formas de implementar un bus, sin embargo, la mas simple en cuanto a su comprensión
es utilizar un bus multiplexado. Si necesitamos transferir información entre tres registro
A, B y C como muestra la figura 6 necesitaremos multiplexar en ocasiones al bus.

fig 6. Interconexión entre tres registros.

Como se puede observar en la figura 6, el registro A puede recibir información de los


registro B y C. Esto puede crear un conflicto en las líneas del bus. Si el registro B tiene
en sus salidas 0000, suponiendo que es de 4 bits, y el registro C tiene 1111, tendríamos
un corto circuito en las líneas del bus, ya que el registro A solo tiene cuatro bits de
entrada, estos cuatro bits estarán conectados tanto a la salida del registro B como a las
salidas del registro C. Para solucionar este conflicto se usarán multiplexores .
V

Fig 7. Uso de multiplexores en el bus.

De esta manera, el multiplexor se encargará de seleccionar al registro que debe mandar


información una vez por tiempo evitando conflictos en el bus. Claro está que esto no lo
realiza por si solo el multiplexor pues no cuenta con la suficiente lógica interna para
poder desarrollar estas funciones. Se requiere de circuitería extra para poder
manipularlo a nuestras necesidades.
V   
V 

pV
V V
Quizás la microoperaciónmas sencilla y primordial es la de carga en paralelo ya que es
la manera en que se transfieren datos de un registro a otro. Esta operación se representa
por medio de las flechas como ya hemos visto anteriormente. Para explicar mejor lo que
sucede cuando se realiza una operación de carga en paralelo supongamos que tenemos
dos registros independiente como el A y el B. Cada uno tiene información como se
muestra a continuación:

Fig 8. Dos registros con contenido diferente

Cada uno de los registros tiene información binaria diferente dentro de sí. Cuado
nosotros realizamos una carga en paralelo B A la información que tenga el registro A
se transfiere al registro B pero de una manera ordenada bit a bit. Esto es, el bit mas a la
derecha del registro A pasará al bit mas a la derecha del registro B, el bit mas a la
izquierda del registro A pasará al bit mas a la izquierda del registro B y así con todos y
cada uno de los bits. A esto se le llama una carga en paralelo.
V

Fig 9. Transferencia en paralelo de información

| 

En un desplazamiento lógico se desplazan a la derecha o a la izquierda los bits
contenidos en un registro. En un extremo, el bit saliente se pierde al desplazarse. En el
otro extremo se introduce un cero. Estos desplazamientos son útiles para aislar bits
dentro de un mismo registro.

Fig 10. Desplazamiento hacia la derecha.

Por ejemplo, si el registro A tiene información 1101 al realizarle un desplazamiento


hacia la derecha tendría 0110 como contenido. Si se vuelve a aplicar un desplazamiento
quedaría 0011. Ahora, supongamos que se le hace un desplazamiento hacia la izquierda,
el registro A tendría 0110, si se le vuelve a aplicar el corrimiento tendría 1100. Como
puede verse la información desplazada se pierde por completo en el caso de que sea un
"uno" debido a que en el desplazamiento se ingresa un cero. En el lenguaje de
transferencia entre registros esto se expresa:

hV , desplazamiento a la izquierda del registro A.


h V , desplazamiento a la derecha del registro B.
V

Fig 11. Resultado de un desplazamiento hacia la derecha

Ê 

En la rotación se preservan todos los bits del registro ya que si se hace hacia la derecha
el bit mas a la izquierda se coloca en lugar del bit mas a la derecha corriendo los demás
una posición hacia la derecha.

Fig 12. Rotación hacia la derecha.

Si, por ejemplo, nuestro registro A tiene 0011 y hacemos una rotación hacia la derecha
quedará la información como 1001. En lenguaje de transferencia ente registros estas
operaciones de rotación pueden expresarse de la siguiente manera:

Ê V , rotación a la derecha del registro A.


ÊV , Rotación a la izquierda del registro A.

! 
Las microoperaciones básicas son sumar, restar y complementar. Todas las demás
operaciones aritméticas puede obtenerse de una variación o secuencia de estas
microoperaciones. La operación de multiplicación, en la mayoría de las computadoras,
se ejecuta con una secuencia de microoperaciones de suma y desplazamiento. La
división se ejecuta con una secuencia de microoperaciones de resta y desplazamiento.
En la siguiente tabla se muestran las operaciones aritméticas consideradas básicas con
su respectiva simbología.

hV   V

V V h VV VVVVVV VVV

V V VV VVVVVV VVV


V V V VVVV

V  V V VVVV

V VVVV V h VVVV V VVVV VVV

V  V ! VV VVVV V

V  V  VV VVVV V

Tabla 2. Microoperaciones aritméticas.

Nota: El apóstrofe delante de un registro indica que es el complemento de dicho registro


o bien que esta negado su contenido.

 
Las microoperaciones lógicas especifican operaciones binarias para una cadena de bits
almacenados en los registros. Estas operaciones consideran cada bit en los registros
separadamente y lo tratan como una variable binaria. Esto quiere decir que las
operaciones lógicas se realizan a nivel de bit. Por ejemplo, su mi registro A contiene
1011 y mi registro B 0010 y realiza la operación A and B, el resultado se logra de
realizar las operaciones 1 and 0 (bits menos significativos) 1 and 1, 0 and 0 y 1 and 0
cuyo resultado es 0010. Las microoperaciones lógicas básicas son:

A', negación o complemento del registro A


A B, OR lógica ente A y B.
A B, AND lógica entre A y B
A B, XOR lógica entre A y B

V"
  V! V 
La ALU es la parte del microprocesador que realiza realmente las operaciones
aritméticas y lógicas con los datos. Se basa, como la mayoría de los componentes de
una computadora, en dispositivos lógicos sencillos. Pero no podemos hablar de
unidades aritmético lógicas si no sabemos realmente como se llevan a cabo operaciones
de tipo aritméticas y de tipo lógicas. Por lo mismo, comenzaremos por determinar
operaciones simples como suma y resta, siguiendo por la multiplicación y división,
también realizaremos operaciones en complemento a1 y complemento a2 (para
simplificar la redacción las nombraré de aquí en adelante como a1 y a2).

V# V
 V
V

A continuación se detallan la manera como se pueden realizar operaciones aritméticas
con números sin signo y enteros. Existen maneras para realizar la suma, resta,
multiplicación y división.

Vh 
Si sumamos números decimales es común la expresión "cinco mas siete es igual a doce,
entonces son dos y llevo uno". Este "llevo uno" se conoce como el acarreo. De la misma
manera se realiza una suma binaria de varios bits. Unicamente necesitamos recordar las
sencillas reglas de la suma binaria de un bit.
1+1 = 0 y llevo 1
1+0 = 1
0+1 = 1
0+0 = 0
1+1+1 = 1 y llevo 1
Con estas reglas tenemos por ejemplo:

Acarreo

VÊ 
La resta se lleva de manera similar en números decimales y binarios. Si en la suma
existe el acarreo, en la resta existe el "préstamo", igual que en decimales.
1-1 = 0
1-0 = 1
0-0 = 0
.0-1 = 1 prestando un uno al bit siguiente.
Con estas reglas tenemos por ejemplo.

V   

La multiplicación no es en lo absoluto mas complicada que las dos operaciones


anteriores que hemos visto. Simplemente se trata de multiplicar con unas sencillas
reglas y después sumar. Cuando realizamos multiplicaciones decimales de varios
numero debemos multiplicar cada uno de los numero del multiplicador por cada uno de
los del multiplicando corriendo el resultado un lugar hacia la izquierda para después
sumar los resultados.
Las reglas de la multiplicación son:
1x1 = 1
1x0 = 0
0x1 = 0
0x0 = 0
De esta manera tenemos:

V
$V|%

Es muy simple realizar una división de números binarios pues es sumamente similar a la
división con números decimales. Hay un cociente como resultado con un posible
residuo, hay un dividendo y un divisor y se trata de encontrar múltiplos e irlos restando
uno por uno. No creo necesario extenderse en la explicación paso a paso de la división
de números enteros positivos en binario. Basta con un pequeño ejemplo y recordar las
reglas para la división de números decimales ya que son iguales.

V# V
 V 
V


Vp 
V
Es interesante lo que se puede hacer con números binarios. Como ya vimos hay maneras
de realizar sumas, restas y multiplicaciones, pero hemos realizado operaciones con
números enteros y positivos. ¿Acaso se puede hacer operaciones con números binarios
que representen números negativos? Sí se puede y no es tan complicado como pareciera
ser. Para esto se llegó a una notación especial denominada complemento a2. Es mas
sencillo explicarlo si tomamos en cuenta registros de 8 bits. Cuando queremos
representar números positivos, el bit mas significativo servirá de signo: si es 0 es
positivo y si es 1 es negativo. Esto nos deja únicamente 7 bits para el numero o bien,
hasta 64 números se pueden formar. Lo importante es que de cada numero positivo se
puede encontrar su negativo por medio del complemento a2. Esto se hace sacando el
complemento de dicho numero y sumándole un uno.
Número positivo: 00000100 = 4
Complemento: 11111011
Se le suma uno: 11111011+1=11111100 = -4
Si alguna de las operaciones aritméticas nos arroja un resultado negativo, dicho
resultado estará en representación complemento a2. Para leer mejor el resultado solo
tenemos que convertir dicho numero negativo a un numero binario normal. Esto se hace
calculando el complemento a2 de dicho numero (que ya esta en complemento a2). Por
ejemplo, si el resultado de una suma o una resta nos da -18 (11101110) tendríamos que
complementarlo primero (00010001) y después sumarle 1 (10001 + 1) lo cual nos daría
10010 = 18. Es claro que al convertirlo a notación binaria normal el numero nos da
posistivo, pero esto solo se hace con fines de poder leer mejor el resultado debido a que
no nos vamos a aprender todos los números en complemento a2. Sabemos que el
resultado es negativo, solo necesitábamos averiguar la magnitud que es 18.

Vh V
La suma en complemento a2 es sencilla ya que lo único que tenemos que hacer es
convertir a negativo cualquier número que tenga signo negativo. Por ejemplo: Si
tenemos 6+9 no es complicado ya que ambos son positivos y sabemos realizar este tipo
de sumas.

Pero si la suma es -6+9, entonces debemos calcular el complemento a2 del 6 que en


binario es 110. Dicho complemento se obtiene negando primero (11111001) y
sumándole 1 después (11111001 + 1) para lo cual nos queda 11111010. La suma
quedará como sigue:

Si tenemos dos números negativos tampoco es para desesperarse, simplemente hay que
convertir en complemento a2 ambos números. La suma -9 + (-9) seria:

VÊ 
Cualquier resta decimal puede ser expresada y calculada como una suma. Por ejemplo
9-6 puede ser expresada como 9 + (-6). De la misma manera las restas binarias se
traducen en sumas. Por este motivo no creo necesario profundizar ni poner ejemplos
detallados de las restas que utilizan signos en forma de complemento a2.

$V   

La multiplicación con signo puede realizarse como una multiplicación cualquiera


convirtiendo ambos operandos en positivos. Simplemente se realiza la multiplicación
como ya se vio anteriormente. Si los operandos eran de signos iguales entonces el
resultado ha de ser positivo y correcto a nuestro resultado. Pero silosoperandos tienen
signos diferentes, entonces el resultado (que siempre será positivo) es incorrecto en
cuanto al signo, aunque no en la magnitud. Aun así es necesario convertir el numero a
su complemento a2 para dejarlo en su forma negativa. Para reducir estos pasos y
simplificar sobre todo el hardware al implementar una multiplicación con signo su
puede utilizar el algoritmo de Booth.
Tabla 3. Secuencia de una multiplicación con el algoritmo de Booth

Supongamos que deseamos realizar la multiplicación de dos numero con signo como -2
(1110) y -4 (1100). Para el algoritmo de Booth debemos considerar el multiplicando
como un registro o variable M y el multiplicador una variable Q. Además existe la
variable A y el bit Q-1 que representa el bit menos significativo de un registro virtual
formado por A, Q y Q-1 es ese orden estrictamente. De hecho, el resultado aparecerá en
este registro virtual al que denominaré R (A, Q, Q-1) y del cual hay que ignorar el bit Q-
1 a la hora de leer el resultado. El algoritmo de Booth con estas variables definidas
consiste en analizar el bit menos significativo de Q y Q-1. Si son idénticos (0-0, 1-1)
entonces solo hay que realizar un desplazamiento aritmético a la variable completa R.
En el caso de que sean diferentes se realizarán las siguientes operaciones: cuando sea 1-
0 se hace A A-M y cuando sea 0-1 se hace A A+M. Veamos nuestro caso representado
en la tabla anterior. He numerado las filas de la tabla para simplificar su explicación. En
la fila dos puede observarse los valores iniciales de cada una de las variables de nuestro
ejercicio. La variable A siempre inicia con valores 0000, lo mismo que el bit Q-1 . Se
comparan el bit menos significativo de la variable Q y Q-1 (ambos en rojo) y se
determina que son iguales por lo que durante el ciclo uno solo se realizará el
desplazamiento aritmético de la variable completa R. En la línea 3 puede observarse el
resultado de este desplazamiento. Es igual a un desplazamiento lógico como ya vimos
en la primera parte solo que el bit del signo se conserva siempre. Al comparar el la línea
tres, que es el resultado del ciclo uno, puede observarse que son iguales los bits por lo
que solo se realizará un desplazamiento aritmético durante el ciclo dos. En la línea 4 se
observa el resultado de este corrimiento. Al comparar en la línea 4 los bits vemos que
hay una diferencia por lo que hay que hacer A A-M. El resultado de este operación
puede observarse en la línea 5. Después de cada operación es necesario realizar un
desplazamiento del resultado. En la línea 6 se muestra el resultado de dicho
desplazamiento. Esta línea 6 es el final del ciclo tres. Comparando en la línea 6 los bits
vemos que son iguales por lo que solo hay que realizar un desplazamiento aritmético en
el ciclo cuatro. El resultado se observa en la línea 7. Como los números con de 4 bits
solo se necesitan 4 ciclos. El resultado se obtiene del registro R omitiendo el bit Q-1,
esto es 00001000 = 8. ¿Cuánto es -2 por -4? Pues ocho.

V V V


En este capitulo se analizará la función de la memoria dentro del procesador que
diseñaremos. En una computadora, cada programa que ejecutamos se guarda en la
memoria principal que es una memoria tipo RAM. El microprocesador va tomando de
la memoria las instrucciones y los datos que necesita aleatoriamente de acuerdo al
programa o programas que se estén ejecutando en ese momento. De este mismo modo
nuestro microprocesador contará con una memoria donde se almacenarán los datos y las
instrucciones que pretendamos que realice.

VÊ&
Las memorias ROM son las "memorias de solo lectura". La idea de éstas es que se
pudiese guardar información en ellas y no se pierda dicha información a través de los
años o cuando se cortara la alimentación del integrado. Antiguamente uno mandaba la
especificación del contenido que deseaba que tuviera una memoria ROM al proveedor.
Esto era debido a que la información contenida en las memorias se fijaba en el proceso
de fabricación. Sin embargo, esto era un impedimento para quienes necesitaban de una
memoria para desarrollar pequeños proyectos y no tenían recursos suficientes para pedir
a los distribuidores una memoria, además que los distribuidores solo hacían pedidos
grandes.
Debido a estos inconvenientes se desarrolló una memoria de tipo ROM llamada PROM
(memoria de sólo lectura programable o memoria ROM programable). Esta memoria
tenia la facilidad que con un aparato un poco costoso, cualquier persona podía grabar el
contenido de una memoria por lo que se comenzó a utilizar la tecnología ROM para
propósitos generales. Desgraciadamente esta tecnología era OTP (one time
programable) solo se podía grabar una vez. Esto representaba un costo elevado para la
investigación porque si el proyecto tenia un pequeño error, la memoria ROM debía ser
reemplazada por otra sin error. De aquí que se desarrolle la memoria EPROM (memoria
ROM programable borrable). Dicha memoria podría ser grabada eléctricamente y
borrada con luz ultravioleta. Para quienes no tenían un módulo de luz ultravioleta era
necesario que "sacaran al sol" sus memorias que tenían una especie de "ventana" por
donde entraba la luz ultravioleta. En el caso de contar con un generador de luz
ultravioleta, los programadores se tardaban cuando mucho 8 minutos en borrar la
memoria, pero quienes no tenían esta facilidad debían dejar al sol sus memorias
aproximadamente 24 horas. Además, estas memorias únicamente se podían grabar y
borrar unas 10 veces aprox. Finalmente se desarrolló una memoria ROM que podía ser
grabada eléctricamente y borrada de la misma manera. Se podía hacer este proceso mil
veces (si estaba buena) y no tomaba mas que unos minutos (en la actualidad solo se
requiere de unos segundos). Esta memoria se llama EEPROM (memoria ROM
programable borrable eléctricamente).
En las computadoras encontramos memorias ROM en lo que se llama el BIOS el cual es
una memoria donde se guarda la información de la tarjeta madre, de los conectores y
dispositivos de la PC.

VÊ 
Este tipo de memoria puede ser borrada y grabada las veces que deseemos. La única
desventaja es que la información grabada en ella solo puede ser utilizada mientras tenga
energía. En cuanto se corte la alimentación, los datos que se grabaron se borrarán
instantáneamente. Se usan solo como almacenamiento temporal.
Existen dos variantes entre las memorias RAM: SRAM y DRAM. La SRAM es
conocida como la RAM estática, en ella los valores binarios o información se
almacenan utilizando configuraciones de compuertas por lo que, mientras tenga la
alimentación, los datos guardados en ella se mantendrán intactos. LA DRAM es
conocida como RAM dinámica y esta hecha con celdas, que almacenan los datos como
cargas en condensadores. La presencia o ausencia de carga en el condensador se
interpreta como el 1 o 0 binarios. Ya que los condensadores tienen una tendencia natural
a descargarse, las RAM dinámicas requieren refrescos periódicos para mantener
memorizados los datos. Su costo no es muy elevado.
Para nuestro caso utilizaremos una memoria RAM.

V&
 
V V V ' (
Para explicar cómo se guardan los datos en la memoria recurriré a la clásica
representación del librero. Supongamos que tenemos un librero con 4 línea para poner
libros. En cada línea caben hasta 4 libros.

4V V

4V V

4V"V

4V#V

Fig 13. Representación de una memoria como un librero

Las líneas representan las direcciones que tiene esa memoria, o bien, los espacios
disponibles para guardar información. Cada libro representa un bit de información, por
lo nuestro librero representa una memoria con cuatro direcciones de cuatro bits de
capacidad. Cada dirección se representa por un numero binario secuencial. Ahora se
cambiamos nuestro librero por una memoria verdadera y los libros por bits tendremos lo
siguiente:

Fig 14. Representación tabular de una memoria

Para memorias pequeñas esta organización resulta práctica y simple. Pero para
memorias mas grandes es difícil tener este tipo de organización. Aunque en el diseño de
nuestro pequeño procesador no utilizaremos memorias grandes, me gustaría profundizar
en la organización de las memorias grandes sin adentrarnos en la organización de
módulos de memorias que son los que se utilizan en las computadoras.

$V&
 
V V V

Analicemos la siguiente figura que nos muestra la organización de una memoria de 16
Mbits. Esto es, tiene 16 millones de celdas de memoria con la particularidad de que
guarda los datos en palabras de 4 bit. Por esto, tiene una matriz de celdas de 2048 por
2048 donde cada localidad de la matriz tiene 4 celdas para formar la palabra.
Fig 15. Organización de una memoria de 16Mb

Obsérvese que las líneas de direcciones de esta memoria van de la A0 a la A10, es decir,
once líneas de dirección. Recordando el parcial pasado tenemos que 211=2048.
Realmente solo tendríamos capacidad para direccionar 2048 localidades de 4 bits, pero
esta memoria, como la mayoría, tiene líneas de datos multiplexadas. Esto se hace para
ahorrar espacio y cableado. El microprocesador manda 22 datos que sirven como
dirección. Sin embargo, las primeras 11 señales sirven para seleccionar la fila de la
matriz activando la señal de control RAS (RowAddress Selector). Luego entonces,
podemos seleccionar una fila entre 2048 existentes en la matriz. Para esto sirve el
decodificador de líneas en la memoria el cual tiene once entradas (las primeras once
señales de dirección que manda el micro) y 2048 líneas de salida. Las siguientes 11
señales de dirección que manda el micro sirven para seleccionar la columna de la
matriz. Por esto se mandan al decodificador de columnas activando la respectiva señal
de control CAS (ColumnAddress Selector). Al ser una memoria DRAM, requiere de
refresco cada cierto tiempo por lo que tiene un contador de refresco (RerfeshCounter).
Ademas, la memoria cuenta con dos buffers: de entrada y de salida, de donde
precisamente entran y salen datos de la memoria (D0 a D3 recuerda que es de 4 bits).
Las señales WE y OE son las que regulan las operaciones de escritura y lectura de la
memoria (WriteEnable y Output Eneable). Si tuviésemos una matriz de 8 x 8 x 4 tendría
esta apariencia ya con datos grabados.
Para direccionar la matriz solo requeriríamos de 3 líneas de dirección. La organización
de esta memoria tendría la siguiente forma:

Fig 15. Organización de una memoria de 256 bits

Esta memoria que hemos diseñado ahora tiene una capacidad de 256 bits o bien 64
palabras de 4 bits.

$V| (V V
V   
Hasta ahora hemos revisado paso por paso y en separado conceptos, procedimientos y
circuitos que son utilizados en el diseño de microprocesadores. Sin embargo, ya es
tiempo de que juntemos toda esta información para lograr el fin que hemos perseguido
desde en inicio de este articulo: el diseño del microprocesador. En esta parte es cuando
hay que poner todos los sentidos en alerta y prepararse para algo que, a mi manera de
ver, es el secreto de la tecnología. Si miramos a nuestro alrededor podemos observar un
sin fin de aparatos electrónicos de diferentes usos, formas y diseños. La mayoría, no
digo todos, utilizan en su interior un sistema basado en uno o mas microprocesadores.
Los mas simples podrán basarse en microcontroladores, pero los complejos y, sobre
todo, de propósito general, como las computadoras contienen un procesador principal y
varios procesadores a su alrededor como es el chip set.

$&
 
V%V '   
Antes de entrar de lleno al diseño de nuestro micro creo necesario definir y delimitar
dos conceptos que aparecen siempre juntos pero que cuesta trabajo decir cuando
comienza uno y termina el otro. Me refiero al concepto de organización y al de
arquitectura. ¿Por qué en algunos temas nos presentan como organización algo que
pudiera tomarse como arquitectura, o viceversa? A continuación se presentan algunas
definiciones de arquitectura:
" Arte de diseñar una máquina con la cual sea agradable trabajar ". (Caxton Foster -
1970)
" Determinar componentes, funciones de los componentes y reglas de interacción entre
los " (N. Prassard - 1981).
" La estructura de la Computadora que el programador necesita conocer con el objeto de
escribir programas en lenguaje de máquina correctos " (Informe final del proyecto CFA
Arquitectura de Familias de Computadoras).
Para mi gusto, las definiciones que presenta William Stallings en su libro Organización
y Arquitectura de Computadoras (1996) delimitan de manera clara la diferencia entre
los dos temas antes mencionados.

'   : La arquitectura se refiere a los atributos de un sistema que son visibles
para un programador o bien, a aquellos atributos que tienen un impacto directo en la
ejecución lógica de un programa.

&
 
: La organización se refiere a las unidades funcionales y sus
interconexiones, que dan lugar a especificaciones arquitectónicas.
Lo interesante de estos conceptos es que para el diseño de nuestro microprocesador
necesariamente tendremos que involucrarnos en su arquitectura (conjunto de
instrucciones, numero de bits para representar números, instrucciones y caracteres, etc.)
y en su organización (señales de control, memoria, registros, etc). De hecho, en la
actualidad muchos microprocesadores han conservado su arquitectura de una manera u
otra pero su organización ha cambiado para mejorar su rendimiento. En las mismas
compañías que ofrecen microprocesadores la arquitectura es la misma o muy similar
con diferencia únicamente en la organización lo que hace variar precios y rendimiento.

$V&
 
V V   
A continuación veremos la organización del microprocesador .

Fig 16. Organización de un microprocesador sencillo.


Comencemos por definir y explicar cada una de las partes de este microprocesador.
 Ê: Este es el registro de direcciones de memoria (memoryadressregister). Debido a
que la memoria RAM requiere cierto tiempo para encontrar y posicionarse en una
dirección, dicha dirección debe estar siempre en las entradas. Este registro funciona
como buffer del PC.
)p: Este es un contador (programcounter) que sirve para tener la dirección de memoria
de la siguiente instrucción o dato que se debe de leer. Esto es, si en la memoria
comenzamos con la localidad 0000, el contador, después de apuntar hacia esa dirección
y después de haber tomado el dato contenido en la memoria, debe ser incrementado en
uno para que contenga un 0001, o sea, apunte a la siguiente dirección de la memoria. En
nuestro caso, este contador debe ser capaz de cargar datos en paralelo para poder
realizar instrucciones de salto. Por ejemplo, el contador puede tener el numero 0100, y
en esa dirección, la memoria contiene una instrucción de salto a la dirección 1000. El
PC debe ser capaz de cargar este nuevo número y seguir su cuenta a partir de él.
*Ê: Este registro es el buffer de datos de la memoria (memory buffer register).
Cuando la memoria se posiciona en una dirección, muestra el contenido en su bus de
datos, pero estos datos o contenido cambiaran si se cambia la dirección que se pone en
las entradas del bus de direcciones de la memoria. Es por esto que es necesario un
buffer de salida en la memoria. También nos servirá como buffer para instrcciones de
escritura a la memoria.
Ê: Este registro el es registro de instrucciones (instructionregister). Cuando el dato
contenido en una dirección de memoria es una instrucción (suma, resta, salto, etc.) se
manda a este registro para decodificarlo y mandar las señales correctas para realizar
dicha instrucción.
": La unidad aritmético lógica es un integrado que puede realizar operaciones
aritméticas y operaciones lógicas ya sea con un solo operando o hasta con dos
operandos.
: Este es el registro acumulador y es de propósito general. En nuestro caso será
utilizado para guardar uno de los operandosdel la ALU para llevar a cabo operaciones
con dos operandos. El segundo se proporcionará directamente a la ALU desde el MBR.
Ê&): Este registro contiene el código de operación de la ALU. Esto es, se requiere de
un código binario en las entradas de la ALU para seleccionar qué tipo de operación se
quiere llevar a cabo (suma, resta, complemento,etc.).
Ê: Este registro sirve únicamente para observar el resultado de las operaciones
realizadas en la ALU pues está conectado directamente a las salidas.
+
 V V : Es la parte de nuestro microprocesador que se encarga de
generar señales de tiempos de acuerdo a la frecuencia de reloj que estemos manejando.
"
  V V 
: Es la encargada de generar las señales correctas para realizar las
operaciones deseadas por el usuario. Como una analogía tenemos al director de una
orquesta.
La idea de esta organización es poder implementar cuatro operaciones básicas que nos
servirán para echar a andar al microprocesador. Cuando veamos las instrucciones se
comprenderá completamente el por qué de esta organización.

$Vp V V
 

Un sistema digital se define por las operaciones que puede realizar. Cuando estas
operaciones son fijadas de manera que solo puede ejecutar las mismas operaciones una
y otra vez de manera secuencial entonces hablamos de un sistema digital de propósito
especial. Cuando la secuencia de las operaciones que realizará nuestro sistema digital se
puede modificar para que realice las tareas que deseamos en ese momento, entonces
tenemos un sistema digital de propósito general. Los microprocesadores son sistemas
digitales de propósito general puesto que cuentan con una lista de instrucciones que
pueden realizar en el orden que nosotros deseemos. Este orden de instrucciones es lo
que se conoce como programa. Todos nosotros, al menos que estamos en el ámbito de
las computadoras, sabemos y conocemos los programas de computadoras y, quizás,
hasta hemos hecho algún programilla por nuestra cuenta. Estos grandes programas están
hechos con un lenguaje fácil de interpretar y comprender para los seres humanos. Sin
embargo, hablando del lenguaje de microprocesadores, solo podemos manejar códigos
binarios. Para realizar una multiplicación tenemos el código 1110, para la suma 1100,
etc. Con cuatro bits podemos referir hasta 16 códigos de instrucciones. Para el
microprocesador de una computadora son pocas 16 instrucciones, pero para nuestro
procesador serán suficientes. Comenzaremos con cuatro instrucciones:
,,: Saca de la memoria el contenido que está en la dirección DIR y se lleva el
registro A.
+" Ê| : Guarda el contenido del registro A en la dirección de memoria DIR
h - : Continua la ejecución de las instrucción que se encuentra en DIR (2a.
Palabra).
&),Ê : Realiza la operación aritmética lógica que es codificada por tipo entre el
contenido del registro A y el operando OP.2
En ocasiones como la nuestra es necesario proporcionar no solo el código de operación
que se desea hacer sino también alguna información extra como son los operandos o las
direcciones de los operandos. Para nuestra instrucción LEE es necesario el código de
instrucción y la dirección de la memoria que se desea leer. En la siguiente tabla se
muestra cada una de las instrucciones y sus operandos necesarios. Cabe recalcar que los
códigos de operación son propuestos, podrían ser cualquier combinación binaria de
cuatro bits, pero para fines del diseño de nuestro microprocesador estos códigos son
fáciles y prácticos.

Tabla 4. Instrucciones del microprocesador

De esta manera para hacer un GUARDA es necesario proporcionar la dirección en la


cual se va a guardar el contenido del registro A. Para hacer un SALTA es necesario
proporcionar la dirección a la cual se saltará el programa. Para el OPERA es necesario
una combinación binaria que determina qué operación se va a realizar (suma, resta, and,
or, xor, etc.), esta combinación será de acuerdo a la ALU que usemos, y también hay
que determinar el segundo operando ya que el primero se encuentra en A y el segundo
estará en el MBR. Nótese las conexiones que tiene la ALU en el diagrama a bloques
para poder observar el registro ROP que es el que tendrá la combinación que determina
qué operación se realiza con los datos que hay en A y MBR conectados a las entradas de
la ALU.
Traslademos todo esto a una memoria de 16 x 4 bits. El microprocesador siempre
iniciará buscando en la primera dirección de la memoria que contiene el programa. Si
quisiéramos realizar un LEE la dirección 1000 y luego un salta a la dirección 1111
tendríamos.
Fig 17. Ejemplo de un programa en memoria

En la primera dirección (0000) está el código de un LEE (0001) seguido de su dirección


a leer (1000) en la segunda dirección (0001). En la tercera dirección (00010) se
encuentra el código de un SALTA (0100) seguido de la dirección. De esta manera es
como se escribe un programa en lenguaje maquina (con unos y ceros). Cada instrucción
genera una señal para el circuito de control. El IR se encarga de decodificar una
instrucción y enviarle la respectiva señal al sistema de control.

$$V   

Las operaciones mostradas en el apartado anterior son macrooperaciones porque
requieren un numero determinado de microoperaciones para poder llevarse a cabo. A
continuación analizaremos cada una de las macrooperaciones y de esta manera quedará
completamente explicada nuestra organización que da lugar a nuestra arquitectura.

$$Vp V*' VV]  


Recordemos que nosotros determinamos el código de una instrucción por medio de una
combinación binaria de n bits que podemos escoger perfectamente al azar. Entonces si
tengo determinado la combinación 1000 como un OPERA ¿por qué no se confunde mi
microprocesador si uno de los operando es 1000 o bien el código de la operación es
1000?
Un ejemplo de esto puede ser como sigue:

Fig 18. Ejemplo de un programa con contenido aparentemente repetido

Observa el contenido de la siguiente memoria. Cualquiera diría que vamos a realizar


tres instrucciones OPERA pero no es así, solo se va a realizar una con un código de
operación 1000 y un segundo operando 1000.
El microprocesador es un circuito secuencial temporizado. Siempre antes de que
empiece una nueva instrucción los tiempos se inicializan precisamente para realizar el
ciclo Fetch. Este ciclo es el encargado de tomar un código y llevarlo hacia el IR para ser
decodificado y asi activar la lógica correcta del circuito de control y llevar a cabo esta
instrucción. Consta de tres tiempos y cinco microoperaciones.

El PC inicia con 0000 y se lo transfiere a MAR. Esto quiere decir que la memoria se
ubicará en la primera dirección. Después se saca el contenido de la memoria y se
transfiere a MBR, en ese mismo tiempo de incrementa el PC (0001). Se transfiere el
contenido de MBR a IR para poder decodificar la instrucción y se manda el contenido
de PC hacia MAR para que la memoria se posicione en la siguiente dirección (0001).
Una vez codificada una instrucción la lógica de control se encarga de que el siguiente
dato que se encuentra en la memoria no sea tomado como una instrucción, sino como un
operando mas de la instrucción previamente decodificada. De esta manera podemos
realizar la operación del ejemplo anterior. No importa que nuestra instrucción OPERA
tenga el código 1000 y que el primer operando sea 1000 y el segundo también.

$$Vp V V  

El ciclo de búsqueda consiste un una serie de microoperaciones secuenciales que no
cambian nunca. Esto no ocurre en un ciclo de ejecución ya que para cada instrucción de
nuestro procesador existe una serie de microoperaciones a realizar de acuerdo con la
instrucción deseada.

Lee:

La instrucción Lee saca de la memoria la dirección que se desea leer y la transfiere al


MBR incrementando el PC en el mismo tiempo. Después pasa esa dirección a MAR
para que la memoria se posicione en esa dirección. Se saca el contenido de la dirección
leída hacia MBR y por ultimo se deposita en el registro A inicializando los tiempos para
realizar el ciclo de búsqueda de la siguiente instrucción.

Guarda:

La instrucción Guarda saca de la memoria la dirección en la cual se deberá guardar el


dato en A , lo transfiere al MBR, de ahí se transfiere a MAR para que la memoria se
posicione en esa dirección. Se pasa el dato en A hacia MBR y de ahí se transfiere a la
memoria que ya esta previamente posicionada en la dirección deseada. Al final se
inicializan los tiempos para realizar el ciclo de búsqueda de la siguiente instrucción.

Salta:
En la operación Salta se transfiere de la memoria al MBR la dirección a la cual se quiere
saltar para continuar con el programa. Esta misma dirección se transfiere al PC. Hay que
notar que durante el tiempo tres se incrementa el PC. Esta microoperación no es
necesaria ya que en el siguiente tiempo el mismo contenido de PC será modificado
totalmente. Sin embargo, para simplificar el diseño del circuito de control se agrega en
este tiempo , con esta instrucción.

Opera:

Este es el mas complejo. Primero se pasa de la memoria al MBR el código de operación


que se desea realizar, de ahí se manda hacia el ROP para indicarle a la ALU la
operación a realizar, se pasa de la siguiente dirección al MBR el segundo operando y en
el tiempo seis se realiza la operación deseada transfiriendo el resultado al registro R.

$.V| (V VV


  V V 

Ya tenemos hasta este momento las instrucciones que podrán utilizarse en nuestro
procesador y la secuencia de microoperaciones necesarias para cada una. Ahora llega el
momento de diseñar e implementar el circuito de control que se encargará de enviar
señales adecuadas para llevar a cabo las instrucciones especificadas por el programador.
Existen gran variedad de técnicas para implementar el circuito de control. La mayoría
puede clasificarse en:
· Control cableado
· Control microprogramado.

$.Vp
V   
El control cableado es esencialmente un circuito combinacional. Sus señales lógicas de
entrada se convierten en señales lógicas de control.
V

Fig 19.Diagrama de la unidad de control.

Para cada una de las instrucciones el decodificador enviará una y solo una señal de
instrucción las cuales ya hemos definido anteriormente. De la misma manera el
generador de tiempos enviará una y solo una señal de tiempo. Estas serán las entradas
de nuestra unidad de control. Las salidas son producidas por circuitos combinacionales
simples dentro de la unidad de control.
A cada microoperación le asignaremos una señal de control (X1, X2... Xn) que será la
encargada físicamente de que se realice.

En total tenemos doce señales de control. Para que cada señal sea verdadera (sea uno) es
necesario que varias condiciones se den. Por ejemplo en el caso de MAR ? PC, puede
darse cuando To, T2, y así por el estilo. De esta manera se forman las funciones de
boole para cada una de las señales de control. Estas funciones determinan el circuito
combinacional de control que debe implementarse.
La manera como se use cada una de las señales de control dependerá de los circuitos
integrados que utilicemos. Lo importante es saber que, por ejemplo, la señal X12 debe
hacer que el registro R cargue en paralelo las salidas de la ALU, en donde se realizó la
operación deseada. Todo el circuito de control es un circuito combinacional de varios
componentes electrónicos digitales.
V

Fig 20. Diagrama interno de la unidad de control.

$/V&V 
  
V V  (
Como ya mencioné con anterioridad, el microprocesador es un circuito que ejecuta
instrucciones de manera secuencial. Para lograr esto es necesario una parte de
temporizador dentro del micro. Aunque pareciera sencillo pensar en implementar un
circuito temporizador hay que tener algunas consideraciones con respecto a los
integrados que estemos utilizando. Para nuestro caso, los registros que usaremos
necesitan señales se reloj para poder funcionar. Luego entonces nuestro reloj maestro
debe de proporcionar no solo los tiempos que ingresarán al circuito de control, sino
también las señales de reloj de nuestros integrados. A esto se le llama un circuito
síncrono.
V

Fig 21. Ejemplo de conexión eléctrica del temporizador

Utilizamos un contador 74lLS161 para generar los tiempos por medio de un botón de
tiempo (será manual). Las salidas deberían entrar a un decodificador para que se genere
un a sola señal de tiempo a la vez. Del mismo botón de tiempos saldrá una señal que se
niega y se dirige hacia los relojes de nuestros registro. Se debe negar para que se genere
primero los tiempos que ingresan a la unidad de control.
Otra consideración importante es el uso de compuertas de tres estados para poder
realizar lecturas y escrituras de la memoria con seguridad. Recordemos que el bus de
daos de la memoria es bidireccional. Para poder utilizarlo necesitamos de estas
compuertas de tres estados. Además, hay que notar el uso de unos multiplexores a la
entrada de las direcciones y de los datos. Son colocados porque programaremos la
memoria de manera manual con unos switches tipo DIP. Por lo tanto debemos de
habilitar a la hora de programar las entradas de los switches y una vez terminada la
programación se dejarán habilitadas únicamente las entradas del MAR, para el caso de
las direcciones, y las entradas del MBR, para el caso de los datos. Observa que se usan
otros multiplexores también. Como vimos en el inicio, se usan para poder tener dos
entradas a un mismo integrado.
Fig 22. Conexión de la memoria usando switches para su programación.

Como ya pueden estar imaginando, el diagrama eléctrico completo es enorme. Creo que
con la información proporcionada y siguiendo las consideraciones de diseño, se puede
realizar este microprocesador poco a poco y con mucha paciencia.

.Vp
 

El diseño de microprocesadores se estudiaba en las universidades de ingeniería con
miras a mejorar los diseños existentes. Hoy en día se prefiere enseñar
microprocesadores y arquitectura de computadoras desde el punto de vista económico o
cuantitativo, desde el punto de rendimiento-costo. A mi parecer, no deja de ser
importante aprender las bases principales del diseño de microprocesadores ya que ello
llevará a una mejor comprensión de los lenguajes de programación, segmentación,
computadoras de procesadores paralelos, microcontroladores, etc. Además, poder
diseñar un microprocesador sencillo como el que se desarrolla en este documento, nos
conduce a conocer y comprender uno de los secretos de la electrónica mas hermosos y
enigmáticos. ¿Cómo se procesa la información? ¿Cómo es posible que una computadora
me pueda desplegar imágenes, videos, texto, etc? Todas estas preguntas son el enigma
de las computadoras y los estudiantes de una ingeniería relacionada con la computación
deben de adentrarse, al menos de manera superficial, con las respuestas.

V$V

%&''((()*)* ) ) )' ''+, '+!"#-


)*V

%&''((()  ) '.'.   4 /0. 


 V
VV

ï   
 

| 0  1     

hVV    V12 V

V 2VV  V   V÷  ÷  V12V3  V V2 V  


÷  V  V
V

3 V    V V

VV
V V
  V

 V
V

2 V
VVV
VV2V

V V 2V V2V
V V
 2
 V  V
ww   


  

 
 V

4 ll `     `   l i t  


i i

i  ti
   t  it

i l jl C  


 
i i
it tli

i  ilit

i 

  i

i it  
i i
l 
l
lli

i  i
 
ti    itl  li 
i 
tiit / 

tt
tit  it

i l  i  t t

p   
Ë 2V


V 4 2 V  V V

 
 V


V 
V


V "
V V

 
 V

V #

 
 V
 VV

 
 V   V

V   2 V  V V

 
 VV

V -

 
 V2VV

 
 V
V

Ë  p  
  
 

|i t it
t 
 t í
 
t l   
i

i it   
lliil   
i

i it  
 lj  í t i i
i   
í iit

i i
i li
l   t it 

    li C t


  
ilil i

  i

i it    
i  i l

4 íl  iR Ci  


i
  
i

i it i lit  t  iC Ctl


 l|C 
ti  
  i

i it l  ll i 


complejos. El mainframe IBM System/360 disponía únicamente de tres modos de
direccionamiento; algunos más fueron añadidos posteriormente para el System/390.

Cuando existen solo unos cuantos modos, estos van codificados directamente dentro de
la propia instrucción (Un ejemplo lo podemos encontrar en el IBM/390, y en la mayoría
de los RISC). Sin embargo, cuando hay demasiados modos, a menudo suele reservarse
un campo específico en la propia instrucción, para especificar dicho modo de
direccionamiento. El DEC VAX permitía múltiples operandos en memoria en la
mayoría de sus instrucciones, y reservaba los primeros bits de cada operando para
indicar el modo de direccionamiento de ese operando en particular.

Incluso en computadores con muchos modos de direccionamiento, algunas medidas


realizadas a programas indican que los modos más simples representan cerca del 90% o
más de todos los modos de direccionamiento utilizados. Dado que la mayoría de estas
medidas son obtenidas a partir de códigos de alto nivel generados a partir de
compiladores, nos da una idea de las limitaciones que presentan los compiladores que se
utilizan.

Ë
  

Tenga en cuenta que no existe una forma generalmente aceptada de nombrar a los
distintos modos de direccionamiento. En particular, los distintos autores y fabricantes de
equipos pueden dar nombres diferentes para el modo de hacer frente al mismo, o los
mismos nombres, a los diferentes modos de direccionamiento. Además, un modo de
direccionamiento que en una determinada arquitectura se trata como un modo de
direccionamiento , puede representar la funcionalidad que en otra arquitectura está
cubierto por dos o más modos de direccionamiento.

El término "modo de direccionamiento" está sujeta a interpretaciones diferentes: o bien


"dirección de memoria de modo de cálculo" o "modo de acceso operando". Bajo las
instrucciones de la primera interpretación, que no puede leer o escribir de la memoria a
la memoria (como "añadir literal de registro"), se considerará que no tienen un "modo
de direccionamiento". La segunda interpretación permite para las máquinas tales como
VAX, que utilizan bits de modo operando para permitir un operando literal.Sólo la
primera interpretación se aplica a las instrucciones tales como "carga efectiva de
dirección".

Las instrucciones que aparecen a continuación son meramente representativas a fin de


ilustrar los modos de direccionamiento, y no necesariamente reflejan los mnemónicos
utilizado por cualquier equipo en particular.

Ë
    


V c  V0VVVV VVV VV V V
V*V5 6VV VVVV VV VV  VV VV
7V8V78VV7V8V VVV VV VV78V VV V)V

Supongamos una arquitectura de pila, las operaciones aritméticas no requieren


direccionamiento explícito por lo que se ponen como:
- add

- sub

...

¿Por qué? Porque cuando se opera con dos datos en esta arquitectura se sabe que son los
dos elementos del tope de la pila:

Ejemplo de una pila

1 2 3 4 5 6 <- pila

top() es 1

ntop() es 2

donde top() representa el tope de la pila y ntop() el siguiente al tope de la pila y son
estos argumentos con los que se opera al llamar a una orden en concreto.

Otro ejemplo de este tipo de direccionamiento lo podemos encontrar en la arquitectura


de acumulador (AC) donde siempre hay un parámetro implícito y este es el AC.

Para finalizar y dejar este modo de direccionamiento generalizado para las arquitecturas
más usuales, remarcamos que también podemos encontrarlo en la arquitectura con
registros de próposito general, por ejemplo con órdenes como setc, que pone a 1 el
registro c (acarreo).


V c  V0VV V9V  V VV)V

En este modo el operando es especificado en la instrucción misma. En otras palabras,


una instrucción de modo inmediato tiene un campo de operando en vez de un campo de
dirección. El campo del operando contiene el operando actual que se debe utilizar en
conjunto con la operación especificada en la instrucción. Las instrucciones de modo
inmediato son útiles para inicializar los registros en un valor constante.

Cuando el campo de dirección especifica un registro del procesador, la instrucción se


dice que está en el modo de registro.
ejemplo:MOV A,#17H


V |  V0V VVVVV V VV VVV
VV VV)V

En este modo la dirección efectiva es igual a la parte de dirección de la instrucción. El


operando reside en la memoria y su dirección es dada directamente por el campo de
dirección de la instrucción. En una instrucción de tipo ramificación el campo de
dirección especifica la dirección de la rama actual.

Con este tipo de direccionamiento, la dirección efectiva es contenida en la misma


instrucción, tal como los valores de datos inmediatos que son contenidos en la
instrucción. Un procesador de 16 bits suma la dirección efectiva al contenido del
segmento de datos previamente desplazado en 4 bits para producir la dirección física del
operando.

ejemplo:MOV
A,17H


V c  V0V VVV V V VV6VVV  VV
 VV V* VV)V
ejemplo:MOV
A,@17H


V   V0V VVV V V VV6VVV  VV
 VV )V

V |
  VhVV * VV  V9VV)V

ejemplo:MOV A,R0

V c 
 
  V0V VVVVV V V V
* VVVVV  VV VV V* VV)V

En este modo el campo de la dirección de la instrucción da la dirección en donde la


dirección efectiva se almacena en la memoria. El control localiza la instrucción de la
memoria y utiliza su parte de dirección para accesar la memoria de nuevo para leer una
dirección efectiva. Unos pocos modos de direccionamiento requieren que el campo de
dirección de la instrucción sea sumado al control de un registro especificado en el
procesador. La dirección efectiva en este modo se obtiene del siguiente cálculo:

Dir. efectiva = Dir. de la parte de la instrucción + Contenido del registro del procesador

ejemplo:MOV A,@R0


V |
   VVVV VV VVV

V |
  VhV  V VVV9VVVVVV  VVV)V

Este direccionamiento se basa en las estructuras denominadas Pila(tipo LIFO), las


cuales están marcados por el fondo de la pila y el puntero de pila (*SP), El puntero de
pila apunta a la última posición ocupada. Así, como puntero de direccionamiento
usaremos el SP. El desplazamiento más el valor del SP nos dará la dirección del objeto
al que queramos hacer referencia. En ocasiones, si no existe C. de desplazamiento solo
se trabajara con la cima de la pila. Este tipo de direccionamiento nos aporta flexibilidad
pero por el contrario, es mucho más complejo que otros tipos estudiados más arriba.


V Ê


 
 V0VVV VV V VVV
V VVVVV*  V7V VVV9V
VVV6VVV  8)V6VV V  VV VV$VV
6VV  VV0V70** 8V VV VV VVV
VV V V V7 V**8V  VV9V)V0V$  V
V VVV VV*V*9 VV9VV V  VV
)V

EA = RB+offset

RB = registro base

offset = desplazamiento

-> RB se comporta como una dirección de memoria a la que se le sumará el


desplazamiento


V Ê


 
  V0VVV6VV: V  VVV VV
V VV  V VV V  VV VVVV V
 VVV  VVV$V V VVVV  V  V
VVV )V   VV VVVV )V4V
0VV  V VV VV VVV VV V VV
&V

EA = RI+DM

RI = registro índice

DM = dirección de memoria

-> RI se comporta como un offset


V c



 VhVVV V  VVVVVV
VV  VV V* V &V

EA = RI+RB+DM

-> Las siglas significan lo mismo que en el caso anterior


V Ê



  VVV V V VVV
V VVVV VVV7;86VV*  VV
9VV V VVVV VVVV  6VVV
6VV**V VV$V)V


V c

  V0V VVV V
9VV56V5 V)V4V: V* VV  VV V
 VV VVV V*VVVV V:VV V
&V

-> Indexado con autopreincremento: Incrementa el registro índice primero (se


incrementa un valor, según el tamaño del objeto direccionado) y luego calcula la EA al
igual que el direccionamiento indexado.

-> Indexado con autoposincremento: Calcula la dirección efectiva y después incrementa


esta.

-> Indexado con autopredecremento: Decrementa el registro índice y después calcula la


dirección efectiva.

-> Indexado con autoposdecremento: Calcula la dirección efectica y después


decrementa esta.


V c 

 

   
  VVV VVV;VV
V  VV * VVVVV6V)&V

jmp 0xAB ----> Carga 0xAB en PC


V c 

 

   
   V0V VVV * V
VV* VV  VVVVVV;6VV V/&V

Supongamos que PC vale = 0x0A, si nosotros interpretamos la instrucción jr +03,


saltaremos tres posiciones posteriores a PC (también podría ser -03 y serían posiciones
anteriores). Pero, ¡cuidado! si esa instrucción estaba en la posición 0x0A la dirección de
PC a incrementar será la inmediatamente posterior (ya que PC se incrementa
automáticamente después de leer la instrucción), por lo que quedaría:

PC = 0x0B ---> nuevo PC = 0x0B+0x03 = 0x0E, con lo que el PC quedaría como 0x0E.

Ë   


     
 


V   V4VVV V  VVV97  VV V
 8)V

En este caso, para obtener las direcciones necesitamos: Indicador de página (IP): en un
registro específico o de propósito general de la máquina. Dirreción de la palabra(DP):
en el campo CD de la instrucción.
Así, concatenando ambas partes obtenemos la dirección completa.

h 
 2 En este caso, la memoria se divide en porciones, como en el tipo anterior,
pero en este caso los tamaños son variables. Así, para acceder a ellos se tiene una tabla
de segmentos que contiene la dirección del comienzo y dle final de cada segmento en
memoria.

Usar este tipo de direccionamiento tiene como ventajas que se puede definir segmentos
de tamaño arbitrario. Por otro lado, esta misma ventaja, el fraccionamiento de memoria
es uno de sus problemas.

Ambos modos de direccionamiento facilitan la multiprogramación gracias a la técnica


de la memoria virtual que permite que un proceso no tenga que estar cargado
íntegramente en memoria, si no que se cargan distintas páginas del mismo (o
segmentos). Si se intenta cargar una página o segmento que no se encuentra en la
memoria principal se produce una excepción de falta de página o segmento y se accede
a la memoria para cargar la información requerida en la memoria principal.

Ë 
       

Estos modos fueron usados durante 1950-1980 y ya no están disponibles en los


computadores modernos. Esta lista no es completa, puesto que hubo otros muchos
modos de direccionamiento más, algunos más interesantes y peculiares.


V c 

   

 V
Si la longitd de palabra era mayor que la dirección, la palabra era referenciada por este
direccionamiento indirecto de multinivel, que podía tener una "bandera" para indicar un
ciclo indirecto de memoria. Es necesario tener cuidado para asegurar que una cadena de
direcciones indirectas no se refiera a ella misma , si lo hiciera, se llegaría a un bucle
infinito mientras trata de encontrar la dirección.

El DEC PDP-10 con 18 bits de direccionamiento y palabras de 36 bits permitían este


modo de direccionamiento con la posibilidad de usar un registro principal para cada
fase.


V c 

 

 V

En algunos minicomputadores había normalmente 16 localizaciones especiales de


memoria. Cuando se accedía a memoria, la dirección era automáticamente incrementada
y decrementada después de su uso. Esto hacía muy fácil acceder a memoria en bucles
sin usar ningún registro.


V  
V

La familia Motorola 6800 y la MOS Technology 6502 fueron unas familias de pobres
microprocesadores CISC. Las instrucciones aritméticas y lógicas estaban casi todas
hechas en contra de los valores de memoria. Como resultado, las instrucciones
necesitaban incluir una localización de dos bytes en memoria.

Los diseñadores de estos procesadores incluían un "remedio" llamado direccionamiento


"página cero". Los 256 bytes iniciales de memoria podían ser accedidos usando un byte
o una dirección de memoria indexada. Esto reducía el tiempo de ejecución de las
instrucciones un ciclo de reloj. Almacenando datos en esta "region" los programas
podían ser más pequeños y más rápidos.

Como resultado, la "página cero" fue usada de forma parecía a un archivo de registro.
En muchos sistemas, sin embargo, provocó una gran utilización del área de memoria de
la página cero por el sistema operativo y por los usuarios de programas. Esto limitó su
uso desde que el espacio libre fue limitado.

Ë          

En esta sección vamos a resaltar las diferencias de estos dos técnicas de


direccionamiento y aclarar las ventajas y desventajas que cada una de ellas conlleva.


V |   
  VVV V V VVVV
*V 6VV6V  VV V% V* V VV %V V
VV  V V 9 V VVV0)V


V |   
   V VV V V VVVV% V
* VVVVV VV * V V VV 6VV 6VV
 VVVVV 9 VVV V* )V
Generalmente se usan los direccionamientos relativos ya que, al ejecutar un cierto
programa se cumple la proximidad espacial y temporal, lo que implica que datos que ya
han sido usados o que se encuentran en posiciones cercanas al PC tendrán una alta
probabilidad de ser referenciados próximamente. Otras de las ventajas del
direccionamiento relativo es que permite los códigos reentrantes y cambiar ciertas
direcciones sin tener que volver a compilar el programa. Es también útil porque nunca
se sabe en qué posición de memoria se cargará un determinado programa. Por último
reduce el número de bits para especificar las direcciones y se facilita la referencia a
datos del programa a través de los registros base.

El problema viene cuando queremos referenciar un dato al que no podemos acceder de


forma relativa (p.e porque los registros base no puedan alcanzar dicha posición aun con
el incremento más grande que podamos darle), en este caso se requiere el
direccionamiento absoluto que sí es capaz de acceder, por lo general, a cualquier
dirección de memoria.

MODOS DE DIRECCIONAMIENTO

El campo de operación de una instrucción especifica la operación que se debe realizar.


Ésta debe ser ejecutada sobre algunos datos almacenados en registros del computador o
en palabras de memoria, es decir, sobre los operandos. El modo de direccionamiento
especifica la forma de interpretar la información contenida en cada campo de operando
para localizar, en base a esta información, el operando.

Los ordenadores utilizan técnicas de direccionamiento con los siguientes fines: Dar
versatilidad de programación al usuario proporcionando facilidades tales como ín-
dices, direccionamientos indirectos, etc., esta versatilidad nos servirá para manejar es-
tructuras de datos complejas como vectores, matrices, etc. Reducir el número de bits del
campo de operando.

Al usuario que tiene poca experiencia, la variedad de modos de direccionamiento en un


procesador le puede parecer

excesivamente complicada. Sin embargo, la disponibilidad de di- ferentes esquemas de


direccionamiento le da al programador experimentado exibilidad para escribir
programas que son más eficientes en cuanto a número de instrucciones y tiempo de
ejecución.

Es tal la importancia de los modos de direccionamiento que la potencia de una máquina


se mide tanto por su repertorio de instrucciones como por la variedad de modos de
direcciona- miento que es capaz de admitir.

Definición: Los modos de direccionamiento de un procesador son las diferentes formas


de transformación del campo de operando de la instrucción en la dirección del operando
.En esta definición el término dirección debe interpretarse en su sentido más general de
localización del operando, en cualquier lugar, y no en el sentido más estricto de
dirección de memoria.
ï    ï
V

  V

V V V  


V V V
 
V V 

V V  
V  V V V

 V VV V V V VV V V 
 VV
V  VV V VV
VV 
V VV  V VV
V 

 
 V 

V V  V V
   V V
 
V  
V  V
VVV  V V
 V VVVV
 
VV   V

V   V 



 V 
V V 

 
 V  V V 

 V 
V
V V 

VV  
VV  
V  
  V

VVV
 
V 

 
 V

V V V  

V V  
V  V
  V   V V V V V  V 
V V
V  
VV ! VV
VVVV   V

"V  
V V
 VV#
 
VV
VVVV

 
 V V
V   V V  V   V #
 V 
V $
V  V V




V V 
  V  V V 

 
 V V V V    V
#
 V #


V  V 

V   V  V  V V 

 V  V
  VV ! VV
 
 V%V
VV 
V

V V V
  
V V V V V 

 
 V  V V  
V V V

VV 
V V V V  
VV
 
 VV VV
VV
VV

 
 V VVVV

V




V V V V 

 
 V V V   V  VV 
  V
 V V    
V V V V   V VV
 
V  VV 

V
V  V

VV


VV 
V

VV
   V V V 
VV  V
V

VV  V V 
 V  V%V V VV 
VV
VV


VV
V

"VV 

V 
V V V    
 V  
 V V V 

V

V V

V VVVV   V V V

VV
VVV
 VV  V VV&" VV 
 VV

VV
V
 V#V VV
 
VVVV  V%V"V VV

V
V
V  
V V  V V  
V V #V V V "V  

V V V V 

 
 V
V

"V'V(#)V

VV 
VVV 
VV  V
 
V V
  
 VVVV

 
V   V  V V V V   V V V
 
V V

 
 V  V 

V V 
 VV  VV V
V

V 


VVVV

 
 V V
V VV 
VV 
V
V  V V V V V   V *  V V 

V  V V  
V V
 
V 
V V ! V V V V  +V  V V   
V V 

V  V
V  VV!
V VV


V VV  
V

ï    V

VV V

 V V
 V

 VVVV

 
 VV
   V V % V V V V  V  V V  ,V 
V 
V
 V,%V V V VV  V V 
V  V

V|    


  V

V V V V 


 V
,  V V   V V 

V  V V 
V



V V V
 
V V V

V V V  V , V   
V V
  VVV
V

V V VVVV VV 


VV 
VV 
 V V 
  VV V

 V

V    V VVVV VV 


VV 
V
 V VV
V
 V VV
VV
V

V
 VVV
VVV 

 VV VV   V-   V
 V V    V V V 
V V V
 
 V  V ! V  V V
   V 

 V

 
 V

V

V V  V V  V V % V V V
 
 V V V    V  V
 

VV
V V 
 V V

VV  V V VV
 V V V 
V V 
V V V V V  V  V V 
V V 
V V
% VVV 
 V V
  VVV

V.
 V V VV
VV
 
 V/0$1V%V/2/VVV% VVV   V %V  V


V
 VVV VVV 
 VV
VV
V

V|         V

V V V V V   V V  V 


 V  V V
 
V V  V 

V V
 V VVVV  V 
 VV
V
V   
V V
V
 
V  V V  V ,%V  V   V V V V !
V  V



 V

 VV VV
V V V V  V

%&''((()) )'<=*  >%=>=?@5,A;!?,-(B?C


D>=
>=>*=B- -#E
BV

Вам также может понравиться