L3 2 Funcionamiento del procesador: ejecución de instrucciones.
Proceso de Ejecución de Instrucciones
Introducción al Computador Didáctico Elemental
- Se utiliza un modelo de computador denominado "computador didáctico elemental", que contiene los elementos básicos de cualquier ordenador y tiene un formato de instrucciones regular con solo 16 instrucciones.
- Este modelo permite entender cómo funciona un computador, y se menciona que en cursos superiores se diseña completamente. Además, hay material pedagógico disponible como emuladores y embaladores.
Estructura del Code2
- En esta lección se revisa la estructura del code2, que incluye 16 registros de uso general, una unidad aritmético-lógica, un registro temporal y un registro de dirección conectado al bus de direcciones.
- La unidad de control incluye el contador de programa, el registro instrucción (IR), el puntero de pila y otros componentes esenciales para la ejecución.
Proceso Inicial para Ejecutar un Programa
- Para ejecutar un programa, es necesario cargar la dirección inicial en el contador de programa mediante una instrucción de salto. Por ejemplo, si el programa inicia en la dirección 1A, esa dirección se carga en el contador.
- El procesador debe llevar la primera instrucción del programa al registro correspondiente; esto implica mover la dirección desde el contador a un registro específico para leer su contenido.
Fases del Ciclo Máquina
- Una vez captada la instrucción en el registro IR, se actualiza el valor del contador de programa incrementándolo en uno. Esto concluye los primeros pasos antes de ejecutar una instrucción.
- La ejecución implica dos fases: primero captar la siguiente instrucción y luego ejecutarla. La unidad de control interpreta las señales necesarias para realizar operaciones específicas.
Consideraciones sobre Instrucciones y Accesos a Memoria
- Cada ciclo máquina consiste en captar e ejecutar instrucciones continuamente. En code2 se asume que cada instrucción ocupa una sola posición en memoria.
Microoperaciones y Ejecución de Instrucciones en Computadores
Conceptos Básicos de Microoperaciones
- Las microoperaciones son las operaciones más elementales que puede realizar un computador, como cargar registros, incrementar contadores y leer o escribir en memoria.
- Estas microoperaciones se sincronizan con el reloj del sistema, consumiendo uno o varios ciclos. La mayoría consume solo un ciclo, mientras que las operaciones de lectura y escritura suelen requerir varios ciclos.
- Algunas microoperaciones pueden ejecutarse simultáneamente, dependiendo de su ubicación dentro del procesador; otras no pueden ser simultáneas debido a restricciones operativas.
Fases de Captación y Ejecución
- La ejecución de una instrucción máquina implica un conjunto específico de microoperaciones en un orden preestablecido, consumiendo varios ciclos de reloj.
- Se distingue entre la fase de captación (donde se obtienen los operandos necesarios) y la fase de ejecución (que depende del código de operación específico).
Ejemplo Práctico: Instrucción 0700
- Se considera un computador con palabras de 16 bits. Por ejemplo, la instrucción 0700 lleva datos desde una dirección específica en memoria al registro r7.
- En este caso, Rd contiene la dirección donde está el dato a transferir. Al ejecutar la instrucción, se realizan varias microoperaciones para mover datos entre registros y memoria.
Proceso Detallado de Ejecución
- Después de captar la instrucción 0700, el contador del programa apunta a la siguiente instrucción a ejecutar (003A), mientras que el registro de instrucción contiene 0700.
- Para ejecutar esta instrucción, primero se debe leer el dato desde la posición indicada por Rd (54C2), lo cual implica llevar esa dirección al registro AR.
Finalización del Proceso
- Una vez que se tiene la dirección en AR, esta aparece en el bus de direcciones para seleccionar la posición correspondiente en memoria. Luego se da orden para leer ese dato.
- El valor leído es transferido al registro DR antes de ser movido finalmente al registro r7. Este proceso concluye con éxito cuando r7 contiene el dato deseado (D7A2).
Fase de Ejecución de Instrucciones
Proceso de Carga y Ejecución
- El contador de programa se encuentra en la fase de ejecución, donde se transfiere el contenido de
drdar, seguido por la lectura del dato que se introducirá enr7desde la memoria.
- Se carga un dato específico desde memoria (54C2) a
r7, completando así las microoperaciones necesarias para esta instrucción.
Microoperaciones y Temporización
- La instrucción general se denomina "cargar un registro con un contenido de memoria", y cada instrucción tiene sus propias microoperaciones que pueden ser analizadas en un organigrama.
- La fase de captación es común a todas las instrucciones, mientras que la fase de ejecución varía según el código operativo específico.
Consumo de Ciclos
- Algunas instrucciones requieren más ciclos que otras; por ejemplo, cargar consume tres ciclos, sumar dos, y saltar uno. Las subrutinas pueden consumir hasta cuatro ciclos.
- Instrucciones más complejas consumen más ciclos. El tiempo total puede calcularse multiplicando el número de ciclos por el periodo o dividiendo los ciclos entre la frecuencia del reloj.
Instrucciones de Control
Alteración del Orden Secuencial
- Las instrucciones permiten al procesador ejecutar secuencialmente las instrucciones almacenadas en posiciones consecutivas en memoria.
- Con las instrucciones de control, es posible alterar este orden mediante saltos a direcciones específicas fijadas por el programador.
Tipos de Instrucciones
- Existen diferentes tipos: saltos incondicionales (JUMP), condicionales, llamadas a subrutinas (CALL), y retornos (RETURN).
- En los saltos condicionales, solo se ejecutan si se cumple una condición basada en indicadores como cero o signo.
Ejemplo Práctico
- Al ejecutar una instrucción salto (
BRANCH), el programador debe cargar previamente la dirección deseada enRd. Durante la ejecución, esta dirección reemplaza al contador de programa (PC).
- Si
Rdcontiene 10A3 durante un salto desde 107B, entonces el siguiente ciclo captará la instrucción ubicada en 10A3 tras realizarse automáticamente el salto.
Complejidad Adicional
Introducción a las Subrutinas
Concepto de Subrutina
- Una subrutina es un bloque de código que se ejecuta al ser llamado desde otro programa, permitiendo la modularidad y reutilización del código.
- Las subrutinas pueden anidarse, lo que significa que una subrutina puede llamar a otra, creando una estructura jerárquica en la ejecución del programa.
Ejemplo de Llamadas a Subrutinas
- Se presenta un ejemplo donde un programa llama a una subrutina ubicada en la dirección 1A3, con el registro Rd conteniendo la dirección de inicio.
- Si esta subrutina también llama a otra (en este caso en 6FB), se produce un nuevo salto para ejecutar esa segunda subrutina.
Retorno de Subrutinas
- Al finalizar una subrutina sin más llamadas, se ejecuta una instrucción de retorno que regresa al punto inmediatamente siguiente a la llamada original.
- Es crucial almacenar las direcciones del contador de programa durante las llamadas para poder regresar correctamente después de ejecutar las subrutinas.
Direcciones de Retorno y Pila
- Las direcciones de retorno deben almacenarse temporalmente; estas son esenciales para volver al flujo original del programa tras completar las ejecuciones.
- La memoria utilizada para almacenar estas direcciones se denomina "pila", que opera bajo el principio LIFO (Last In First Out).
Implementación y Gestión de la Pila
- La pila permite extraer direcciones en orden inverso al que fueron introducidas, facilitando así el retorno correcto tras cada llamada.
- Durante la llamada a una subrutina, primero se guarda el contenido del contador de programa en la pila antes de cambiar su valor por el inicio de la nueva rutina.
Tipos de Pilas: Hardware vs Software
- Existen pilas implementadas directamente en hardware dentro del procesador o simuladas mediante software utilizando memoria principal.
Proceso de Llamadas a Subrutinas y Retornos
Almacenamiento de la Dirección de Retorno
- La cabecera de la pila almacena el puntero que indica dónde se debe guardar la nueva dirección de retorno durante las llamadas a subrutinas.
- Para almacenar esta dirección, es necesario desplazar el puntero de pila (SP) hacia arriba y restar uno, ya que las direcciones bajas están en la parte superior y las altas en la inferior.
Microoperaciones para Guardar Direcciones
- La primera microoperación consiste en decrementar SP en uno para apuntar a la ubicación correcta donde se almacenará la nueva dirección de retorno.
- Se transfiere el contenido del puntero de pila al registro AR, y luego se guarda el valor del contador de programa (PC) en el registro DR para su almacenamiento posterior.
Escritura en Memoria
- Con AR conteniendo la dirección adecuada y DR con el dato a escribir, se ordena escribir este dato en memoria.
- Para realizar un salto a una subrutina, se pasa el contenido del registro RD al PC después de haber guardado previamente el valor del PC en memoria.
Proceso de Retorno desde una Subrutina
- Durante el retorno, primero se lee la dirección almacenada en SP pasando su valor al registro AR.
- Luego, se lee desde memoria utilizando AR y se lleva ese contenido al registro DR antes de transferirlo al contador de programa (PC).
Actualización del Puntero de Pila
- Después de extraer una dirección, es crucial incrementar SP para reflejar que ahora apunta a una nueva cabecera tras completar el retorno.
Resumen del Proceso General
- Las instrucciones son ejecutadas en dos fases: captación (llevar instrucción al registro correspondiente) y ejecución (interpretación por parte de la unidad control).
- Cada instrucción implica un conjunto específico de microoperaciones que deben ejecutarse secuencialmente.