Está en la página 1de 41

Unidad 5

Funcionamiento de la CPU
Índice temático Unidad Nº 5 – Funcionamiento de la CPU

5.1. Introducción .................................................................................................. 165


5.2. Evolución de los microprocesadores ............................................................... 165
5.2.1. Los microprocesadores en la actualidad ................................................................ 168
5.3. Arquitectura de la CPU................................................................................... 170
5.3.1. Estructura de la UAL. Formato de las instrucciones .............................................. 171
5.3.2. La Unidad de Control ............................................................................................. 173
5.3.3. Registros de la CPU ................................................................................................ 174
5.4. Lenguajes de programación ........................................................................... 177
5.4.1. Lenguaje de máquina ............................................................................................. 177
5.4.2. Lenguaje Ensamblador (Assembler)....................................................................... 178
5.5. Funcionamiento del microprocesador ............................................................ 179
5.5.1. Tipos de Instrucciones............................................................................................ 180
5.5.2. Procesamiento de una instrucción........................................................................ 184
5.5.3. Ejecución de un programa. Seguimiento de instrucciones .................................... 184
Ciclo de captación de la instrucción.................................................................................. 185
Ciclo de ejecución de la instrucción .................................................................................. 186
Instrucciones Aritméticas : ADD( ), SUB( ), MPL( ), DIV( ) ................................................. 186
Instrucciones de ruptura de secuencia sin retorno: JUMP ............................................... 194
Instrucciones de ruptura de secuencia con retorno: CALL, RET ....................................... 198
Bibliografía ................................................................................................................. 203
Unidad 5
Funcionamiento de la CPU
Esquema de contenidos
Evolución de los
microprocesadores
Estructura de la UAL
Arquitectura de la CPU La Unidad de Control
Registros de la CPU

Funcionamiento Lenguaje de Maquina


de la CPU Lenguajes de
Programación Lenguaje Ensamblador

Tipos de Instrucciones
Funcionamiento del Procesamiento de una instrucción
microprocesador Ejecución de un programa

5.1. Introducción
Se ha visto en la Unidad 1 que una computadora está compuesta
básicamente por una Memoria Principal, una Unidad Central de Proceso y
Periféricos. En la Unidad 3 se describió la Memoria Principal y su relación
con la Unidad Central de Proceso. Esta Unidad se ocupa en detalle de la
Unidad Central de Proceso (CPU).
Pero, ¿cómo está constituida físicamente una CPU? Físicamente, la
CPU es un dispositivo electrónico que controla y dirige el funcionamiento de
todo el sistema y recibe el nombre de microprocesador.
El microprocesador es el corazón de cualquier computadora normal,
ya sea una PC, un servidor o una Laptop. Comercialmente hablando, el
microprocesador puede ser un Pentium 4, un Athlon, un Celeron, un Duron
u otro de las muchas otras marcas y tipos de microprocesadores existentes,
pero todos ellos hacen aproximadamente las mismas cosas en
aproximadamente la misma forma.

5.2. Evolución de los microprocesadores


Un microprocesador (también conocido como CPU o Unidad Central de
Procesamiento) es una máquina de computación completa en sí misma, que
está fabricada sobre un chip.

165
¿Qué es un chip?
Un chip o circuito integrado, es una pastilla de material semiconductor (generalmente silicio o germanio)
pequeña y delgada que contiene circuitos electrónicos con componentes miniaturizados como diodos,
transistores, resistencias, y condensadores. La pastilla se protege con un encapsulado de plástico o
cerámica que posee los conductores metálicos necesarios para la conectar la pastilla en una placa de
circuito impreso.
Existen varios tipos de chips. Entre los más avanzados se encuentran los microprocesadores. Otro
ejemplo de chips son las memorias digitales.
Un chip puede medir aproximadamente 2,5 cm de largo y contener decenas de millones de transistores.
Un microprocesador actual contiene decenas de millones de transistores grabados sobre un chip de
unos pocos milímetros cuadrados.

La Figura 5.1 muestra algunos procesadores de la empresa Intel, hitos


de la evolución constante de los microprocesadores.
El primer microprocesador fue el Intel 4004, introducido en 1971. El
4004 no era muy potente, todo lo que podía hacer era sumar y restar, y
solamente podía procesar 4 bits a la vez, pero era sorprendente que todo
eso estuviera contenido en un solo chip. Antes del 4004, los ingenieros
construían computadoras a partir de conjuntos de chips o a partir de
componentes discretos (transistores conectados uno a la vez). El 4004 fue el
microprocesador de una de las primeras calculadoras electrónicas
portátiles.
El primer microprocesador de 8 bits fue el 8008, desarrollado para su
uso en terminales informáticos.

Figura 5.1 Algunos modelos de


procesadores Intel.

166
En 1974 Intel lanzó el 8080. Este microprocesador de 8 bits se
convirtió en la CPU de la "home computer" o computadora hogareña
(anterior a la PC).
El primer microprocesador que revolucionó el mercado fue el Intel
8088, introducido en 1979 e incorporado a la IBM PC (que recién apareció
alrededor de 1982).
El mercado de la PC fue pasando desde el 8088 al 80286, al 80386, al
80486, al Pentium, al Pentium II, al Pentium III, al Pentium 4 (Ver Tabla
5.1). Todos estos microprocesadores fueron hechos por Intel y todos ellos
son mejoras sobre el diseño básico del 8088. El Pentium 4 puede ejecutar
cualquier segmento de código que corra sobre el original 8088, pero lo hace
aproximadamente 5000 veces más rápido.

Velocidad de
Nombre Fecha Transistores Micrones Ancho de datos MIPS
reloj

8080 1974 6.000 6,0 2 MHz 8 bits 0,64


16 bits
8088 1979 29.000 3,0 5 MHz 0,33
8 bit bus
80286 1982 134.000 1,5 6 MHz 16 bits 1
80386 1985 275.000 1,5 16 MHz 32 bits 5
80486 1989 1.200.000 1,0 25 MHz 32 bits 20
32 bits
Pentium 1993 3.100.000 0,8 60 MHz 100
64 bit bus
32 bits
Pentium II 1997 7.500.000 0,35 233 MHz ~300
64 bit bus
32 bits
Pentium III 1999 9.500.000 0,25 450 MHz ~510
64 bit bus
32 bits
Pentium 4 2000 42.000.000 0,18 1,5 GHz ~1.700
64 bit bus
Tabla 5.1 Tabla comparativa de microprocesadores Intel.

La Tabla 5.1 resume a modo de comparación algunas características


técnicas que ayudarán a comprender las diferencias entre los distintos
procesadores que Intel ha introducido a través de los años. Las
características de microprocesadores que muestra la tabla son:
 Fecha: es el año que el procesador fue introducido por primera vez.
Muchos procesadores son re-introducidos a velocidades de reloj más
altas varios años después de la fecha original de lanzamiento.
 Transistores: es el número de transistores que contiene el chip. Se
puede ver que el número de transistores sobre un solo chip, se eleva
constantemente con el correr de los años.
 Micrones: es el ancho, en micrones (micrómetros), del hilo conductor en
el chip. Para comparar, un cabello humano es de 100 micrones de
espesor. A medida que las dimensiones características en el chip
disminuyen, el número de transistores aumenta.
 Velocidad de reloj: es la máxima velocidad a la que el chip puede
trabajar.
 Ancho de datos: es al ancho de la UAL. Una UAL de 8 bits puede sumar,
restar, multiplicar, etc., dos números de 8 bits, mientras que una UAL
de 32 bits puede manipular números de 32 bits. Una UAL de 8 bits
debería ejecutar 4 instrucciones para sumar 2 números de 32 bits,
mientras que una UAL de 32 bits puede hacer esto en una sola

167
instrucción. En muchos casos, el bus de datos externo es del mismo
ancho que la UAL, pero no siempre. El 8088 tiene una UAL de 16 bits y
un bus de datos de 8 bits, mientras que los modernos Pentium traen
datos de 64 bits de una sola vez para sus UAL de 32 bits.
 MIPS: o "millones de instrucciones por segundo" es una medida grosera
del rendimiento de la CPU. Las CPU modernas pueden hacer muchas
cosas diferentes, por lo que la velocidad expresada en MIPS pierde
mucho significado, pero describe en sentido general, la potencia relativa
de procesamiento que posee una CPU.

En la Tabla 5.1 se puede ver que, en general, existe una relación entre
la velocidad del reloj y los MIPS. También se puede ver una relación entre el
número de transistores y MIPS. Por ejemplo, el 8088 trabaja a 5 MHz pero
solamente ejecuta 0,33 MIPS (alrededor de 1 instrucción cada 15 ciclos de
reloj). Los modernos procesadores, pueden procesar a una velocidad de 2
instrucciones por cada ciclo de reloj. Esta mejora está directamente
relacionada al número de transistores en el chip.

