Subido por René Zahorí Torres Becerra

2 Unidad II - Apuntes

Anuncio
DEPARTAMENTO DE SISTEMAS Y COORDINACIÓN
DOCENTE: ING. ROSEL MUÑOZ LÓPEZ.
MATERIA: ARQUITECTURA DE COMPUTADORAS
UNIDA II:
ALUMNOS:
MÉRIDA CORTES SERGIO JAIR
DE LA CRUZ CUETO ABRAHAM
MOLINA HERRERA EDUARDO
NÚMERO DE CONTROL:
13510694
13510643
13510696
-TAPACHULA CHIAPAS, MÉXICO A 19 DE OCTUBRE DEL 2015-
“PERIODO: AGOSTO-DICIEMBRE 2015”
Índice
Introducción ....................................................................................................... 3
2.1.- Organización del procesador ................................................................... 4
Figura 1: visión simplificada de un procesador .............................................. 5
2.2. Estructura de registros .............................................................................. 6
Figura 2: Clasificación de los registros de la CPU ........................................ 8
Figura 3: puntero de Instrucción ...................................................................... 9
2.2.1. Registros visibles para el usuario ........................................................ 10
Figura 4: Registros de uso general ................................................................ 11
2.2.2. Registros de Control y de Estado ........................................................ 12
Figura 5: indicadores de la ALU ............................¡Error! Marcador no definido.
2.2.3.- Ejemplos de organización de registros de CPU reales ..................... 14
Las Figuras 6: (a) y (b)..................................................................................... 14
En la Figura 6: (c) ....................................................¡Error! Marcador no definido.
2.3. El ciclo de instrucción .............................................................................. 16
Figura 7. Ciclo de Instrucción......................................................................... 17
Figura 8. Búsqueda ......................................................................................... 18
2.3.1 ciclo fetch-decode-execute .................................................................... 19
Figura 9. Ciclo fetch-decode-execute ............................................................ 20
2.3.2. Segmentación de instrucciones ........................................................... 21
Figura 10.- segmentación de instrucciones .................................................. 21
2.3.3.- Conjunto de instrucciones: Características y Funciones ................. 22
2.3.4.- Modos de direccionamiento y formatos ............................................. 23
2.4.- Casos de estudios de CPU reales .......................................................... 27
Figura 11: Arquitectura de los Registros....................................................... 28
Conclusión ....................................................................................................... 30
Bibliografía ....................................................................................................... 31
Introducción
En su forma más simple, un sistema de computadora cuenta con una unidad que
ejecuta instrucciones de programas. Esta unidad se comunica con otros
subsistemas dentro de la computadora, y a menudo controla su operación. Debido
al papel central de tal unidad se conoce como unidad central de procesamiento, o
CPU (Central processing unit). Dentro de muchas computadoras, un subsistema
como una unidad de entrada, o un dispositivo de almacenamiento masivo, puede
incorporar una unidad de procesamiento propia. Tal unidad de procesamiento,
aunque es central para su propio subsistema, resulta claro que no es "central" para
el sistema de computadora en su conjunto. Sin embargo, los principios del diseño y
operación de una CPU son independientes de su posición en un sistema de
computadora. Este trabajo estará dedicado a la organización del hardware que
permite a una CPU realizar su función principal: traer instrucciones desde la
memoria y ejecutarlas.
De igual manera en este documento se verá; La secuencia de instrucciones
resultante es un programa en lenguaje de máquina que representa al algoritmo en
cuestión. El mismo enfoque general se utiliza para permitir a la computadora realizar
funciones especificadas por instrucciones individuales de máquina. Esto es, cada
una de estas instrucciones se ejecuta realizando una secuencia de operaciones más
rudimentarias. Estas operaciones, y los medios por los cuales se generan, serán el
tema principal de análisis en este trabajo.
2.1.- Organización del procesador
La Unidad de Procesamiento (CPU) controla el funcionamiento del computador y
lleva a cabo sus funciones de procesamiento de datos. Frecuentemente se le llama
procesador. Un procesador, incluye tanto registros visibles por el usuario como
registros de control/estado. Los registros visibles por el usuario pueden ser de uso
general o tener una utilidad especial, mientras que los registros de control y estado
se usan para controlar el funcionamiento del procesador, un claro ejemplo es el
contador de programa.
Lleva a cabo una gran variedad de:
• Cálculos
• Comparaciones numéricas
• Transferencias de datos como respuesta a las peticiones de los programas
que están siendo ejecutados en memoria.
La CPU controla las operaciones básicas del ordenador enviando y recibiendo
señales de control, direcciones de memoria y datos de un lugar a otro de la
computadora a través de un grupo de canales llamados BUS.
La Unidad Central de Proceso está constituida internamente por:
• La Unidad de Control
• Unidad Aritmético-Lógica
Unidad Aritmético-Lógica (ALU)
Recibe los datos sobre los que efectúa operaciones de cálculo y comparaciones.
Toma decisiones lógicas (determina si una afirmación es correcta o falsa mediante
reglas del algebra de Boole) y devuelve luego el resultado. Todo ello bajo
supervisión de la unidad de control.
La Unidad de Control
La unidad de control le indica al resto del sistema como llevar a cabo las
instrucciones de un programa. Comanda las señales electrónicas entre la memoria
y la unidad aritmético-lógica, y entre el CPU y los dispositivos de entrada y salida.
Para ejecutar cualquier programa, cada comando del mismo se desglosa en
instrucciones.
Los procesadores utilizan la segmentación de instrucciones para acelerar la
ejecución. La segmentación de cauce se puede dividir en ciclo de instrucción en
varias etapas separadas que operan secuencialmente, tales como la captación de
instrucción, decodificación de instrucción, cálculo de direcciones de operando,
ejecución de instrucción y estructura del operando resultado.
A continuación se muestra cómo se organiza un procesador, para esto se tiene que
considerar los siguientes requisitos:
Captar instrucciones: el procesador lee una instrucción de memoria (registro,
cache o memoria principal).
Interpretar instrucción: la instrucción se codifica para determinar qué acción es
necesario.
Captar datos: la ejecución de una instrucción puede exigir leer datos de memoria
o de un módulo de E/S.
Procesar datos: la ejecución de una instrucción puede exigir llevar a cabo alguna
operación aritmética o lógica con los datos.
Escribir datos: los resultados de una ejecución pueden exigir escribir datos en la
memoria o en el módulo de E/S.
Para hacer estas cosas, el procesador necesita almacenar instrucciones y datos
temporalmente mientras una instrucción está ejecutándose, en otras palabras el
procesador necesita una pequeña memoria interna, también llamados registros.
En esta figura se muestra una visión simplificada de un procesador, que indica su
conexión con el resto de sistema, a través del bus del sistema. La ALU lleva a cabo
el verdadero cálculo o procesamiento de datos.
La unidad de control controla la transferencia de datos e instrucciones así a dentro
y así afuera del procesador, y el funcionamiento de la ALU.
Además, la figura muestra una memoria interna mínima, que consta de un conjunto
de posiciones de almacenamiento llamadas registros.
Figura 1: visión simplificada de un procesador
En esta figura se indican los caminos de transferencia de datos y de la lógica de
control, que incluye un elemento con el rotulo bus interno del procesador. También
se muestran los elementos básicos típicos de la ALU.
Hay que observar la similitud entre la estructura interna del computador en su
totalidad y la estructura interna del procesador. En ambos casos hay una pequeña
colección de elementos principales (computador: procesador, E/S, memoria;
procesador: unidad de control, ALU, registros) conectados por caminos de datos.
2.2. Estructura de registros
¿Qué son los registros del CPU?
Se emplean para controlar las instrucciones en ejecución, manejar direccionamiento
de memoria y propiciar la capacidad aritmética.
Los registros vienen de tres tipos: datos, direcciones e índice, que tiene lugar en
casi todos los aspectos de la operación del CPU. El tamaño de un registro depende
del CPU; los más simples tienen registros que aceptan 8 o 16 bits de datos y los
más complejos tienen registros de 32, 48 o 64 bits.
Clasificación de los Registros
Registro de datos: Un CPU puede funcionar con datos en uno de tres modos: entre
dos registros, entre registros y una ubicación de Memoria de acceso al azar (RAM Random-Access Memory) y entre dos ubicaciones RAM. Como el CPU está
conectado directamente a los registros, las operaciones que implican dos registros
son las más rápidas; las que se dan entre ubicaciones RAM son las más lentas. Es
decir, junta dos registros, añade un registro a una ubicación RAM, o añade dos
ubicaciones RAM.
Registro de direcciones: Para que un CPU pueda almacenar y recuperar datos en
RAM, debe tener la dirección de la memoria de la información. Esas operaciones
que implican RAM usan registros de dirección de memoria. EL CPU no realiza
aritmética en estos registros; en cambio, los usa para ubicar datos que necesita.
Registro de índice: Un CPU no puede hacer matemáticas en registros de datos,
aunque puede hacerlo indirectamente con un registro de índice. Éste trabaja con los
registros de datos, permitiendo a un programa procesar hilos de información
eficazmente.
Registros de segmento: Un registro de segmento tiene 16 bits de longitud y facilita
un área de memoria para direccionamiento conocida como segmento actual.
Registro Cs: el dos almacena la dirección inicial del segmento de código de un
programa en el registro CS. Indica la dirección de una instrucción que es buscada
para su ejecución.
Registro Ds: genera una referencia a la localidad de un byte específico en el
segmento de datos.
Registro SS: permite la colocación en memoria de una pila, para almacenamiento
temporal de dirección y datos.
Registro ES: se utiliza para algunas operaciones con cadenas de caracteres se
utiliza para el manejo de direccionamiento de memoria.
Registros de propósito general: Los registros de propósito general son el AX, BX,
CX, y DX, de 16 bits. Cada uno de ellos se divide en dos registros de 8 bits, llamados
AH y AL, BH y BL, CH y CL, y, DH y DL, H significando High (alto) y L significando
Low (bajo), indicando la parte alta o la parte baja del registro correspondiente de 16
bits.
Registro AX: El registro AX es el registro acumulador, es utilizado para operaciones
que implican entrada/salida, y multiplicación y división (estas dos últimas en
conjunto con el registro DX).
Registro BX: El registro BX es el registro base, y es el único registro de propósito
general que puede ser un índice para direccionamiento indexado.
Registro CX: El registro CX es conocido como el registro contador. Puede contener
un valor para controlar el número de veces que un ciclo se repite o un valor para
corrimiento de bits.
Registro DX: El registro DX es el registro de datos. En algunas operaciones se
indica mediante este registro el número de puerto de entrada/salida, y en las
operaciones de multiplicación y división de 16 bits se utiliza junto con el acumulador
AX.
Registros de apuntadores: Los registros SP (apuntador de pila) y BP (apuntador
base) están asociados con el registro SS y permiten al sistema acceder a datos en
el segmento de la pila.
Registro SP: El apuntador de pila de 16 bits está asociado con el segmento SS y
proporciona un valor de desplazamiento que se refiere a la palabra actual que está
siendo procesada en la pila.
Registro BP: El apuntador base de 16 bits facilita la referencia de parámetros
dentro de la pila.
Figura 2: Clasificación de los registros de la CPU
Registros de banderas: Es un registro de 16 bits, de los cuales nueve sirven para
indicar el estado actual de la máquina y el resultado del procesamiento.
Los bits de las banderas son las siguientes:
✓ OF (overflow, desbordamiento): Indica desbordamiento del bit de mayor
orden después de una operación aritmética de números con signo (1=existe
overflow; 0=no existe overflow). Para operaciones sin signo, no se toma en
cuenta esta bandera.
✓ DF (dirección): Controla la selección de incremento o decremento de los
registros SI y DI en las operaciones con cadenas de caracteres
(1=decremento automático; 0=incremento). La bandera DF se controla con
las instrucciones STD y CLD.
✓ IF (interrupción): Controla el disparo de las interrupciones (1=habilita las
interrupciones; 0=deshabilita las interrupciones). La interrupción no
enmascarable es la única que no puede ser bloqueada por esta bandera. El
estado de la bandera IF se controla con las instrucciones STI y CLI.
✓ TF (trampa): Permite la operación del procesador en modo de depuración
(paso a paso).
✓ SF (signo): Contiene el signo resultante de una operación aritmética
(0=positivo; 1=negativo).
✓ ZF (cero): Indica el resultado de una operación aritmética o de comparación
(0=resultado diferente de cero; 1=resultado igual a cero).
✓ AF (acarreo auxiliar): Contiene el acarreo del bit 3. Esta bandera se prueba
con las instrucciones DAA y DAS para ajustar el valor de AL después de una
suma o resta BCD.
✓ PF (paridad): Indica si el número de bits 1, del byte menos significativos de
una operación, es par (0=número de bits 1 es impar; 1=número de bits 1 es
par).
✓ CF (acarreo): Contiene el acarreo del bit de mayor orden después de una
operación aritmética; también almacena el contenido del último bit en una
operación de desplazamiento o de rotación.
Registro de punteros de instrucción: El registro IP de 16 bits contiene el
desplazamiento de dirección de la siguiente instrucción que se ejecuta. El IP está
asociado con el registro CS en el sentido de que el IP indica la instrucción actual
dentro del segmento de código que se está ejecutando actualmente en la memoria.
Figura 3: puntero de Instrucción
Un computador emplea una jerarquía de memoria. En los niveles más altos de la
jerarquía, la memoria es más rápida, más pequeña y más cara (por bit). Dentro de
la CPU hay un conjunto de registros que funciona como un nivel de memoria, por
encima de la memoria principal y de la caché en la jerarquía. Los registros de la
CPU son de dos tipos:
•
Registros visibles para el usuario: Permiten al programador de lenguaje
máquina o ensamblador, minimizar las referencias a memoria principal
cuando optimiza el uso de registros.
•
Registros de control y de estado: Son utilizados por la unidad de control
para controlar el funcionamiento de la CPU, y por programas privilegiados
del sistema operativo para controlar la ejecución de programas. No hay una
separación bien definida de registros dentro de estas dos categorías. Por
ejemplo, en algunas máquinas el contador de programa es visible para el
usuario (por ejemplo, en el VAX), pero en muchas no lo es.
2.2.1. Registros visibles para el usuario
Un registro visible para el usuario es uno que puede ser referenciado por medio del
lenguaje máquina que ejecuta la CPU. Podemos clasificarlos en las siguientes
categorías:
•
Uso general: Pueden ser asignados por el programador a diversas
funciones. A veces, su uso dentro del repertorio de instrucciones es ortogonal
a la operación. Es decir, cualquier registro de uso general puede contener el
operando para cualquier código de operación. Esto proporciona una
utilización de registros de uso general auténtico. Con frecuencia, sin
embargo, existen restricciones.
•
Datos: Pueden usarse únicamente para contener datos y no se pueden
emplear en el cálculo de la dirección de un operando.
•
Direcciones: Pueden ser de uso más O menos general, o pueden estar
dedicados a un modo de direccionamiento particular.
•
Códigos de condición: (también llamados indicadores o «flags»), Son
bits fijados por el hardware del procesador como resultado de alguna
operación. Por ejemplo, una operación aritmética puede producir un
resultado positivo, negativo, nulo o con desbordamiento. Además de
almacenarse el propio resultado en un registro o en la memoria, se obtiene
también un código de condición.
Los registros de uso general pueden ser asignados por el programador a diversas
funciones. A veces, su uso dentro del repertorio de instrucciones depende de la
operación. Es decir, cualquier registro de uso general puede contener el operando
para cualquier código de operación. Esto proporciona una utilización de registros de
auténtico uso general. Con frecuencia, sin embargo, existen restricciones.
Por ejemplo, puede haber registros específicos para operaciones en coma flotante
y operaciones de pila. En algunos casos, los registros de uso general pueden ser
utilizados para funciones de direccionamiento (este tema será visto más adelante
en esta asignatura). En otros casos, hay una separación parcial o total entre
registros de datos y registros de direcciones. Los registros de datos pueden usarse
únicamente para contener datos, y no se pueden emplear en el cálculo de una
dirección de operando. Los registros de dirección pueden ser de uso más o menos
generales, o pueden estar dedicados a un modo de direccionamiento particular.
Entre otros, se pueden citar los siguientes ejemplos:
A. Punteros de segmento:
En una máquina con direccionamiento segmentado un registro de segmento
contiene la dirección de la base del segmento. Puede haber múltiples
registros: por ejemplo, uno para el sistema operativo y otro para el proceso
actual.
B. Registros índices:
Se usan para direccionamiento indexado, y pueden ser auto indexado.
C. Puntero de pila:
Si existe direccionamiento a pila visible al usuario, la pila está normalmente
en memoria, y hay un registro dedicado que apunta a la cabecera de ésta.
Esto permite un direccionamiento implícito; es decir, apilar (“push”), desapilar
(“pop”), y otras instrucciones dela pila que no necesitan contener un
operando explícito referente a ella. Hay aquí varias cuestiones de diseño a
estudiar. Una importante, es si usar registros de uso Completamente general
o si especializar su uso.
D. Con el uso de registros especializados:
Generalmente puede quedar implícito en el código de operación a qué tipo
de registro se refiere un determinado campo de operando.
Figura 4: Registros de uso general
El campo de operando sólo debe identificar uno de entre un conjunto de registros
especializados, en lugar de uno de entre todos los registros, lo cual ahorra bits. Por
otra parte, esta especialización limita la flexibilidad del programador.
Este problema de diseño, pero, como se mencionó, la tendencia parece hacia el uso
de registros especializados. Otro problema de diseño es el número de registros de
uso general o de datos más direcciones que tienen que incluirse. De nuevo, esto
afecta al diseño del repertorio de instrucciones, ya que más registros requieren más
bits para el campo de operando, parece óptimo alrededor de entre 8 y 32 registros.
Menos registros se traducen en más referencias a memoria; más registros no
reducen notablemente las referencias a memoria. Sin embargo, una nueva
aproximación, que saca partido al uso de cientos de registros, se manifiesta en
algunos sistemas RISC. Por último, está la cuestión de la longitud de los registros.
Los registros que han de contener direcciones, han de ser lo suficientemente
grandes como para albergar la dirección más grande. Los registros de datos deben
ser capaces de contener valores de la mayoría de tipos de datos. Algunas máquinas
permiten que dos registros contiguos sean usados como uno solo para contener
valores de doble longitud. Una última categoría de registros, que es al menos
parcialmente visible al usuario, contiene códigos de condición (también llamados
“indicadores” o “flags”). Los códigos de condición son bits fijados por el hardware de
la CPU como resultado de alguna operación. Por ejemplo, una operación aritmética
puede producir un resultado positivo, negativo, nulo, o con desbordamiento.
Además de almacenarse el propio resultado en un registro o en la memoria, se
obtiene también un código de condición. El código puede ser examinado con
posterioridad, como parte de una operación de bifurcación condicional.
Los bits de códigos de condición se reúnen en uno o más registros. Normalmente,
forman parte de un registro de control. Por lo general, las instrucciones de máquina
permiten que estos bits sean leídos por referencia implícita, pero no pueden ser
alterados por el programador. En algunas máquinas, una llamada a una subrutina
dará lugar a la salvaguarda automática de todos los registros visibles por el usuario,
que serán restablecidos en el retorno de la subrutina. La CPU lleva acabo la
salvaguarda y restablecimiento como parte de la ejecución de las instrucciones de
llamada y retorno, respectivamente. Esto permite a cada subrutina usar
independientemente los registros visibles por el usuario.
En otras máquinas, es responsabilidad del programador guardar los contenidos de
losregistros visibles para el programador relevantes, antes de la llamada a la
subrutina, teniendo que incluir en el programa instrucciones para este fin.
2.2.2. Registros de Control y de Estado
Hay diversos registros de la CPU que se emplean para controlar su funcionamiento.
La mayoría de ellos, en la mayor parte de las máquinas, no son visibles para el
usuario. Algunos de ellos pueden ser visibles a instrucciones máquina ejecutada en
un modo de control o de sistema operativo.
Naturalmente, máquinas diferentes tendrán diferentes organizaciones de registros
y usarán distinta terminología. Se incluye aquí una lista razonablemente completa
de tipos de registros, con una breve descripción. Son esencial cuatro registros para
la ejecución de una instrucción:
✓ Contador de programa (Program Counter, PC): Contiene la dirección de
la siguiente instrucción a captar.
✓ Registro de instrucciones (Instruction Register, IR): Contiene la
instrucción captada más recientemente.
✓ Registro de direcciones de memoria (Memory Address Register, MAR):
Está conectado a las líneas de dirección del bus del sistema. Especifica la
dirección de memoria de una operación de lectura o de escritura.
✓ Registro intermedio de memoria o Registro de Datos o Registro de
Palabra (MemoryBuffer Register, MBR): Está conectado a las líneas de
datos del bus del sistema. Contiene el valor a almacenar en memoria o el
último valor leído de memoria.
Normalmente, la CPU actualiza el contador de programa 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
PC. La instrucción captada se carga en IR, donde son analizados el código de
operación y los campos de operando. Se intercambian datos con la memoria por
medio de MAR y de MBR. En un sistema con organización de bus, MAR se conecta
directamente al bus de direcciones y MBR directamente al bus de datos.
Los registros visibles por el usuario intercambian repetidamente datos con MBR.
Los cuatro registros que se acaban de mencionar se usan para la transferencia de
datos entre la CPU y la memoria. Dentro de la CPU, los datos tienen que ofrecerse
a la ALU para su procesamiento.
La ALU:
Puede tener acceso directo a MBR y a los registros visibles para el usuario. Como
alternativa, puedehaber registros intermedios adicionales en torno a la ALU; estos
registros sirven como registros de entrada y salida de la ALU, e intercambian datos
con MBR y los registros visibles para el usuario. Todos los diseños de CPU incluyen
un registro o un conjunto de registros, conocidos a menudo como palabra de
estado del programa (program status Word, PSW), que contiene información
de estado. PSW contiene normalmente códigos de condición, además de otra
información de estado.
Entre los campos o indicadores comunes se incluyen los siguientes:
A. Signo: Contiene el bit de signo del resultado de la última operación aritmética.
B. Cero: Puesto a uno cuando el resultado es 0.
C. Acarreo: Puesto a uno si una operación da lugar a un acarreo (suma) o adeudo
(resta) del bit más significativo. Se usa en operaciones aritméticas multipalabra.
D. Igual: Puesto a uno si el resultado de una comparación lógica es la igualdad.
E. Desbordamiento: Usado para indicar un desbordamiento aritmético.
F. Interrupciones habilitadas/inhabilitadas: Usado para permitir o inhabilitar
interrupciones.
G. Supervisor:
Indica si la CPU funciona en modo supervisor o usuario. Únicamente en modo
supervisor se pueden ejecutar ciertas instrucciones privilegiadas y se puede
acceder a ciertas áreas de memoria.
Figura 5: indicadores de la ALU
2.2.3.- Ejemplos de organización de registros de
CPU reales
Resulta instructivo examinar y comparar las organizaciones de registros de sistemas
análogos. En esta sección, examinamos dos microprocesadores de 16 bits que
fueron diseñados aproximadamente al mismo tiempo: el Motorola MC68000
[STRI79] y el lntel 8086 [MORS78].
Las Figuras 6: (a) y (b). Representan la organización de registros de cada uno de
ellos; los registros estrictamente internos, tales como el registro de dirección de
memoria, no se muestran.
En la Figura 6: (c). Se ilustra un segundo aspecto instructivo acerca del diseño de la
organización de los registros. Esta figura muestra la organización de los registros
visibles por el usuario en el Intel 80386 [ELAY85), un microprocesador de 32 bits
diseñado como una ampliación del 8086'.
El MC68000 distribuye sus registros de 32 bits en ocho de datos y nueve de
direcciones. Los ocho registros de datos se usan principalmente para manipulación
de datos y también se usan en direccionamiento como registros índice.
El Intel 8086 usa un enfoque diferente para la organización de los registros. Cada
uno de los registros tiene un uso especial, aunque algunos registros se pueden
emplear también para un uso general.
El 8086 contiene cuatro registros de datos de 16 bits que son direccionables como
registros de bytes o como registros de 16 bits, y cuatro registros punteros e índices
de 16 bits. Los registros de datos pueden utilizarse como de uso general en algunas
instrucciones. En otras, los registros se usan implícitamente.
La unidad de procesamiento central (CPU) realiza operaciones en los datos. En la
mayoría de las arquitecturas consta de tres partes: una unidad aritmética lógica
(ALU), una unidad de control y un conjunto de registros, ubicaciones de
almacenamiento rápido.
Los registros son lugares de almacenamiento rápido independiente que guardan
datos en forma temporal. Registros múltiples son necesarios para facilitar el
funcionamiento del CPU. Podemos dividir las partes que componen un ordenador
en
tres
grandes categorías o subsistemas: la unidad de procesamiento central (CPU), la
memoria principal y el subsistema de entrada /salida.
2.3. El ciclo de instrucción
Al encender una computadora, su CPU arranca de un estado inicial conocido
(Reset) el cuál le obliga a comenzar siempre desde el mismo punto de partida. El
fabricante (en este caso yo) fija el lugar, la dirección de la celda de memoria donde
se requiere que esté la primer instrucción que la CPU va a ejecutar.
La tarea de una CPU es traer instrucciones desde la memoria y cumplir con lo que
ellas le indican, al finalizar la ejecución de la instrucción, la CPU queda en
conocimiento de donde se encuentra la que sigue. Para comenzar, solo tiene que
saber dónde se encuentra la primera porque desde esa en adelante, se asume que
vienen en secuencia, a menos que las propias instrucciones le instruyan que debe
seguir por otro lado, provocando saltos o desvíos del curso o flujo del programa.
Un Ciclo de instrucción Incluye los siguientes subciclos:
✓ Captación: Elevar la siguiente instrucción de la memoria a la CPU.
✓ Ejecución: Interpretar el código de operación y llevar a cabo la operación
indicada.
✓ Interrupción: Si las interrupciones están habilitadas y ha ocurrido una
interrupción, salvar el estado del proceso actual y atender la interrupción.
El Ciclo Indirecto
La ejecución de una instrucción puede involucrar a uno o más operandos en
memoria, cada uno de los cuales requiere un acceso a memoria. Además, si se usa
direccionamiento indirecto serán necesarios accesos a memoria adicionales.
Podemos considerar la captación de direcciones indirectas como un subciclo de
instrucción más. La principal línea de actividad consiste en alternar las actividades
de captación y ejecución de instrucciones. Después de que una instrucción sea
captada, es examinada para determinar si incluye algún direccionamiento indirecto.
Si es así, los operandos requeridos se captan usando direccionamiento indirecto.
Tras la ejecución se puede procesar una interrupción antes de la captación de la
siguiente instrucción.
Figura 7. Ciclo de Instrucción
Esta figura ilustra más correctamente la naturaleza del ciclo de instrucción. Una vez
que una instrucción es captada, deben identificarse sus campos de operandos. Se
capta entonces de la memoria cada operando de entrada, y este proceso puede
requerir direccionamiento indirecto. Los operandos ubicados en registros no
necesitan ser captados. Una vez que se ejecuta la operación, puede ser necesario
un proceso similar para almacenar el resultado en la memoria principal.
Figura 8. Búsqueda
La CPU cuenta con una serie de celdas de almacenamiento internas llamadas
Registros, algunos de ellos tienen un uso dedicado y controlan el funcionamiento de
la máquina.
PC = Program Counter o Contador de Programa: Es un registro dedicado
de la CPU que en la fase de Búsqueda apunta a la siguiente instrucción del
programa, o más exactamente al primer byte de la instrucción donde se
almacena el código de operación (Operative Code = OpCode). Este código
es el que se decodifica e indica que hacer y que operandos intervienen.
Para luego de haber obtenido los operandos poder pasar a ejecutar la tarea.
IR = Instruction Register o Registro de Instrucción: Es un registro
dedicado de la CPU que almacena el OpCode de la instrucción traída en la
búsqueda del presente ciclo. Es el valor cargado en IR el que debe
decodificarse. Las instrucciones en memoria, para esta máquina, pueden
tener uno o dos bytes. Si la instrucción es de un byte, ya se puede ejecutar
porque el valor de IR define completamente lo que hay que hacer. Si la
instrucción es de dos bytes, hay que leer el siguiente byte el cual aporta
información adicional, requerida para la ejecución. Antes de la decodificación
no se sabe si la instrucción es de uno o dos bytes. Recordemos que las
operaciones que se pueden realizar son siempre entre el valor en el
Acumulador y un operando almacenado en Memoria, lo cual implica que hay
que saber la ubicación del mismo o sea su Dirección.
Las tareas que debe realizar un procesador son:
➢ Captar instrucción: La CPU lee una instrucción de la memoria.
➢ Interpretar instrucción: La instrucción se decodifica para determinar qué
acción es necesaria.
➢ Captar datos: La ejecución de una instrucción puede exigir leer datos de la
memoria o de un módulo de E/S.
➢ Procesar datos: La ejecución de una instrucción puede exigir llevar a cabo
alguna operación aritmética o lógica con los datos.
Escribir datos: Los resultados de una ejecución pueden exigir escribir datos en la
memoria o en un módulo de E/S. Para hacer esto, es obvio que la CPU necesita
almacenar algunos datos temporalmente. Debe recordar
2.3.1 ciclo fetch-decode-execute
Un ciclo de instrucción (también llamado ciclo de fetch-and-execute o ciclo de fetchdecode-execute en inglés) es el período que tarda la unidad central de proceso
(CPU) en ejecutar una instrucción de lenguaje máquina. Comprende una secuencia
de acciones determinada que debe llevar a cabo la CPU para ejecutar cada
instrucción en un programa. Cada instrucción del juego de instrucciones de una
CPU puede requerir diferente número de ciclos de instrucción para su ejecución.
Un ciclo de instrucción está formado por uno o más ciclos máquina; Para que
cualquier sistema de proceso de datos basado en microprocesador (por ejemplo un
ordenador) o microcontrolador (por ejemplo un reproductor de MP3) realice una
tarea (programa) primero debe buscar cada instrucción en la memoria principal y
luego ejecutarla.
Secuencia de acciones del ciclo de instrucción; Habitualmente son cuatro los
eventos o pasos que se llevan a cabo en cada ciclo de instrucción (ciclo de fetch):
Buscar la instrucción en la memoria principal Se vuelca el valor del contador de
programa sobre el bus de direcciones. Entonces la CPU pasa la instrucción de la
memoria principal a través del bus de datos al Registro de Datos de Memoria (MDR).
A continuación el valor del MDR es colocado en el Registro de Instrucción Actual
(CIR), un circuito que guarda la instrucción temporalmente de manera que pueda
ser decodificada y ejecutada.
El decodificador de instrucción interpreta e implementa la instrucción. El registro de
instrucción (IR) mantiene la instrucción en curso mientras el contador de programa
(PC, program counter) guarda la dirección de memoria de la siguiente instrucción a
ser ejecutada.
Recogida de datos desde la memoria principal
También se lee la dirección efectiva de la memoria principal si la instrucción tiene
una dirección indirecta, y se recogen los datos requeridos de la memoria principal
para ser procesados y colocados en los registros de datos.
Ejecutar la instrucción
A partir del registro de instrucción, los datos que forman la instrucción son
decodificados por la unidad de control. Ésta interpreta la información como una
secuencia de señales de control que son enviadas a las unidades funcionales
relevantes de la CPU para realizar la operación requerida por la instrucción.
Figura 9. Ciclo fetch-decode-execute
En este ciclo las fases(o sub ciclos): búsqueda y ejecución (cada fase tiene
etapas o actividades)
FASE FETCH
✓ Cargar la siguiente instrucción
✓ Incrementar el secuenciador
✓ Interpretar la Instrucción
FASE EXECUTE
▪
▪
▪
▪
Cargar los operandos
Ejecutar la operación
Guardar el resultado
Verificar si hay solicitudes de interrupción
2.3.2. Segmentación de instrucciones
La segmentación de instrucciones es similar al uso de una cadena de montaje en
una fábrica de manufacturación. En las cadenas de montaje, el producto pasa a
través de varias etapas de producción antes de tener el producto terminado. Cada
etapa o segmento de la cadena está especializada en un área específica de la línea
de producción y lleva a cabo siempre la misma actividad. Esta tecnología es
aplicada en el diseño de procesadores eficientes. A estos procesadores se les
conoce como pipeline processors.
Un pipeline processor está compuesto por una lista de segmentos lineales y
secuenciales en donde cada segmento lleva a cabo una tarea o un grupo de tareas
computacionales. Puede ser representado gráficamente en dos dimensiones, en
donde en el eje vertical encontramos los segmentos que componen el pipeline y en
el segmento horizontal representamos el tiempo. (En la figura se muestran la
segmentación de instrucciones del pipeline).
Figura 10.- segmentación de instrucciones
Hay tres aspectos importantes que deben ser considerados en pipeline. Lo primero
que debemos observar es que el trabajo es dividido en piezas que más o menos
ajustan dentro de los segmentos que componen el pipeline. Segundo, para que el
pipeline trabaje de forma eficiente es necesario que las particiones de trabajo tomen
aproximadamente la misma cantidad de tiempo. De así, el segmento que requiera
más tiempo (T) hará que el pipeline se retrase y cada segmento requerirá T
unidades de tiempo para completar su trabajo.
Esto quiere decir que los segmentos rápidos estarán mucho tiempo ociosos.
Tercero, para que el pipeline funcione adecuadamente, deben ocurrir pocas
excepciones o hazards (riesgos) que puedan causar retardos o errores en el
pipeline. En caso de ocurrir errores, la instrucción tiene que ser cargada
nuevamente en el pipeline y se debe reiniciar la misma instrucción que ocasionó la
excepción.
Como una primera aproximación, consideremos una subdivisión del procesamiento
de una instrucción en dos etapas o segmentos:
➢ Captación de la instrucción
➢ Ejecución de la instrucción
2.3.3.- Conjunto de instrucciones: Características y
Funciones
Un conjunto de instrucciones o repertorio de instrucciones, juego de instrucciones o
ISA (del inglés Instruction Set Architecture, Arquitectura del Conjunto de
Instrucciones) es una especificación que detalla las instrucciones que una CPU de
un ordenador puede entender y ejecutar, o el conjunto de todos los comandos
implementados por un diseño particular de una CPU.
El término describe los aspectos del procesador generalmente visibles a un
programador, incluyendo los tipos de datos nativos, las instrucciones, los registros,
la arquitectura de memoria y las interrupciones, entre otros aspectos.
Existe principalmente de 3 tipos: CISC (Complex Instruction Set Computer), RISC
(Reduced Instruction Set Computer) y SISC (Simple Instruction Set Computing).
La arquitectura del conjunto de instrucciones (ISA) se emplea a veces para distinguir
este conjunto de características de la micro arquitectura, que son los elementos y
técnicas que se emplean para implementar el conjunto de instrucciones.
Entre estos elementos se encuentran las microinstrucciones y los sistemas de caché
Procesadores con diferentes diseños internos pueden compartir un conjunto de
instrucciones; por ejemplo, el Intel Pentium y AMD Athlon implementan versiones
casi idénticas del conjunto de instrucciones x86, aunque tienen diseños diferentes.
Cualquier conjunto de instrucciones se puede implementar de varias maneras.
Todas las maneras de implementar un conjunto de instrucciones dan el mismo
modelo programado, y todas pueden hacer funcionar los mismos ejecutables
binarios. Las varias maneras de implementar un conjunto de instrucciones dan
diversas compensaciones entre el coste, el funcionamiento, el consumo de energía,
el tamaño, el etc.
La función de una computadora es la ejecución de programas. Los programas se
encuentran localizados en memoria y consisten de instrucciones. La CPU es quien
se encarga de ejecutar dichas instrucciones a través de un ciclo denominado ciclo
instrucciones. Las instrucciones consisten de secuencias de 1 y 0 (binarias)
llamadas código máquina y no son legibles para las personas.
Por ello se emplean lenguajes como el ensamblador (bajo nivel) o lenguajes de
programación como pascal (alto nivel). Las instrucciones son ejecutadas por la CPU
a grandes velocidades.
Desde una visión muy simple, el llevar a
cabo las instrucciones consiste de dos
etapas:
•
Leer (fetch)
Memoria
•
B) Ejecutar (execute) instrucción
•
El programa se ejecuta a través
de una iteración constante de
estos dos etapas
instrucción
de
2.3.4.- Modos de direccionamiento y formatos
Los llamados modos de direccionamiento son las diferentes maneras de especificar
en informática un operando dentro de una instrucción en lenguaje ensamblador.
Un modo de direccionamiento especifica la forma de calcular la dirección de
memoria efectiva de un operando mediante el uso de la información contenida en
registros y / o constantes, contenida dentro de una instrucción de la máquina o en
otra parte.
Diferentes arquitecturas de computadores varían mucho en cuanto al número de
modos de direccionamiento que ofrecen desde el hardware.
Eliminar los modos de direccionamiento más complejos podría presentar una serie
de beneficios, aunque podría requerir de instrucciones adicionales, e incluso de otro
registro. Se ha comprobado que el diseño de CPUs segmentadas es mucho más
fácil si los únicos modos de direccionamiento que proporcionan son simples.
La mayoría de las máquinas RISC disponen de apenas cinco modos de
direccionamiento simple, mientras que otras máquinas CISC tales como el DEC
VAX tienen más de una docena de modos de direccionamiento, algunos de ellos
demasiado 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.
Especificación de modos de direccionamiento y formatos
Un modo de direccionamiento especifica la forma de calcular la dirección de
memoria efectiva de un operando mediante el uso de la información contenida en
registros y / o constantes, contenida dentro de una instrucción de la máquina o en
otra parte.
•
Direccionamiento Implícito: En este modo de direccionamiento no es
necesario poner ninguna dirección de forma explícita, ya que en el propio
código de operación se conoce la dirección del (de los) operando(s) al (a los)
que se desea acceder o con el (los) que se quiere operar.
•
Direccionamiento Inmediato: 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.
•
Direccionamiento Directo: El campo de operando en la instrucción contiene
la dirección en memoria donde se encuentra el operando. 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.
•
Direccionamiento Indirecto: El campo de operando contiene una dirección
de memoria, en la que se encuentra la dirección efectiva del operando.
•
Direccionamiento Absoluto: El campo de operando contiene una dirección
en memoria, en la que se encuentra la instrucción.
•
Direccionamiento Relativo: El registro referenciado implícitamente es el
contador de programa. El campo de direcciones se trata como un número en
complemento a 2, y representa un desplazamiento relativo al PC.
•
Direccionamiento con registro base: En este direccionamiento el registro
referenciado contiene una dirección de memoria y el campo de dirección
contiene un desplazamiento desde dicha dirección.
•
Direccionamiento indexado: El campo de direcciones referencia una
dirección de memoria principal, y el registro referenciado contiene un
desplazamiento positivo desde esa dirección. En el indexado se considera
que el campo de direcciones es una dirección de memoria.
•
Direccionamiento autoincrementa: En este método, la dirección
del operando se encuentra en un registro y éste es incrementado después
de acceder al operando, en el tamaño del mismo
•
Direccionamiento autodecrementa: En este modo para obtener la
dirección del operando hay que decremento un registro en el tamaño del
operando; el nuevo contenido del registro después de efectuar esa
operación es la dirección del operando.
Contar con diferentes formatos de instrucciones, implica contar con diferentes
formas de obtener los operandos de las instrucciones. Por lo general a estas
múltiples formas se les conoce como modos de direccionamiento. Los modos de
direccionamiento en MIPS son:
Direccionamiento por registro, donde los operandos son registros. Los datos a
operar están contenidos en 2 registros de 32 bits y el resultado será colocado en
otro registro, del mismo tamaño.
❖ Ejemplos de instrucciones que usan este modo de direccionamiento:
add, sub, slt, etc.
Direccionamiento base o desplazamiento, donde uno de los operandos está en una
localidad de memoria cuya dirección es la suma de un registro y una constante que
forma parte de la misma instrucción.
❖ Ejemplos de instrucciones que usan este modo de direccionamiento:
lw, sw, etc.
Direccionamiento inmediato, donde uno de los operandos es una constante que está
en la misma instrucción.
❖ Ejemplos de instrucciones que usan este modo de direccionamiento:
addi, slti, etc.
Direccionamiento relativo al PC, donde se forma una dirección sumando una
constante, que está en la instrucción, con el registro PC (Program Counter). El
resultado de la suma corresponde a la dirección destino si un brinco condicional se
va a realizar.
❖ Ejemplos de instrucciones que usan este modo de direccionamiento:
beq y bne.
Direccionamiento pseudo directo, donde la dirección destino de un salto
corresponde a la concatenación de 26 bits que están en la misma instrucción con
los bits más significativos del PC.
❖ Ejemplos de instrucciones que usan este modo de direccionamiento: j
y jal.
Es importante mencionar que estamos estudiando una arquitectura con direcciones
de 32 bits, sin embargo, MIPS, como muchas otras arquitecturas, tiene una
extensión que maneja direcciones de 64 bits. Esto como una respuesta a la
necesidad de manejar programas cada vez más grandes.
2.4.- Casos de estudios de CPU reales
A. I-8086
Los modos de direccionamiento del 8086 (Crawford & Gelsinger, 1987) son muy
irregulares. Los registros del procesador, se usan para contener los datos con que
se está trabajando puesto que el acceso a los registros es mucho más rápido que
los accesos a memoria. Se pueden realizar operaciones aritméticas y lógicas,
comparaciones, entre otras.
Hay un campo para un registro (reg), que especifica uno de los operandos, y otros
dos campos (mod y r/m) para el otro.
Los modos del 8086 son indirectos por registro, indexados o directos por registro.
Registros Propósito General:
•
Registro AX: El registro AX es el registro acumulador, es utilizado para
operaciones que implican entrada/salida, y multiplicación y división (estas
dos últimas en conjunto con el registro DX)
•
Registro BX: El registro BX es el registro base, y es el único registro de
propósito general que puede ser un índice para direccionamiento indexado
•
Registro CX: El registro CX es conocido como el registro contador. Puede
contener un valor para controlar el número de veces que un ciclo se repite.
•
Registro DX: El registro DX es el registro de datos.
Registros Índice:
•
Registro SI: El registro índice fuente de 16 bits es requerido por algunas
operaciones con cadenas de caracteres.
•
Registro DI: El registro índice destino también es requerido por algunas
operaciones con cadenas de caracteres.
Registros Apuntadores:
•
Registro SP: Apuntador de pila de 16 bits proporciona un valor de
desplazamiento que se refiere a la palabra actual que está siendo procesada
en la pila.
•
Registro BP: El apuntador base de 16 bits facilita la referencia de
parámetros dentro de la pila.
Figura 11: Arquitectura de los Registros
B. Motorola 68000
En el Motorola 68000 el mismo direccionamiento lleva implícito el tipo de registro
sobre el que trabaja (direcciones o datos). Está basado en dos bancos de 8 registros
de 32 bits. Un banco es de datos (Dn) y el otro de punteros (An). Además contiene
un contador de programa de 32 bits y un registro de estado de 16 bits. Los registros
de datos (D0 a D7) se pueden usar como registros de 32 bits (.l), 16 bits (.w) y 8 bits
(.b). Cualquiera de ellos puede usarse como acumulador, índice o puntero.
Acepta los siguientes modos de direccionamiento:
✓
✓
✓
✓
✓
✓
✓
Implícito (o inherente).
Inmediato.
Absoluto.
Directo a registro.
Indirecto.
Relativo a PC con desplazamiento.
Relativo a PC con índice y desplazamiento.
C. 80386
Para este microprocesador existe un modo nuevo que requiere un byte adicional
denominado SIB (escala, índice, base) que se añade al byte de operandos y cuyo
formato es el siguiente: Ese byte adicional especifica un factor de escala y dos
registros (base e índice).
El 80386 tiene registros de 32 bits en las siguientes categorías:
Registros de propósito general.
Registros de segmento.
Puntero de instrucciones
Indicadores.
Registros de control (nuevos en el 80386).
Registros de direcciones de sistema.
Registros de depuración (debug) (nuevos en el 80386).
Registros de test (nuevos en el 80386).
D. Procesador I3
Línea de microprocesadores Intel, gama baja. 3 era generación 2010.
Características:
•
•
•
•
•
Procesador de 2 núcleos
4 hilos de procesamiento en paralelo
Tarjeta gráfica integrada
Controlador de memoria
Controlador PCI Express 2.0 integrado
Conclusión
En este trabajo se presentó un panorama general de la organización de la unidad
central de procesamiento de una computadora. Muchas variaciones de las
organizaciones aquí presentadas se encuentran en las máquinas disponibles en el
comercio. La elección de una organización específica implica tener que equilibrar
velocidad de ejecución y costo de implante. También se ve afectada por otros
factores, tales como la tecnología que se emplee, la flexibilidad de modificación, o
el deseo de proporcionar algunas capacidades especiales en el conjunto de
instrucciones de la computadora.
Se presentaron dos enfoques en lo relativo al implante de la unidad de control de
una CPU: control fijo y control micro programado. El control micro programado
proporciona considerable flexibilidad en el implante de conjuntos de instrucciones.
También facilita la adición de nuevas instrucciones a máquinas ya existentes.
Cuando se presentó por primera vez el control micro programado, resultaba mucho
más lento que el control fijo, debido a la baja velocidad del almacenamiento ROM.
Sin embargo, los avances en la tecnología ROM han reducido las diferencias de
velocidad. Como resultado, ahora el uso del control micro programado es mucho
más frecuente debido a su flexibilidad.
Bibliografía
❖ Estructura y diseño de Computadores
David A. Patterson, John L. Hennessy
Ed. Reverté S.A. 2000
Capítulo 5: Trata el tema desde la perspectiva del diseño del camino de
datos y control. Aborda la realización de un esquema simple y de uno
multicilo para ir profundizando en temas de microprogramación y del
tratamiento de excepciones por la unidad de control, sobre la realización
de la unidad de control mediante circuitería. Analiza las unidades de
control combinatorias, las de máquinas de estados finitos de control y los
secuenciadores.
❖ Fundamentos de los Computadores
Pedro de Miguel Anasagasti
Ed. Paraninfo. 1999
Capítulo 7: Enfoca el tema desde las operaciones elementales. Aborda
el diseño de la unidad de control desde las perspectivas cableada y
microprogramada. Finalmente, trata el tratamiento de las interrupciones y
cepos por parte de la unidad de control y el arranque del computador
❖ Estructura de Computadores
José Mª Angulo Usategui
Ed. Paraninfo. 1996
Capítulo 5: Analiza las operaciones elementales y las señales de control
de las máquinas por el autor diseñadas: MS y MS+.
❖ Arquitectura de Computadores
J. Antonio de Frutos, Rafael Rico
Ed. Universidad de Alcalá. 1995
Capítulo 4: Desarrolla el tema de la unidad de control del computador.
Partiendo de las operaciones elementales y por medio de un computador
elemental desarrollado por los autores se llega al concepto de
cronogramas.
❖ Arquitectura de Computadores. Un Enfoque cuantitativo
John L. Hennessy y David A. Patterson
Ed. Mc Graw-Hill. 1993
❖ ECKHOUSE, Richard, L. Robert Morris. Sistemas de Minicomputadoras.
Organización, Programación y Aplicaciones (PDP-11). 1982. Editorial
Dossat, S.A. Madrid. España.
❖ GORDON, Davis. Management Information Systems: Conceptual,
Foundations, Structure, and Development. 1974. McGraw Hill Inc. United
States of America.
❖ HAMACHER V. Carl, Zvonko G. Vranesic, Safwat G. Zaky. Computer
Organization. 1987. McGraw Hill Inc. United States of America.
❖ HERNÁNDEZ CABALLERO, S. Enciclopedia Temática de Informática.
Tomo 1. 1990. Maveco de Ediciones S.A. España.
❖ Abel, P. (1996). Lenguaje Ensamblador y Programación para IBM PC y
Compatibles. Prearson Educación.
❖ http://www.itescam.edu.mx/portal/asignatura.php?clave_asig=SCD1003&carrera=ISIC-2010-224&id_d=157.
❖ http://www.itescam.edu.mx/principal/sylabus/fpdb/recursos/r89165.PDF
❖ http://www.itescam.edu.mx/principal/sylabus/fpdb/recursos/r89167.PDF
❖ http://www.itescam.edu.mx/principal/sylabus/fpdb/recursos/r89166.PDF
❖ https://es.scribd.com/doc/109271102/ciclo-f
❖ http://hpc.aut.uah.es/~nacho/AII/tema3.v4.6.pdf
❖ https://es.scribd.com/doc/30420235/Ciclo-Fetch
Descargar
Fichas aleatorios
Explore flashcards