5.10 Ciclo de la instrucción

El ciclo de la instrucción es la secuencia de pasos que la Unidad de Control (UC) para ejecutar cada instrucción de un programa. Es un proceso esencial para el funcionamiento de cualquier computadora. En este ciclo intervienen elementos clave como registros, buses de datos, direcciones y control, y las señales de control generadas por la UC.

Las microoperaciones que lo componen se expresan con la notación de transferencia entre registros: destino \(\leftarrow\) origen .

La Figura 5.20 muestra el flujo general del ciclo, que se divide en dos etapas principales: captación (fetch) y ejecución.

Flujo del ciclo de instrucción en VonSim8

Figura 5.20: Flujo del ciclo de instrucción en VonSim8

5.10.1 Etapa 1: Captación

Esta etapa es igual para todas las instrucciones. La CPU lee la instrucción desde memoria y la coloca en el Registro de Instrucciones (IR). Consta de tres microoperaciones:

  1. MAR \(\leftarrow\) IP La UC transfiere el contenido del Puntero de Instrucción (IP) al Registro de Direcciones de Memoria (MAR). El IP contiene la dirección de la próxima instrucción a ejecutar.

  2. MBR \(\leftarrow\) read(Memoria[MAR]) | IP \(\leftarrow\) IP + 1 La UC activa la señal de lectura para obtener la instrucción ubicada en la dirección indicada por MAR. El dato leído se guarda en el Registro de Datos de Memoria (MBR) y, al mismo tiempo, el IP se incrementa para apuntar a la siguiente instrucción u operando.

  3. IR \(\leftarrow\) MBR El contenido del MBR se transfiere al IR. A partir de este momento, la instrucción está lista para ejecutarse.

5.10.2 Etapa 2: Ejecución:

En esta etapa, l decodificador de instrucciones interpreta el valor almacenado en el registro IR y realiza las siguientes acciones: - Según código de operación (opcode) lee las microinstrucciones correspondientes desde la memoria de control. - Envia al secuenciador esas microinstrucciones para que genere las señales de control necesarias para ejecutar la instrucción. - El tipo de instrucción segun código de operación (opcode). - El número de operandos. - El modo de direccionamiento.

A continuación se explican las instrucciones más comunes.

5.10.2.1 Instrucciones con dos operandos MOV, ADD, SUB y CMP:

A. Destino en registro (Rx)

Modo entre registros (Rx, Ry) 4. La ejecución ocupa un paso y puede ser: - MOV: Rx \(\leftarrow\) Ry - ADD: Rx \(\leftarrow\) Rx + Ry; update(Flags) - SUB: Rx \(\leftarrow\) Rx - Ry; update(Flags) - CMP: Rx - Ry; update(Flags) (solo actualiza flags, no guarda el resultado)

Modo directo (Rx, [Dirección]) 4. MAR \(\leftarrow\) IP – Se obtiene la dirección del operando fuente. 5. MBR \(\leftarrow\) read(Memoria[MAR]) | IP \(\leftarrow\) IP + 1 – Se lee la dirección desde memoria y se incrementa IP. 6. MAR \(\leftarrow\) MBR – Se transfiere la dirección al MAR. 7. MBR \(\leftarrow\) read(Memoria[MAR]) – Se obtiene el dato del operando.

  1. Se ejecuta la operación: - MOV: Rx \(\leftarrow\) MBR - ADD: Rx \(\leftarrow\) Rx + MBR; update(Flags) - SUB: Rx \(\leftarrow\) Rx - MBR; update(Flags) - CMP: Rx - MBR; update(Flags)

Modo inmediato (Rx, Dato) 4. MAR \(\leftarrow\) IP – Dirección del dato inmediato. 5. MBR \(\leftarrow\) read(Memoria[MAR]) | IP \(\leftarrow\) IP + 1 – Se lee el dato y se incrementa IP. 6. Se ejecuta la operación: - Igual que en el caso anterior.

Modo indirecto (Rx, [BL]) 4. MAR \(\leftarrow\) BL – Dirección del dato inmediato. 5. MBR \(\leftarrow\) read(Memoria[MAR]) – Se lee el dato. 6. Se ejecuta la operación: - Igual que en los casos anteriores.

B.*Destino en memoria ([Dirección] o [BL]) En estas instrucciones, el resultado de la operación no se almacena en un registro, sino en una posición de memoria. El procedimiento depende del modo de direccionamiento y de la instrucción utilizada (MOV, ADD, SUB, CMP). En general, el flujo es:

Obtener la dirección de memoria de destino (puede venir desde la memoria o encontrarse en el registro BL).

Escribir datos en esa dirección según la operación:

  • MOV: solo escribe el valor fuente en la memoria destino.

  • ADD/SUB: lee el valor destino, realiza la operación aritmética con el operando fuente y guarda el resultado.

  • CMP: lee el valor destino, realiza la comparación con el operando fuente y actualiza los flags sin modificar la memoria.

Actualizar los flags (Z, C, S, O) en operaciones aritméticas (ADD, SUB, CMP).

Modo Directo ([Dirección], Ry) 4. MAR \(\leftarrow\) IP – Se transfiere el segundo operando al MAR. 5. MBR \(\leftarrow\) read(Memoria[MAR]) | IP \(\leftarrow\) IP + 1 – Se obtiene la dirección de destino y se incrementa el IP. 6. MAR \(\leftarrow\) MBR – Se transfiere la dirección obtenida al MAR.

Según la instrucción: MOV:
7. MBR \(\leftarrow\) Ry – El contenido de Ry se pasa a MBR. 8. write(Memoria[MAR]) \(\leftarrow\) MBR – Se escribe en memoria.