5.2.1. Los microprocesadores en la actualidad


Las dos empresas líderes en la fabricación de microprocesadores para
PC (desktop) en la actualidad son, Intel (Integrated Electronics) y AMD
(Advanced Micro Devices). Poco antes de iniciar la década de los 80, Intel y
AMD firmaron un acuerdo de intercambio de licencias y tecnología, para
convivir en un mercado que no era tan competitivo como el actual. Con los
procesadores 386 y 486, de enorme popularidad, AMD gozó de gran cuota
de mercado, copiando los modelos de Intel y lanzándolos a mejor precio
poco después. En la época de Pentium, Intel dio un gran paso adelante,
patentando el producto completamente para evitar que AMD le copiara.
Si bien no se puede lograr un paralelo exacto entre los tipos de
procesadores de ambas empresas, debido a que las luchas por ganar el
mercado hacen que uno de los productos siempre tenga alguna ventaja
sobre su par, se intenta hacer un resumen comparativo en la Tabla 5.2 y
Tabla 5.3.

Velocidad Caché
Microprocesador Fecha Velocidad de reloj
del bus L2 L3
Pentium 1993 60 MHz 50 MHz 256 KB -
Pentium II 1997 233 MHz 66 MHz 256 KB -
Pentium III 1999 450 MHz 100 MHz 256 KB -
Pentium 4 2000 1,3 GHz a 2,8 GHz 533 MHz 1 MB -
(1)
P4 – HT 2001 2,4 GHz a 3,6 GHz 800 MHz 1 MB -
(2)
P4 HT – EE 2001 3,2 GHz a 3,4 GHz 800 MHz 512 KB 2 MB
P4 Dual 2,4 GHz a 3,6 GHz 800 MHz 1 MB -
Core i3 2,4 GHz a 3,4 GHz 1600 MHz 256 KB 4 MB
Core i5 1,06 GHz a 3,46 GHz 1600 MHz 1 MB
(3)
Core i7 3,2 GHz a 3,46 GHz 6,4 GT/s 6x256 KB 15 MB
(1) Tecnología HT (Hyper Threading) : Permite ejecutar 2 instrucciones al mismo tiempo, a través de software.
(2) Tecnología HT- Extreme Edition
(3) GT/s Giga Transfer por segundo. Nomenclatura aplicada a procesadores multi núcleo.
Tabla 5.2 Microprocesadores Intel.

168
Velocidad del Caché
Microprocesador Fecha Velocidad de reloj
bus L1 L2
K-5 1994 60 MHz
K-6 1998 300 MHz
K6-2 1999 550 MHz
Athlon 2000 1 GHz a 1,4 GHz 266 MHz 128 KB 256 KB
Athlon XP 2001 1,8 GHz a 2,2 GHz 400 MHz 128 KB 512 KB
Athlon 64 2003 2,2 GHz 2000 MHz 128 KB 1 MB
Athlon 64 FX 2003 2,2 GHz 1,6 GHz 128 KB 1 MB
Athlon 64 X2 2005 2,2 GHz 1,6 GHz 512 KB 1 MB

Tabla 5.3 Microprocesadores AMD

Se puede observar que a partir de la generación de los Pentium las


diferencias ya no se establecen solamente por las distintas velocidades del
procesador, sino que entran en juego la velocidad del bus frontal (FSB), y la
cantidad de memoria caché en sus distintos niveles.
Una primera solución al procesamiento multitarea, la presentan los
procesadores Pentium 4 HT. La tecnología "HyperThreading" es una
optimización que engaña al Sistema Operativo para hacerle pensar que hay
dos procesadores instalados, cuando en realidad hay solamente uno,
ejecutando dos instrucciones simultáneamente por software. La solución
real al problema de ejecutar varias tareas simultáneamente son los
procesadores Dual Core o doble núcleo. Estos procesadores (Pentium 4
Dual de Intel y Athlon 64 X2 de AMD), tienen dos núcleos de proceso (CPU)
interconectados que permiten duplicar el desempeño sin aumentar la
frecuencia de reloj.
En la Tabla III, se muestra la familia de procesadores Celeron, versión
económica de los Pentium que Intel saca al mercado para competir con
AMD. A su vez AMD lanza las versiones económicas de Athlon (Tabla IV). En
ambos casos las diferencias de estas versiones más económicas no están en
la velocidad del procesador ni en la del bus frontal, sino en la menor
cantidad de memoria caché que presentan con respecto a Pentium y Athlon
respectivamente.

Velocidad Caché
Microprocesador Fecha Velocidad de reloj
del bus L1 L2 L3

Intel Celeron 1999 1,6 GHz a 2,8 GHz 400 MHz - 128 KB -

AMD Duron 1999 800 MHz a 1,3 GHz 200 MHz 128 KB -

Intel Celeron D 2000 2,4 GHz a 2,93 GHz 533 MHz - 256 KB -

AMD Sempron 2000 1,5 GHz a 2 GHz 333 MHz 128 KB 256 KB

Tabla 5.4 Versiones económicas de microprocesadores AMD e Intel

169
5.3. Arquitectura de la CPU
La CPU está constituida fundamentalmente por la Unidad de Control y
la UAL, pero además debe contar con elementos de memoria para el
almacenamiento temporal de los datos tratados por la CPU. Esa memoria
está constituida por Registros.
La conexión entre los distintos componentes del computador se realiza
mediante buses. Ya se ha definido un bus como un conjunto de caminos
conductores en paralelo, que puede ser compartido por varios dispositivos,
a los fines de la comunicación entre los mismos. Cuando los datos deben
ser transmitidos de un componente a otro, viaja por el bus desde el
componente fuente al de destino, almacenándose temporalmente en
registros.

Recordar: Los registros son elementos de memoria que componen la


CPU para que ésta pueda conservar temporalmente instrucciones o
datos en el curso de su tratamiento.

En la arquitectura básica presentada en la Figura 5.2, se muestra en


primer lugar un Bus Interno de la CPU. Este bus permite la transmisión de
datos entre la Unidad de Control, la Unidad Aritmético-Lógica y otros
registros específicos.

Figura 5.2 Arquitectura básica de la CPU

La Unidad de Control necesita comunicarse además, con la memoria y


los periféricos. Esta comunicación la realiza a través de buses externos, que
conforman el Bus del Sistema. Este bus está constituido por tres grupos
funcionales de líneas denominados:
 Bus de Datos: funciona en conjunción con el bus de direcciones y
sirve para transmitir instrucciones y datos. Es bidireccional, es decir
transmite de la CPU a la memoria y viceversa.
 Bus de Direcciones: son líneas de señales para transmitir las
direcciones de las posiciones de memoria y de los dispositivos
conectados al bus. Puesto que cada línea puede tener dos posibles
estados (0 y 1), con n líneas se pueden especificar 2n direcciones
distintas. Es unidireccional, es decir transmite en una sola dirección:
de la CPU a la memoria.
 Bus de Control: sirve para trasmitir las señales de control que
coordinan el funcionamiento del computador. Por ejemplo, indica a la

170
memoria si se va a acceder para realizar una operación de lectura o
de escritura.
Cuando un dato está preparado para ser transmitido, primero se envía
la dirección de destino por el bus de direcciones, a continuación se envía el
dato por el bus de datos, y todas estas acciones están controladas por
señales que se envían por el bus de control.

5.3.1. Estructura de la UAL. Formato de las instrucciones


Como se explicó en la Unidad 1, la UAL es la unidad encargada de
realizar las operaciones aritméticas y lógicas solicitadas por el programa.
En el caso de tratarse de una operación aritmética, por ejemplo una suma,
la instrucción debería facilitarle a la UAL la siguiente información:
 La clase de operación a realizar, en este caso una suma; es el papel
del código de operación;
 La dirección de la celda de memoria que contiene el primer dato, o
primer operando;
 La dirección de la celda de memoria que contiene el segundo
operando;
 La dirección de la celda de memoria donde quiere almacenarse el
resultado.

De aquí se deduce que el formato de este tipo de instrucciones


(aritméticas), contiene un código y tres direcciones:

Código de Dirección del Dirección del Dirección del


operación 1er operando 2do operando 3er operando

La Figura 5.3a representa la UAL capaz de ejecutar esta operación, la


cual está rodeada de tres registros donde se memorizan los dos operandos y
el resultado. La instrucción de suma necesita por lo tanto, cuatro accesos a
memoria central, que permiten sucesivamente buscar la instrucción,
después el primer operando, después el segundo y por último, almacenar el
resultado. A las máquinas que utilizan este tipo de instrucción se les llama
máquinas de tres direcciones. Existen máquinas de dos direcciones y de
una dirección.

Figura 5.3 (a) Máquina de tres direcciones. (b) Máquina de una dirección

171
En el presente curso se tomará como base una máquina de una
dirección. En este caso la UAL posee un registro particular, denominado
Acumulador. Para realizar una operación, se utiliza el Acumulador para
recibir el primer operando y luego de realizada la operación, el Acumulador
almacena el resultado. Esta característica permite instrucciones aritméticas
de una sola dirección: la del segundo operando.
En la Figura 5.3b, el Acumulador sustituye a los registros R1 y R3 de
la Figura 5.3a. El segundo operando puede almacenarse en el registro de
palabra asociado a la memoria.
Entonces, en una máquina de una dirección, la operación de suma
necesita tres instrucciones, en la siguiente secuencia:
 Cargar el primer operando en el Acumulador;
 Sumar el segundo operando con el contenido del Acumulador. Al
finalizar la operación, el resultado queda almacenado en el Acumulador.
 Almacenar en memoria el contenido del Acumulador, que contiene el
resultado de la operación realizada.

Cada una de estas tres instrucciones comportará un código de


operación y una dirección:

Código de operación Dirección de operando

1 Carga Dirección del 1er operando

2 Adición Dirección del 2do operando

3 Almacenamiento Dirección del resultado

A grandes rasgos, la estructura de la UAL, está constituida por varios


circuitos operadores, tanto aritméticos como lógicos. Estos tienen funciones
específicas, por ejemplo: Sumador (para realizar sumas), Desplazador
(operaciones de desplazamiento), Complementador (cálculo del
complemento), etc. Además, cada función puede tener distintas versiones
según el tipo de datos que procese.
La Figura 5.4 muestra los registros asociados a la UAL. Puede
observarse que además del Acumulador y el registro que almacena el
segundo operando, otro registro que trabaja asociado a la UAL es el Registro
de Estado.

Figura 5.4 Registros asociados a la UAL.

172
Como se verá más adelante, el Registro de Estado refleja en cada uno
de sus bits distintas características del valor almacenado en el Acumulador,
y es consultado por la Unidad de Control para tomar decisiones cuando
ejecuta instrucciones de ruptura de secuencia.

5.3.2. La Unidad de Control


La Unidad de Control es la parte de la CPU que realmente hace que las
cosas ocurran. La Unidad de Control emite órdenes en forma de señales de
control externas a la CPU para producir el intercambio de datos con la
memoria y los módulos de E/S. Estas señales se transmiten a través del
Bus de Control. También emite señales de control internas para transferir
datos entre registros, hacer que la UAL ejecute una función concreta y
regular otras operaciones internas. Estas señales se transmiten a través del
Bus Interno.
El esquema de la Figura 5.5 muestra la estructura interna de la
Unidad de Control. Los componentes de la Unidad de Control son:
 Decodificador: Se encarga de extraer el código de operación de la
instrucción en curso (que está en el Registro de Instrucciones), la
analiza y emite señales necesarias al resto de elementos para su
ejecución a través del secuenciador.
 Reloj: Proporciona una sucesión de pulsos eléctricos o ciclos a
intervalos constantes, que marcan los instantes en que han de comenzar
los distintos pasos de que consta cada instrucción. La cantidad de
pulsos por segundo indica la velocidad de procesamiento de la máquina.
 Secuenciador: También llamado controlador. En este dispositivo se
generan órdenes muy elementales (microórdenes) que, sincronizadas por
los pulsos del reloj, hacen que se vaya ejecutando poco a poco la
instrucción que está cargada en el Registro de Instrucciones.

Figura 5.5 Estructura interna de la Unidad de Control

173
5.3.3. Registros de la CPU
Para poder realizar la ejecución de un programa, es obvio que la CPU
necesita almacenar instrucciones y datos temporalmente mientras una
instrucción está siendo ejecutada. En otras palabras, la CPU necesita una
pequeña memoria. Estos elementos de memoria interna se denominan
registros.
Los registros almacenan datos que la CPU necesita constantemente y
por tal razón se encuentran implementados con la tecnología de memoria
interna de mayor velocidad (SRAM).
Por ejemplo, la CPU debe “recordar” la instrucción que se encuentra
en ejecución, para ello cuenta con un registro especial: el Registro de
Instrucción. Asimismo, para continuar la ejecución del programa cada vez
que finaliza una instrucción, la CPU debe conservar la posición de la
instrucción siguiente; para esta tarea recurre al registro Contador de
Programa. La Figura 5.5 muestra estos dos registros y como veremos a
continuación, la CPU cuenta con otros registros más para su
funcionamiento.
La Figura 5.6 muestra un esquema de la CPU detallando los
principales registros que posee. Cada uno de estos registros se utiliza para
tareas específicas.

Figura 5.6 Registros de la CPU.

174
Clasificación de los registros
a) Según la Unidad con la que se relacionan.
Se puede agrupar a los registros de acuerdo a la Unidad de la CPU con
la que están relacionados o asociados para trabajar. Esta clasificación será
útil al momento de hacer el seguimiento de las instrucciones dentro de la
CPU. Según este criterio, se puede hablar de:
 Registros asociados a la Memoria Principal:
o Registro de Palabra o registro de datos: Este registro es el
encargado de almacenar la información (datos o instrucciones)
que se intercambian con la Memoria Principal a través del bus
de datos. Durante una operación de lectura contiene la
información que proviene de la Memoria; si es una instrucción, la
pasa al registro de instrucciones; si es un dato el intercambio se
produce con el Acumulador, la UAL, o algún registro individual.
Durante una operación de escritura contiene la información que
proviene del Acumulador. Este intercambio dentro de la CPU se
realiza a través del bus interno.
o Registro de Direcciones: Este registro almacena las direcciones de
las celdas de memoria que van a ser accedidas para realizar una
lectura/escritura. Está conectado directamente al bus de
direcciones.
 Registros asociados a la Unidad de Control:
o Registro de Instrucciones: Este registro sirve para contener la
instrucción que es captada por la CPU durante una operación de
lectura.
o Contador de Programa: El contador de programa contiene una
dirección de instrucción. Típicamente, la Unidad Control actualiza
el CP después de cada captación de instrucción de manera que
siempre apunta a la siguiente instrucción a ejecutar. Una
instrucción de bifurcación o salto también modificará el contenido
del CP.
o Puntero a Pila: El registro puntero a pila permite almacenar la
dirección de acceso a la memoria pila. Se verá su funcionamiento
al tratar las instrucciones de ruptura de secuencia.
 Registros asociados a la Unidad Aritmético-lógica:
o Acumulador: La función de este registro ya se ha visto al describir
la UAL de una sola dirección. Se usa para almacenar el primer
operando de una operación aritmética y finalmente se carga con
el resultado de la operación llevada a cabo en la UAL.
o Registro de Estado: Este registro contiene códigos de condición
además de otra información de estado. Los códigos de condición
(también llamados indicadores o flags) son bits cuyos valores son
establecidos por el hardware de la CPU de acuerdo al resultado de
la última operación realizada por la UAL. Es decir que, además de
almacenarse el propio resultado en el registro Acumulador, se
obtiene también los indicadores o flags del resultado obtenido.
Cada indicador se almacena en un bit del Registro de Estado
describiendo cierta condición del resultado (si fue nulo, si fue
positivo, si se produjo desbordamiento). Los indicadores pueden
ser examinados con posterioridad como parte de una condición de
bifurcación condicional.
La Figura 5.7 muestra un ejemplo de Registro de Estado de ocho
bits. La cantidad y significado de los bits del registro no es igual
175
para todos los microprocesadores sino que puede cambiar de un
modelo a otro según los criterios de diseño del fabricante.

Figura 5.7 Ejemplo de Registro de Estado de ocho bits.

- El Bit 0 o C: Es el indicador de acarreo. Es posicionado por


las operaciones aritméticas y de comparación. Este bit es
como si fuera el noveno bit del acumulador.
- El Bit 2 P/V: El significado de este flag depende de la
operación que acaba de realizarse. Sirve como indicador de
desbordamiento de capacidad (overflow) V, en el caso de
una operación aritmética (suma, resta, incremento o
decremento). En el caso de operaciones lógicas o de
desplazamiento, sirve como indicador de paridad P, estos
tipos de operaciones no se ven en el curso.
- El Bit 6 o Z: Señala si el resultado de la última operación
realizada ha sido nulo. En este caso Z=1, si el resultado es
distinto de cero Z=0.
- El Bit 7 o S: Este flag indica el signo del byte contenido en
el Acumulador, es decir toma el valor del bit 7 del byte
contenido en el Acumulador. Por lo tanto S=1 si el
resultado es negativo y S=0 si es positivo.

b) Según la función que cumplen