ADD, SUB, CMP: 7. MBR \(\leftarrow\) read(Memoria[MAR]) – Se lee el valor actual del destino. 8. Se realiza la operación: - ADD: MBR \(\leftarrow\) MBR + Ry | update(Flags) - SUB: MBR \(\leftarrow\) MBR - Ry | update(Flags) - CMP: MBR - Ry; update(Flags)

Si es ADD o SUB: 9. write(Memoria[MAR]) \(\leftarrow\) MBR – Se escribe el resultado.

Modo Indirecto ([BL], Ry) 4. MAR \(\leftarrow\) BL – El contenido de BL, que es la dirección del operando destino, se transfiere a MAR.

Según la instrucción: MOV: 5. MBR \(\leftarrow\) Ry – El contenido del registro Ry se mueve a MBR. 6. write(Memoria[MAR]) \(\leftarrow\) MBR – El dato de MBR se escribe en la memoria.

ADD, SUB, CMP: 7. MBR \(\leftarrow\) read(Memoria[MAR]) – Se lee el valor actual de la dirección. 8. Se realiza la operación: - ADD: MBR \(\leftarrow\) MBR + Ry | update(Flags) - SUB: MBR \(\leftarrow\) MBR - Ry | update(Flags) - CMP: MBR - Ry; update(Flags)

Si es ADD o SUB: 9. write(Memoria[MAR]) \(\leftarrow\) MBR – Se escribe el resultado.

Modo Directo-Inmediato ([Dirección], Dato) 4. MAR \(\leftarrow\) IP – Se obtiene la dirección destino. 5. MBR \(\leftarrow\) read(Memoria[MAR]) | IP \(\leftarrow\) IP + 1 – Se obtiene la dirección de destino y se incrementa el IP. 6. MAR \(\leftarrow\) IP;ri \(\leftarrow\) MBR – El IP se transfiere a MAR para obtener el valor inmediato. y se guarda la dirección destino en un registro intermedio. (ri). 7. MBR \(\leftarrow\) read(Memoria[MAR]) | IP \(\leftarrow\) IP + 1 – Se lee el dato inmediato y se incrementa el IP.

Según la instrucción: MOV: 8. MAR \(\leftarrow\) ri– Se carga la dirección destino. 9. write(Memoria[MAR]) \(\leftarrow\) MBR – Se escribe el valor inmediato en memoria.

ADD, SUB, CMP: 8. MAR \(\leftarrow\) ri | id \(\leftarrow\) MBR – Se carga la dirección destino y se guarda el valor inmediato en id. 9. MBR \(\leftarrow\) read(Memoria[MAR]) – Se lee el valor actual de destino. 10. Se realiza la operación: - ADD: MBR \(\leftarrow\) MBR + id; update(Flags) - SUB: MBR \(\leftarrow\) MBR - id; update(Flags) - CMP: MBR - id; update(Flags)

Si es ADD o SUB: 11. write(Memoria[MAR]) \(\leftarrow\) MBR – Se escribe el resultado.

Modo Indirecto-Inmediato ([BL], Dato) 4. MAR \(\leftarrow\) IP – Dirección del dato inmediato. 5. MBR \(\leftarrow\) read(Memoria[MAR]) | IP \(\leftarrow\) IP + 1 – Se lee el dato inmediato y el IP se incrementa.

Según la instrucción: MOV: 6. MAR \(\leftarrow\) BL – Dirección de destino. 7. write(Memoria[MAR]) \(\leftarrow\) MBR

ADD, SUB, CMP:
6. MAR \(\leftarrow\) BL | id \(\leftarrow\) MBR – Se carga la dirección destino y se guarda el valor inmediato en id. 7. MBR \(\leftarrow\) read(Memoria[MAR]) – Se lee el valor actual de destino. 8. Se realiza la operación: - ADD: MBR \(\leftarrow\) MBR + id; update(Flags) - SUB: MBR \(\leftarrow\) MBR - id; update(Flags) - CMP: MBR - id; update(Flags)

Si es ADD o SUB: 9. write(Memoria[MAR]) \(\leftarrow\) MBR – Se escribe el resultado.

5.10.2.2 Instrucciones con un operando JMP y Jxx:

Salto incondicional y condicionales (Dirección) 4. MAR \(\leftarrow\) IP – Se obtiene la dirección del salto. 5. MBR \(\leftarrow\) read(Memoria[MAR]); IP \(\leftarrow\) IP + 1 – Se lee la dirección de destino y se incrementa IP.

Si es salto incondicional JMP : 6. JMP: IP \(\leftarrow\) MBR

Si es salto condicional Jxx : 6. Jxx: Si se cumple la condición del flag xx, IP \(\leftarrow\) MBR; en caso contrario, continúa con la siguiente instrucción.

Tabla de condiciones en las instrucciones Jxx el parámetro xx representa una combinación de los flags de estado. La negación de un flag se indica con la letra N.

Instrucción Acción
JZ Dirección Salta a Dirección si Z = 1
JNZ Dirección Salta a Dirección si Z = 0
JC Dirección Salta a Dirección si C = 1
JNC Dirección Salta a Dirección si C = 0
JS Dirección Salta a Dirección si S = 1
JNS Dirección Salta a Dirección si S = 0
JO Dirección Salta a Dirección si O = 1
JNO Dirección Salta a Dirección si O = 0

5.10.2.3 Instrucciones sin operandos

Instruccion de control CPU HLT 4. HLT – Detiene la ejecución de la CPU.