Desde el punto de vista de la función que cumplen, los registros de la
CPU se pueden clasificar en: Registros de Control y Registros visibles al
usuario.
 Registros de Control: Son los registros utilizados por la Unidad de
Control y por programas privilegiados del sistema para controlar el
funcionamiento de la CPU para la ejecución de programas. La mayor
parte de estos registros no son visibles al usuario. Algunos de ellos
pueden ser visibles a instrucciones de máquina ejecutadas en un modo
de control o de sistema operativo.
Pertenecen a este grupo:
- El Contador de Programa
- El Registro de Dirección
- El Registro de Instrucción
- El Registro de Palabra
- El Registro de Estado
Los cuatro primeros son esenciales para la ejecución de una instrucción
y se usan para la transferencia de datos entre la CPU y la memoria. El
último, el Registro de Estado, es usado por la Unidad de Control para
tomar decisiones en función de operaciones realizadas en la UAL.
 Registros visibles al usuario: Un registro visible al usuario es aquél
que puede ser referenciado por medio del lenguaje máquina que ejecuta
la CPU. Permiten al programador de lenguaje de máquina o ensamblador
minimizar las referencias a memoria principal optimizando el uso de los
registros. A su vez, podemos clasificarlos en:
o Registros de Uso General: almacenan datos o direcciones y
pueden ser asignados por el programador a diversas funciones. A
veces, se usa para contener el operando para cualquier código de

176
operación o puede haber registros específicos para operaciones en
coma flotante. En algunos casos los registros de uso general
pueden ser utilizados para funciones de direccionamiento.
o Registros de Datos: pueden ser usados únicamente para contener
datos y no se pueden emplear en el cálculo de una dirección de
operando. Un ejemplo de este tipo de registro es el Acumulador.
o Registros de Direcciones: almacenan solo direcciones. Pueden ser
en sí registros de uso más o menos general, o pueden estar
dedicados a un modo de direccionamiento particular. El caso más
conocido es el Puntero a Pila.

5.4. Lenguajes de programación

5.4.1. Lenguaje de máquina


Una computadora solamente puede ejecutar un grupo definido y
limitado de órdenes que recibe el nombre de Repertorio o Set de
Instrucciones, Lenguaje de Máquina o Código Absoluto de esa computadora.
Cada fabricante establece el set correspondiente a un modelo de
microprocesador en particular, de modo que ello constituye una
característica de diseño. El número de instrucciones que componen el Set
de Instrucciones es distinto para distintos tipos y familias de procesadores.
Sin embargo existe un grupo básico de operaciones que todos los
procesadores incluyen aunque con características propias para cada una de
ellas. Por ejemplo: Sumar, Comparar, Transferir, etc.
La representación interna de datos en la computadora es binaria,
entonces cada instrucción está codificada en binario pudiendo ser de esta
manera interpretada por los circuitos de la computadora. El lenguaje de
máquina (código binario) es el verdadero lenguaje de la computadora. Todas
las instrucciones del programa deben ser expresadas de esta forma para
que la computadora las pueda entender.
A cada instrucción del Set le corresponde una determinada
configuración de ceros y unos establecida durante el diseño del
microprocesador, con ajuste a un formato determinado. Por ejemplo, en una
instrucción de tres bytes, se puede asignar un byte para el código de
operación y los dos bytes restantes para la dirección del operando.
En el ejemplo se muestra un programa simple, escrito en código
binario para un microprocesador que tiene las características expresadas
anteriormente. El programa suma los dos números en las posiciones de
memoria 0160H y 0161H y guarda la suma en la posición 0162H:

Cod. de la Parte alta de la Parte baja de la


Descripción
operación dirección dirección

0000 0001 0000 0001 0110 0000 Cargar el contenido de la dirección 0160H en el Acumulador.
0000 0101 0000 0001 0110 0001 Sumar el contenido de la dirección 0161H al Acumulador.
0000 0010 0000 0001 0110 0010 Transferir el contenido del Acumulador a la dirección de
memoria 0162H.

Esto es entendible para el microprocesador pero no para el usuario


humano. La primera mejora al respecto consistió en utilizar codificación
hexadecimal.
177
Codificación hexadecimal
Esta forma de representación de las instrucciones es una mejora
respecto al método binario, puesto que abrevia cada grupo binario de 8 bits
a dos dígitos hexadecimales. Veamos ahora el programa precedente
utilizando el código hexadecimal:

Cod. de la Parte alta de la Parte baja de la


Descripción
operación dirección dirección

01 01 60 Cargar el contenido de la dirección 0160H en el Acumulador.


05 01 61 Sumar el contenido de la dirección 0161H al Acumulador.
02 01 62 Transferir el contenido del Acumulador a la dirección de
memoria 0162H.

Esta representación de las instrucciones resulta una mejora desde el


punto de vista de las personas, pero un microprocesador no sería capaz de
interpretar este programa tal como está.

5.4.2. Lenguaje Ensamblador (Assembler)


La programación en lenguaje de máquina es muy engorrosa debido a
que cada instrucción debe ser codificada en ceros y unos difíciles de
recordar. En un principio los programas se escribían así. En aquellos
tiempos, la revisión de un programa significaba a menudo cambiar
direcciones y seguían a las revisiones largas horas destinadas a verificar,
calcular y llevar tablas.
La computadora podía realizar este tipo de trabajo administrativo y
para salvar todo este inconveniente de programar en ceros y unos se
desarrollaron los lenguajes ensambladores. Los lenguajes ensambladores se
basan en mnemónicos fáciles de recordar y la posibilidad para el
programador de asignar nombres simbólicos a las direcciones del
almacenamiento principal, pudiendo referirse tanto a instrucciones como a
datos fácilmente.
Un programa escrito utilizando mnemónicos se llama programa en
lenguaje ensamblador (Assembler). El programa del ejemplo anterior
utilizando lenguaje ensamblador quedaría:

Dirección de Instrucción en
Descripción
memoria principal lenguaje ensamblador

0150 LOAD, (0160H) Cargar el contenido de la dirección 0160H en el Acumulador.


0151 ADD, (0161H) Sumar el contenido de la dirección 0161H al Acumulador.
0152 STORE (0162H) Almacenar el contenido del Acumulador en la dirección de
memoria 0162H.

Se ha agregado en la primera columna la dirección de memoria


principal en la que se encuentra almacenada cada instrucción.
La Figura 5.8 muestra una instrucción en lenguaje ensamblador
identificando los elementos que la componen:

178
Figura 5.8 Estructura interna de la Unidad de Control

Como se puede imaginar, el proceso para trasladar un programa en


lenguaje ensamblador a código binario es bastante complicado. Esto es
cierto, pero el proceso es tan sistemático y repetitivo que puede ser
programado e implementado en el mismo microprocesador.
El programa que acepta un listado en código ensamblador (código
fuente) y obtiene un programa codificado en binario (código objeto) se
denomina llamado programa traductor. Este programa se encarga también
de tareas administrativas tales como calcular posiciones de
almacenamiento para datos e instrucciones y asignar direcciones reales a
símbolos o etiquetas empleados por el programador.
Para el ejemplo anterior, los códigos aparecerían de la siguiente
manera:

Dirección de
Código fuente Código Objeto Descripción
memoria principal

Cargar el contenido de la dirección 0160H en el


0150 LOAD, (0160H) 01 0160
Acumulador.

Sumar el contenido de la dirección 0161H al


0151 ADD, (0161H) 05 0161
Acumulador.

0152 STORE, (0162H) 02 0162 Almacenar el contenido del Acumulador en la


dirección de memoria 0162H.

5.5. Funcionamiento del microprocesador


Para entender cómo trabaja un microprocesador, es de mucha ayuda
mirarlo por dentro y aprender sobre la lógica usada para crearlo. En el
proceso se puede también aprender sobre el Lenguaje Assembler, el
lenguaje nativo de un microprocesador
A los fines de esta asignatura, utilizaremos un modelo simplificado de
CPU (ver Figura 5.9), un microprocesador extremadamente simple, al cual
nos referiremos de aquí en adelante.
Como el objetivo de la unidad no es enseñar Lenguaje Assembler, sino
el de entender el funcionamiento de las distintas partes de la CPU, se usará
un pseudo lenguaje assembler, con instrucciones más sencillas pero que
cumplen funciones similares a las del verdadero Assembler, para que de
este modo se pueda comprender la función que cumplen las distintas
unidades y registros de la CPU, realizando un seguimiento de dichas
instrucciones.

179
Figura 5.9 Esquema de la CPU.

5.5.1. Tipos de Instrucciones


Un microprocesador ejecuta un conjunto de instrucciones de máquina
que le dicen al procesador qué hacer. Basado en las instrucciones, un
microprocesador puede hacer tres tipos de tareas básicas:
 Instrucciones aritméticas: Usando su UAL, un microprocesador puede
realizar operaciones matemáticas como suma, resta, multiplicación y
división. Los modernos microprocesadores contienen procesadores de
punto flotante que pueden realizar operaciones extremadamente
sofisticadas con números muy grandes, en punto flotante.
 Instrucciones de transferencia de datos: Un microprocesador puede
mover datos desde una posición de memoria a otra.
 Instrucciones de ruptura de secuencia: Un microprocesador puede
tomar decisiones y saltar a un nuevo conjunto de instrucciones,
basándose en estas decisiones.
Existen operaciones mucho más complejas que un microprocesador
puede hacer, pero estas son sus tres actividades básicas.

180
Instrucciones de inicio y fin de programa: Estas instrucciones indican el
comienzo y la finalización de un programa respectivamente.
ORG Indica la dirección de memoria donde comienza la ejecución
del programa. Cabe aclarar que solo es una instrucción de
ensamble, es decir se utiliza al momento de armar el Código
Objeto.
END Indica la finalización del programa que se estaba ejecutando.

Instrucciones de transferencia de datos: Las instrucciones de


transferencia de datos permiten copiar, en el operando destino, la
información almacenada en el operando origen, quedando este último sin
modificar. Destino y origen pueden ser registros o posiciones de memoria.
En general, no modifican los bits del Registro de Estado.
LOAD Transfiere el contenido de una posición de memoria a un
registro.
STORE Transfiere el contenido del registro Acumulador a una
posición de memoria. Es la operación inversa a LOAD

Instrucciones Aritméticas: Describen operaciones aritméticas que se


ejecutan en la UAL. La ejecución de estas instrucciones modifica el Registro
de Estado
ADD Suma
SUB Resta
MPL Multiplica
DIV Divide

Las instrucciones de ruptura de secuencia: Permiten alterar la secuencia


normal de ejecución del programa. De forma genérica se dice que son
instrucciones de salto o bifurcación, puesto que, en vez de pasar a la
instrucción que ocupa la posición siguiente, “saltan” a ejecutar
instrucciones que se encuentran en otra posición de memoria.

 Bifurcación incondicional: Producen la bifurcación sin ninguna


condición.
JUMP Modifica el contador de programa (CP) con una nueva
dirección

 Bifurcación condicional: las bifurcaciones condicionales son


instrucciones que tienen dos secuencias distintas:
- Cuando no se cumple la condición de bifurcación, no se
modifica el CP
- Cuando sí se cumple la condición de bifurcación, se modifica el
CP, el cual recibe la dirección de bifurcación.

Las condiciones de bifurcación se establecen sobre el Registro de


Estado de la UAL que almacena ciertas condiciones sobre las operaciones
realizadas con anterioridad. Estas condiciones pueden hacerse sobre un
sólo bit o sobre varios simultáneamente.
Las instrucciones que se usarán son:
JUMP Z Modifica el contador de programa (CP) con una nueva
dirección si el resultado de la operación efectuada es
cero, o sea Z= 1

181
JUMP NZ Modifica el contador de programa (CP) con una nueva
dirección si el resultado de la operación efectuada es
distinta de cero, o sea Z= 0
JUMP P Modifica el contador de programa (CP) con una nueva
dirección si el resultado de la operación efectuada es
positivo, o sea S= 0
JUMP M Modifica el contador de programa (CP) con una nueva
dirección si el resultado de la operación efectuada es
negativo, o sea S=1

 Bifurcación con retorno: Las instrucciones de bifurcación con retorno


salvaguardan la dirección de la instrucción que ocupa la posición
siguiente, en forma previa a realizar el salto. De esta forma, se puede
retornar al punto donde se bifurcó y seguir ejecutando en la dirección
siguiente a la que causó el salto, (ver Figura 5.10).
El uso más frecuente de la bifurcación con retorno es para llamar a
subrutinas (instrucción que suele llamarse CALL o BRANCH).
CALL Modifica el CP, luego de resguardar la dirección de retorno en
memoria pila
RET Retorna la dirección almacenada en memoria pila, al CP.

Figura 5.10 Llamada a subrutina.

Uno de los problemas clásicos de las bifurcaciones con retorno es la


selección del lugar donde se salvaguarda la dirección de retorno. La
solución más usada es el de la memoria pila.
Este método permite llamadas anidadas de cualquier nivel, así como
llamadas recursivas. En efecto, cada nueva llamada va introduciendo en la
pila su dirección de retorno, sin destruir las anteriores. Dado que los
retornos se hacen en orden inverso a las llamadas, la pila siempre tiene en
la cabecera la dirección de retorno adecuada.
El puntero a la cabecera de la pila está almacenado en el Registro
Puntero a Pila (Stack Pointer)

182
Resumen con los distintos tipos de instrucciones

La Tabla 5.5 resume las instrucciones de pseudo assembler con sus


respectivos códigos (hexadecimal) y las características del modelo
simplificado de CPU que se utilizarán en todos los ejercicios y ejemplos de
esta unidad.

Transferencia de datos Ruptura de secuencia Comienzo y final de programa

LOAD 01 H JUMP 07 H ORG (No se ejecuta, solamente se


carga el Contador de Programa con
STORE 02 H JUMP NZ 08 H
la dirección que acompaña a ORG)
Aritméticas JUMP Z 09 H
END 0E H
JUMP P 0A H
ADD 03 H
JUMP M 0B H
SUBTRACT (SUB) 04 H
CALL 0C H
MULTIPLY (MPL) 05 H
RETURN (RET) 0D H
DIVIDE (DIV) 06 H

Arquitectura del procesador:


Bus de datos: 24 bits
Bus de direcciones: 16 bits
Formato de instrucción: 8 bits para código de operación y
16 bits para dirección del operando

Tabla 5.5 Set de instrucciones y arquitectura del modelo simplificado de CPU.

183
5.5.2. Procesamiento de una instrucción
La función básica que realiza una computadora es la ejecución de
programas. El programa a ejecutar está compuesto por un conjunto de
instrucciones almacenadas en memoria. La unidad central de proceso (CPU)
se encarga de leer y ejecutar las instrucciones especificadas en dicho
programa.
Para adquirir una mejor comprensión de esta función y de la forma en
que los principales componentes del computador interactúan para ejecutar
un programa, es preciso considerar con detalle el proceso de ejecución de
un programa. El procesamiento que requiere una instrucción se denomina
ciclo de instrucción.
El punto de vista más sencillo considera el procesamiento de una
instrucción constituido por dos etapas: el ciclo de captación y el de
ejecución (Ver Figura 5.11).
En el ciclo de captación la CPU lee (capta, de “fetch” en inglés) la
instrucción de memoria y en el ciclo de ejecución la ejecuta. La ejecución
del programa consiste en la repetición del proceso de captación y ejecución
de la instrucción. Por supuesto, la ejecución de la instrucción puede a su
vez estar compuesta de cierto número de pasos.
La captación de una instrucción es una operación común a todas las
instrucciones y consiste en la lectura de la instrucción de una posición de
memoria; la ejecución de la instrucción puede suponer varias operaciones y
depende de la naturaleza de la instrucción.
La ejecución del programa se detiene sólo si la máquina se
desconecta, se produce algún error, o se encuentra una instrucción del
programa que detiene al computador.

Figura 5.11 Ciclo básico de la instrucción.

5.5.3. Ejecución de un programa. Seguimiento de instrucciones


La Unidad de Control, más precisamente el secuenciador, genera una
serie de microórdenes o microinstrucciones que llevan a la ejecución de una
instrucción completa. Se ha dicho en el apartado anterior que el
procesamiento de una instrucción supone dos etapas: la de captación y la

184
de ejecución. A continuación se describen las microórdenes que el
secuenciador genera durante ambas etapas.

Ciclo de captación de la instrucción


El procesamiento de cualquier instrucción comienza siempre en el
Contador de Programa. El Sistema Operativo carga el CP con la dirección de
la primera instrucción del programa y después este registro es el encargado
de mantener la secuencia de ejecución.
El ciclo de captación inicia cuando la Unidad de Control ordena la
transferencia del contenido del Contador de Programa (es decir, la dirección
de la instrucción por ejecutar) al Registro de Direcciones, y envía a la
memoria una orden de lectura a través del Bus de Control.
Una vez terminada esta operación de lectura, la palabra leída (la
instrucción) queda disponible en el Registro de Palabra. Entonces, la
Unidad de Control ordena la transferencia del contenido de este registro al
Registro de Instrucciones.
El Registro de Instrucciones está dividido en dos parte: el código de
operación y la dirección del operando (ver apartados 5.3.1, 5.4.2 y Figura
5.9). La Unidad de Control ordena que se copie el código de operación al
decodificador, donde es reconocido dentro del set de instrucciones del
procesador para poder determinar de qué instrucción se trata y actuar en
consecuencia.
El ciclo de captación termina incrementando el Contador de Programa
para direccionar la próxima instrucción.
El siguiente esquema resume los pasos del ciclo de captación
completo. Estos pasos, denominados microinstrucciones, pueden ser
identificados para su seguimiento en la Figura 5.12.

Pasos en el ciclo de captación de una instrucción


Contador de Bus Interno Registro de
1
Programa Direcciones

Registro de Bus de Direc. Memoria


2
Direcciones Principal

Memoria Bus de Datos Registro de


3
Principal (lectura) Palabra

Registro de Bus Interno Registro de


4
Palabra Instrucciones

Registro de Bus Interno


5 Decodificador
Instrucciones (Cod. Op.)

Contador de Contador de
6
Programa Programa +1

185
Figura 5.12 Ciclo de captación de una instrucción.

Ciclo de ejecución de la instrucción


La ejecución de una instrucción determinada supone una serie de
pasos o microinstrucciones que dependen en cada caso del tipo de
instrucción que se trate.

Instrucciones Aritméticas : ADD( ), SUB( ), MPL( ), DIV( )


Una vez analizado el código de operación, la Unidad de Control
reconoce que se trata de una instrucción de procesamiento con captación
previa del operando y que la dirección del operando se encuentra en la zona
de dirección del Registro de Instrucciones.
La Unidad de Control ordena su transferencia al Registro de
Direcciones de memoria y acto seguido ordena una operación de lectura en
la memoria. Al finalizar dicha operación, el operando buscado queda
disponible en el Registro de Palabra. La Unidad de Control emite señales a
los circuitos de la UAL para realizar el procesamiento indicado por el código
de operación y ordena la transferencia del operando a la UAL, cuyos
circuitos llevan a cabo la operación indicada por la Unidad de Control

186
interpretando el operando recibido como segundo operando, ya que el
primer operando es siempre el valor almacenado en el Acumulador.
El resultado de la operación realizada entre el primer y segundo
operando, queda almacenado en el Acumulador. A continuación, la Unidad
de Control ordena la actualización de los flags (bits) del Registro de Estado
que reflejan condiciones del resultado de la operación realizada en la
UAL (ver apartado 5.3.3 – Registros Asociados a la UAL: Registro de Estado).
El siguiente esquema de microinstrucciones resume los pasos del ciclo
de ejecución completo de una instrucción aritmética (sólo cambiará el tipo
de operación aritmética a ejecutar). Estos pasos se muestran para su
seguimiento en la Figura 5.13.

Pasos del ciclo de ejecución de una instrucción aritmética


Bus Interno
Registro de Registro de
7
Instrucciones Direcciones
(Dir. Operando)

Registro de Bus de Direc. Memoria


8
Direcciones Principal

Memoria Bus de Datos Registro de


9
Principal (lectura) Palabra

Bus Interno
Registro de
10 UAL
Palabra
(2do operando)

11 UAL Acumulador

(actualizacion bits) Registro de


12 Acumulador
Estado

187
Figura 5.13 Ciclo de ejecución de una instrucción aritmética (ADD, SUB, MPL o DIV).

Instrucciones de Transferencia de datos: LOAD ( ), STORE ( )


La transferencia de datos que describiremos aquí serán operaciones de
carga y almacenamiento de un dato entre la CPU y la memoria principal.
La carga consiste en leer un dato desde memoria principal y llevarlo a
un registro de la CPU, mientras que el almacenamiento guarda en la
memoria principal un dato que se encuentra en un registro de la CPU; son
operaciones que implican sentidos de transferencia opuestas.
A continuación se describen por separado las instrucciones de carga
(LOAD) y almacenamiento (STORE).

 Carga de un dato – Procesamiento de la instrucción LOAD ( )


Una vez que el decodificador identifica el código de operación,
comienza la ejecución copiando la dirección del operando desde el Registro
de Instrucciones al Registro de Direcciones. Luego, el bus de direcciones
activa la celda de memoria que tiene esa dirección y la Unidad de Control
ordena una lectura del contenido de la celda (operando), que es llevado por
el bus de datos al Registro de Palabra. Desde allí, a través del bus interno,
el operando se almacena el dato en el registro Acumulador. El valor del
acumulador actuará como el primer operando en una operación aritmética.

188
El siguiente esquema muestra los pasos del ciclo de ejecución de la
instrucción LOAD, cuyo seguimiento puede realizarse en la Figura 5.14.

Pasos del procesamiento de la instrucción LOAD ( )


Registro de Bus Interno Registro de
7
Instrucciones (Dir. Operando) Direcciones

Registro de Bus de Direc. Memoria


8
Direcciones Principal

Bus de Datos
Memoria Registro de
9
Principal Palabra
(lectura)

Registro de Bus Interno


10 Acumulador
Palabra

Figura 5.14 Ciclo de ejecución de la instrucción de carga LOAD.

 Almacenamiento de un dato – Procesamiento de la instrucción STORE ( )


El decodificador identifica el código de operación y la dirección del
operando se copia en el Registro de Direcciones. El bus de direcciones
activa la celda de memoria que tiene esa dirección para que pueda ser

189
escrita. La Unidad de Control ordena la operación de escritura en memoria
y el contenido del registro Acumulador es llevado por el bus interno al
Registro de Palabra. Desde allí a través del bus de datos se almacena el
dato en la celda de memoria activada.
A continuación se muestra el esquema de microinstrucciones del ciclo
de ejecución de la instrucción STORE con el respectivo seguimiento en la
Figura 5.15.

Pasos del procesamiento de la instrucción STORE ( )


Registro de Bus Interno Registro de
7
Instrucciones (Dir. Operando) Direcciones

Registro de Bus de Direc. Memoria


8
Direcciones Principal

Bus Interno Registro de


9 Acumulador
Palabra

Bus de Datos
Registro de Memoria
10
Palabra Principal
(escritura)

Figura 5.15 Ciclo de ejecución de la instrucción de almacenamiento STORE.

190
Observación: Para la resolución de los ejemplos y ejercicios
propuestos que se presentan a continuación, se usará el set de
instrucciones y la arquitectura de procesador detallado en la Tabla
5.5.

Ejemplo 5.1 Seguimiento de instrucciones LOAD, ADD y STORE

a) Realice el seguimiento del siguiente programa usando los esquemas y Figuras: 5.13, 5.14 y 5.15
ORG 0107 H Comienzo de programa. En el contador de programa se carga la dirección 0107H.
0107 H LOAD, (025ª H) Carga en el Acumulador el contenido de la celda de memoria de dirección 025AH.
0108 H ADD, (135E H) Suma al Acumulador el contenido de la celda de dirección 135EH.
0109 H STORE, (135F H)Almacena el contenido del Acumulador en la dirección 135FH.
010ª H END Fin del programa

Memoria Principal
Bus de Datos
01 025A H 0107 H
03 135E H 0108 H Bus de Direcciones
02 135F H 0109 H
0E 0000 H 010A H
: :
: :
:
13 D 025A H
Memoria de datos : :
20 D 135E H
50 D 135F H

Nota: Para mayor claridad, se muestran los esquemas de microinstrucciones en las páginas siguientes.

b) Complete el siguiente cuadro, que se corresponde con el seguimiento realizado en el apartado a)

1) Después de ejecutar: 0107 H LOAD, (025A H) Acumulador = 13D

2) Después del ciclo de búsqueda: 0108 H ADD, (0135E H) CP = 0109H


Decodificador = 03H

3) Después de ejecutar: 0108 H ADD, (0135E H) Acumulador = 33D


Reg. Estado: Z = 0
Reg. Estado: S = 0

4) Después del ciclo de búsqueda: 0109 H STORE, (135F H) (135F H)= 50D

5) Después de ejecutar: 0109 H STORE, (135F H) Reg. Palabra = 33D


(025ª H) = 13D
(135F H) = 33D

191
192

LOAD CB CP
RDir
Bus Dir MP= 0107 H Bus Datos
RP
RI U.C. CP=CP+1
0107 H 0107 H 01 025A H 01 025A H 01 025A H 01 025A H 01 Decodif. 0108 H

Dec.
CE 01 025A H 01= LD
Bus Dir MP= 025A H Bus Datos
RDir RP Acum.
025A H 13 13 13

Bus Dir MP= 0108 H Bus Datos RI U.C. CP=CP+1


ADD CB CP
0108 H
RDir
0108 H 03 135E H 03 135E H
RP
03 135E H 03 135E H 03 Decodif. 0109 H

Dec.
CE 03 135E H 03 =ADD
Bus Dir MP= 135E H Bus Datos U.A.L. R.Estado
RDir RP Acum
135E H 20 20 20 13 +20 33 S=0 Z=0

Bus Dir MP= 0109 H Bus Datos RI U.C. CP=CP+1


STORE CB CP RDir RP
0109 H 0109 H 02 135F H 02 135F H 02 135F H 02 135F H 02 Decodif. 010A H

Dec.
CE 02 135F H 02 =ST
Bus Dir MP= 135F H
RDir
Secuenc. 135F H 50 33
Bus de Datos

Acum R.Palabra
33

Bus Dir MP= 010A H Bus Datos RI U.C. CP=CP+1


END CB CP
010A H
RDir
010A H 0E 0000 H 0E 0000 H
RP
0E 0000 H 0E 0000 H 0E Decodif. 010B H

Dec.
CE 0E 0000 H 0E =END CB: Ciclo de Búsqueda
CE: Ciclo de Ejecución

192
Ciclo de Búsqueda Ciclo de Ejecución
Bus Interno (Dir. Operando)
Contador de Registro de Registro de Registro de
1 7
Programa Direcciones Instrucciones Direcciones
0107 H 025A H

Registro de Bus de Direc. Memoria Registro de Bus de Direc. Memoria


2 8
Direcciones 0107 H Principal Direcciones 025A H Principal

Bus de Datos
Memoria Bus de Datos Registro de Memoria Registro de
3 9
Principal (01 025A H) Palabra Principal Palabra
(13)

Registro de Bus Interno Registro de Registro de Bus Interno


4 10 Acum. = 13
Palabra 01 025A H Instrucciones Palabra 13

(Cod. Op.)
Registro de
5 Decodificador
Instrucciones
01

6 CP=0107 H CP+1=0108 H

Bus Interno (Dir. Operando)


Contador de Registro de Registro de Registro de
1 7
Programa Direcciones Instrucciones Direcciones
0108 H 135E H

Registro de Bus de Direc. Memoria Registro de Bus de Direc. Memoria


2 8
Direcciones 0108 H Principal Direcciones 135E H Principal

Memoria Bus de Datos Registro de Memoria Bus de Datos Registro de


3 9
Principal (03 135E H) Palabra Principal (20) Palabra

(2do operando)
Registro de Bus Interno Registro de Registro de
4 10 UAL
Palabra 03 135E H Instrucciones Palabra
20

(Cod. Op.)
Registro de UAL
5 Decodificador 11 Acum. = 33
Instrucciones 13+20
03 33

(actualizacion de Reg de Estado


6 CP=0108 H CP+1=0109 H 12 Acumulador
bits) S=0 Z=0

Bus Interno (Dir. Operando)


Contador de Registro de Registro de Registro de
1 7
Programa Direcciones Instrucciones 135F Direcciones
0109 H

Registro de Bus de Direc. Memoria Registro de Bus de Direc. Memoria


2 8
Direcciones 0109 H Principal Direcciones 135F Principal

Bus Interno
Memoria Bus de Datos Registro de Registro de
3 9 Acumulador
Principal (02 135F H) Palabra Palabra
33

Bus de Datos
Registro de Bus Interno Registro de Registro de MP = 135F H
4 10
Palabra 02 135F H Instrucciones Palabra 50 33
(33)

(Cod. Op.)
Registro de
5 Decodificador
Instrucciones
02

6 CP=0109 H CP+1=010A H

193
Instrucciones de ruptura de secuencia sin retorno: JUMP
Este tipo de instrucción, también llamado instrucción de bifurcación o
de salto, permite modificar el desarrollo secuencial del programa, haciendo
que la instrucción de salto sea seguida no por la instrucción almacenada en
la siguiente dirección, sino por una instrucción cuya dirección viene
suministrada por la propia instrucción de salto. Además este salto puede
ser incondicional o estar sujeto a ciertas condiciones que deben ser
cumplidas para ejecutar el salto (ver apartado 5.5.1).

Salto incondicional – Procesamiento de la instrucción JUMP


Una vez analizado el código de operación, la Unidad de Control
reconoce que se trata de una instrucción de salto incondicional. La
dirección de salto se encuentra en la zona de dirección del Registro de
Instrucciones. La Unidad de Control ordena su transferencia al Contador de
Programa modificando de esta manera la secuencia del programa.

Registro de Bus Interno Contador de


7
Instrucciones (Dir. Operando) Programa

Figura 5.16 Ciclo de ejecución de una instrucción de salto incondicional.

194
Salto condicional – Procesamiento de las instrucciones JUMP M/ P/ Z/ NZ
Cuando el Decodificador identifica el código de operación como una
instrucción de salto condicional, la Unidad de Control verifica la condición
de salto con los bits del Registro de Estado. Si la condición se cumple
(verdadero), la dirección de salto que se encuentra en la zona de dirección
del Registro de Instrucciones se transfiere al Contador de Programa
modificando de esta manera la secuencia del programa. Si la condición no
se cumple (falso), la ejecución de la instrucción termina, el Contador de
Programa no se modifica y la ejecución del programa continúa
normalmente. (ver apartado 5.5.1).

Pasos del ciclo de ejecución de la instrucción de salto condicional


Registro de Bus Interno Unidad de
7
Estado (flags: Z-S) Control

Registro de Verdadero Contador de


8
Instrucciones (Dir. Operando) Programa

Falso
Fin

Figura 5.17 Ciclo de ejecución de una instrucción de salto condicional.

195
Ejemplo 5.2 Seguimiento de instrucciones de salto

a) Realice el seguimiento del siguiente programa usando los esquemas de microinstrucciones. Considere el
Acumulador= 20; Registro de Estado: Z=0 S=0
0106 H …
0107 H JUMP Z, 0109 H Salta a la dirección 0109 H (STORE), si el resultado de la operación es nulo (si Z=1)
0108 H JUMP, 010A H Salto incondicional a la dirección 010A H (END)
0109 H STORE, (135F H Almacena el contenido del Acumulador en la dirección 135F H.
010AH END

Memoria Principal
Bus de Datos
09 0109 H 0107 H
07 010A H 0108 H Bus de Direcciones
02 135F H 0109 H
0E 0000 H 010A H
: :
: :

Memoria de datos 135E H


50 D 135F H

Nota: Para mayor claridad, se muestran los esquemas de microinstrucciones en las páginas siguientes.

b) Complete el siguiente cuadro, que se corresponde con el seguimiento realizado en el apartado a)

1) Después del ciclo de búsqueda: 0107 H JUMP Z, 0109 H CP = 0108H

2) Después de ejecutar: 0107 H JUMP Z, 0109 H CP = 0108H

3) Después del ciclo de búsqueda: 0108 H JUMP, 010A H CP = 0109H

4) Después de ejecutar: 0108 H JUMP, 010A H CP = 010AH

5) Después de ejecutar: 010A H END Acumulador = 20D


(135F H)= 50D

196
Ciclo de Búsqueda Ciclo de Ejecución
Bus Interno Bus Interno
Contador de Registro de Registro de UC
1 7
Programa Direcciones Estado (flag: Z) Z=0
0107 H

Registro de Bus de Direc. Memoria Registro de Verdadero(Z=1) Contador de


2 8
Direcciones 0107 H Principal Instrucciones (Dir. Operando) Programa

Memoria Bus de Datos Registro de Falso (Z=0)


3 Fin
Principal (09 0109 H) Palabra

Registro de Bus Interno Registro de


4
Palabra 09 0109 H Instrucciones

Registro de (Cod. Op.)


5 Decodificador
Instrucciones 09

6 CP=0107 H CP+1=0108 H

Bus Interno (Dir. Operando)


Contador de Registro de Registro de CP= 0109 H
1 7
Programa Direcciones Instrucciones CP=010A H
0108 H 010A H

Registro de Bus de Direc. Memoria


2
Direcciones 0108 H Principal

Memoria Bus de Datos Registro de


3
Principal (07 010A H) Palabra

Registro de Bus Interno Registro de


4
Palabra 07 010A H Instrucciones

(Cod. Op.)
Registro de
5 Decodificador
Instrucciones
07

6 CP=0108 H CP+1=0109 H

Bus Interno
Contador de Registro de
1
Programa Direcciones
010A H

Registro de Bus de Direc. Memoria


2
Direcciones 010A H Principal

Memoria Bus de Datos Registro de


3
Principal (0E 0000 Palabra

Registro de Bus Interno Registro de


4
Palabra 0E 0000H Instrucciones

(Cod. Op.)
Registro de
5 Decodificador
Instrucciones
0E

6 CP=010A H CP+1=010B H

197
Instrucciones de ruptura de secuencia con retorno: CALL, RET
Una instrucción de salto con retorno, se refiere siempre a un llamado
para la ejecución de un programa secundario. En lenguaje Assembler el
llamado se realiza usando la instrucción CALL. Según el lenguaje de
programación que se esté usando, el programa secundario puede ser una
Función, un Procedimiento o una Subrutina. Este programa secundario,
depende del programa principal que lo invocó, y por lo tanto una vez
ejecutado debe devolver el control al programa principal para que continúe
con la secuencia del programa. El retorno al programa principal se hace a
través de la instrucción RETURN (RET), colocada al final de la subrutina. Se
verá a continuación el desarrollo de estas dos instrucciones.

Llamado a Subrutina - Procesamiento de la instrucción CALL


Cuando el decodificador identifica la instrucción CALL, la Unidad de
Control reconoce que se trata de un salto con retorno y que por lo tanto
antes de modificar el Contador de Programa (CP) con la dirección que
acompaña al código de operación, se debe resguardar la dirección de
retorno. Esta dirección está en el CP y debe ser copiada en el lugar de
Memoria Pila que indica el Registro Puntero a Pila (PP). Este registro
siempre apunta a una dirección ocupada, por lo tanto, para realizar una
escritura primero debe apuntar a una dirección que esté libre, para lo cual
se decrementa en una unidad (PP = PP - 1). De este modo, en el caso de
anidamiento de subrutinas (dentro de una subrutina se llama a otra), las
direcciones de retorno se van "apilando" hasta que las instrucciones de
retorno (RET) vacían la pila. El Registro PP es un registro visible al usuario,
por lo tanto puede ser establecido por el programador en un valor
determinado, de no ser así, por defecto este registro toma el valor de la
primera instrucción del programa.
Se inicia la ejecución, entonces, decrementando el Puntero a Pila,
luego esta dirección se copia al Registro de Direcciones para que el bus de
direcciones active la celda correspondiente de la memoria. La Unidad de
Control envía una orden de escritura en memoria (bus de control) y la
dirección del CP se copia en el Registro de Palabra para que el bus de datos
la guarde en la celda indicada por PP. Realizada esta acción, se ejecuta el
salto a la subrutina copiando la dirección que acompaña al código de
operación (Registro de Instrucciones) en el Contador de Programa.

Pasos del procesamiento de la instrucción CALL

7 Puntero Pila PP = PP-1

Bus Interno Registro de


8 Puntero Pila
Direcciones

Registro de Bus de Direc.


9 Memoria Pila
Direcciones

Contador de Bus Interno Registro de


10
Programa Palabra

Bus de Datos
Registro de
11 Memoria Pila
Palabra
(escritura)

Bus Interno
Registro de Contador de
12
Instrucciones Programa
(dir.operando)

198
Figura 5.18 Ciclo de ejecución de una instrucción de salto con retorno (CALL).

Retorno al programa principal -Procesamiento de la instrucción RET


Cuando el decodificador reconoce la instrucción RET, el secuenciador
inicia las acciones de ejecución del retorno. El PP contiene la última
dirección de almacenamiento de la Memoria Pila, por lo tanto la dirección
del PP se copia en el Registro de Direcciones, el bus de direcciones activa la
celda de memoria correspondiente a esa dirección y la Unidad de Control
envía una orden de lectura. El contenido de la celda activada viaja por el
bus de datos hasta el Registro de Palabra y por el bus interno hasta el
Contador de Programa. De este modo, el CP ha quedado cargado con la
dirección de retorno. Por último, el PP debe incrementarse en 1 (PP = PP +
1), para quedar listo para la próxima lectura.

199
Pasos del procesamiento de la instrucción RET
Bus Interno Registro de
7 Puntero Pila
Direcciones

Registro de Bus de Direc.


8 Memoria Pila
Direcciones

Bus Datos
Registro de
9 Memoria Pila
Palabra
(lectura)

Bus Interno
Registro de Contador de
10
Palabra Programa

11 Puntero Pila PP = PP+1

Figura 5.19 Ciclo de ejecución de una instrucción de retorno (RET).

200
Ejemplo 5.3 Seguimiento de instrucciones de salto con retorno.

a) Realice el seguimiento del siguiente programa usando los esquemas de microinstrucciones. Complete el
cuadro correspondiente a la memoria de datos e instrucciones. Considere el Acumulador = 20 y el Puntero
Pila = 0100 H.
0106 H …
0107 H CALL, 0209 H Salta a la dirección 0209 H para ejecutar la subrutina, después de guardar 0108 H
0108 H END Fin del programa principal.
: :
0209 H STORE, (035B H) Almacena el contenido del acumulador en la dirección 035B H.
020A H RET Retorna al programa principal, a la dirección 0108 H.

Memoria Principal
00FE H
Bus de Datos 00FF H Memoria Pila
0100 H
: :
0C 0209 H 0107 H
0E 0000 H 0108 H Bus de Direcciones
: :
: :
02 035B H 0209 H
0D 0000 H 020A H
Memoria de datos : :
13 D 035B H

Nota: Para mayor claridad, se muestran los esquemas de microinstrucciones en la página siguiente.

b) Complete el siguiente cuadro, que se corresponde con el seguimiento realizado en el apartado a)

1) Después del ciclo de búsqueda: 0107 H CALL 0209 H CP = 0108 H


PP = 0100 H

2) Después de ejecutar: 0107 H CALL 0209 H CP = 0209 H


PP = 00FF H

3) Después de ejecutar: 0209 H STORE, (035B H) Reg. Palabra = 20D


(035B H) = 20D

4) Después de ejecutar: 020A H RET CP = 0108 H


PP = 0100 H

201
Ciclo de Búsqueda Ciclo de Ejecución
Bus Interno
Contador de Registro de
1 7 PP = 0100 H PP-1= 00FF H
Programa Direcciones
0107 H

Registro de Bus de Direc. Memoria Bus Interno Registro de


2 8 Puntero Pila
Direcciones 0107H Principal 00FF H Direcciones

Memoria Bus de Datos Registro de Registro de Bus de Direc.


3 9 Memoria Pila
Principal (0C 0209 H) Palabra Direcciones 00FF H

Bus Interno Bus Interno


Registro de Registro de Contador de Registro de
4 10
Palabra 0C 0209 H Instrucciones Programa Palabra
0108 H

(Cod. Op.) Bus de Datos


Registro de Registro de
Decodificador 11 Memoria Pila
5 Instrucciones Palabra
0C 0108 H

Bus Interno
Registro de CP = 0108 H
6 CP = 0107 H CP+1=0108 H 12-
Instrucciones CP = 0209 H
0209 H

Bus Interno (Dir. Operando)


Contador de Registro de Registro de Registro de
1 7
Programa Direcciones Instrucciones 035B H Direcciones
0209 H

Registro de Bus de Direc. Memoria Registro de Bus de Direc. Memoria


2 8
Direcciones 0209 H Principal Direcciones 035B H Principal

Bus de Datos Bus Interno


Memoria Registro de Registro de
3 9 Acumulador
Principal (02 035B H) Palabra Palabra
20

Bus de Datos MP = 035B


Registro de Bus Interno Registro de Registro de
4 10
Palabra 02 035B H Instrucciones Palabra 13 20
20

Registro de (Cod. Op.)


5 Decodificador
Instrucciones 02

6 CP = 0209 H CP+1=020A H

Bus Interno Bus Interno


Contador de Registro de Registro de
1 7 Puntero Pila
Programa Direcciones 00FF H Direcciones
020A H

Bus de Direc. Bus de Direc.


Registro de Memoria Registro de
2 8 Memoria Pila
Direcciones 020A H Principal Direcciones
00FF H

Bus de Datos Bus Datos


Memoria Registro de Registro de
3 9 Memoria Pila
Principal (0D 0000 H) Palabra Palabra
0108 H

Registro de Bus Interno Registro de Registro de Bus Interno CP = 020B H


4 10
Palabra 0D 0000 H Instrucciones Palabra 0108 H CP = 0108 H

Registro de (Cod. Op.)


5 Decodificador 11 PP = 00FF H PP+1 = 0100 H
Instrucciones 0D

6 CP = 020A H CP+1= 020BH

202
Bibliografía
JEAN-PIERRE MEINADIER. "Estructura y Funcionamiento de las
Computadoras Digitales"
WILLIAM STALLING. "Organización y Arquitectura de Computadores".
PEDRO DE MIGUEL ANASAGASTI. "Fundamento de los Computadores"
MARIO GINZBURG. "Operación Programación de Computadoras"

Revistas
Users #174- "Procesadores"- Adrián Mansilla

Fuentes webs:
http://www.howstuffworks.com - "How Microprocessors Work".
Marshall Brain
http://www.portalmundos.com / mundoinformatica / hardware -
"AMD vs. Intel: Pequeña historia de los procesadores". Sergio de
los Santos
http://www.intel.com
http://www.amd.com

203

También podría gustarte