Articulo de referencia

Arquitectura del conjunto de instrucciones

Una arquitectura de conjunto de instrucciones ( ISA ) es un modelo abstracto que define la interfaz programable de la CPU de una computadora, definiendo cómo el software interac...

Una arquitectura de conjunto de instrucciones ( ISA ) es un modelo abstracto que define la interfaz programable de la CPU de una computadora, definiendo cómo el software interactúa con el hardware. [ 1 ] Un dispositivo (es decir, la CPU) que interpreta las instrucciones descritas por una ISA es una implementación de dicha ISA. Generalmente, se utiliza la misma ISA para una familia de dispositivos CPU relacionados.

En general, un conjunto de instrucciones (ISA) define las instrucciones , los tipos de datos , los registros y la interfaz de programación para gestionar la memoria principal, como los modos de direccionamiento , la memoria virtual y los mecanismos de consistencia de memoria . El ISA también incluye el modelo de entrada/salida de la interfaz programable.

Un conjunto de instrucciones (ISA) especifica el comportamiento implícito del código máquina que se ejecuta en una implementación de dicho ISA, de forma independiente de las características de la implementación, lo que proporciona compatibilidad binaria entre implementaciones. Esto permite la existencia de múltiples implementaciones de un ISA que difieren en características como el rendimiento , el tamaño físico y el coste (entre otras), pero que son capaces de ejecutar el mismo código máquina. De esta forma, una máquina de menor rendimiento y menor coste puede sustituirse por una de mayor coste y rendimiento sin necesidad de reemplazar el software. Asimismo, permite la evolución de las microarquitecturas de las implementaciones de dicho ISA, de modo que una implementación más reciente y de mayor rendimiento pueda ejecutar software compatible con generaciones anteriores de implementaciones.

Si un sistema operativo mantiene una interfaz binaria de aplicación (ABI) estándar y compatible para un conjunto de instrucciones (ISA) específico, el código máquina se ejecutará en futuras implementaciones de ese ISA y sistema operativo. Sin embargo, si un ISA admite la ejecución de varios sistemas operativos, no garantiza que el código máquina de un sistema operativo se ejecute en otro, a menos que el primer sistema operativo admita la ejecución de código máquina compilado para el otro.

Una arquitectura de conjunto de instrucciones (ISA) puede extenderse añadiendo instrucciones u otras funcionalidades, o bien, admitiendo direcciones y valores de datos mayores; una implementación de la ISA extendida podrá seguir ejecutando código máquina para versiones de la ISA que no incluyan dichas extensiones. El código máquina que utilice estas extensiones solo se ejecutará en implementaciones que las admitan.

La compatibilidad binaria que proporcionan convierte a las arquitecturas de conjunto de instrucciones (ISA) en una de las abstracciones más fundamentales de la informática .

Descripción general

La arquitectura del conjunto de instrucciones se distingue de la microarquitectura , que es el conjunto de técnicas de diseño del procesador utilizadas, en un procesador específico, para implementar dicho conjunto de instrucciones. Los procesadores con diferentes microarquitecturas pueden compartir un conjunto de instrucciones común. Por ejemplo, el Intel Pentium y el AMD Athlon implementan versiones casi idénticas del conjunto de instrucciones x86 , pero sus diseños internos son radicalmente diferentes.

El concepto de arquitectura , distinto del diseño de una máquina específica, fue desarrollado por Fred Brooks en IBM durante la fase de diseño del System/360 .

Antes de NPL [System/360], los diseñadores de computadoras de la compañía tenían libertad para cumplir con los objetivos de costos no solo seleccionando tecnologías, sino también mediante mejoras funcionales y arquitectónicas. El objetivo de compatibilidad de SPREAD, en cambio, postulaba una arquitectura única para una serie de cinco procesadores que abarcaban un amplio rango de costos y rendimiento. Ninguno de los cinco equipos de diseño de ingeniería podía contar con la posibilidad de realizar ajustes en las especificaciones arquitectónicas para facilitar el logro de los objetivos de costo y rendimiento. [ 2 ] : p.137

Algunas máquinas virtuales que admiten bytecode como su conjunto de instrucciones, como Smalltalk , la máquina virtual Java y el Common Language Runtime de Microsoft , implementan esto traduciendo el bytecode de las rutas de código más utilizadas a código máquina nativo. Además, estas máquinas virtuales ejecutan las rutas de código menos utilizadas mediante interpretación (véase: compilación Just-in-Time ). Transmeta implementó el conjunto de instrucciones x86 sobre procesadores de instrucciones muy largas (VLIW) de esta manera.

Clasificación de las ISA

Una ISA puede clasificarse de varias maneras. Una clasificación común es por complejidad arquitectónica . Un ordenador con conjunto de instrucciones complejo (CISC) tiene muchas instrucciones especializadas, algunas de las cuales rara vez se utilizan en programas prácticos. Un ordenador con conjunto de instrucciones reducido (RISC) simplifica el procesador implementando eficientemente solo las instrucciones que se utilizan con frecuencia en los programas, mientras que las operaciones menos comunes se implementan como subrutinas, compensando así el tiempo de ejecución adicional del procesador resultante con su uso poco frecuente. [ 3 ]

Otros tipos incluyen las arquitecturas VLIW y las arquitecturas estrechamente relacionadas de palabra de instrucción larga (LIW) y computación de instrucciones explícitamente paralelas (EPIC). Estas arquitecturas buscan explotar el paralelismo a nivel de instrucción con menos hardware que RISC y CISC, haciendo que el compilador sea responsable de la emisión y la planificación de las instrucciones. [ 4 ]

Se han estudiado arquitecturas con incluso menor complejidad, como la computadora con conjunto mínimo de instrucciones (MISC) y la computadora con un conjunto de instrucciones (OISC). Estos son tipos teóricamente importantes, pero no se han comercializado. [ 5 ] [ 6 ]

Instrucciones

El lenguaje máquina se construye a partir de instrucciones o enunciados discretos . En la arquitectura de procesamiento, una instrucción determinada puede especificar:

  • código de operación (la instrucción que se va a realizar), por ejemplo, agregar, copiar, probar
  • cualquier operando explícito:
registros
valores literales/constantes
modos de direccionamiento utilizados para acceder a la memoria

Las operaciones más complejas se construyen combinando estas instrucciones simples, que se ejecutan secuencialmente o según lo indiquen las instrucciones de control de flujo .

Tipos de instrucciones

Algunos ejemplos de operaciones comunes a muchos conjuntos de instrucciones son:

Manejo de datos y operaciones de memoria

  • Establecer un registro o memoria a un valor constante fijo.
  • Copiar datos de un lugar a otro. Esta operación se suele denominar carga o almacenamiento . Aunque la instrucción de máquina se suele llamar movimiento , el término puede resultar engañoso, ya que el origen permanece inalterado. Estas operaciones se utilizan para almacenar el contenido de un registro, el contenido de otra ubicación de memoria o el resultado de un cálculo, o para recuperar datos almacenados y realizar un cálculo posteriormente.
  • Leer o escribir datos desde dispositivos de hardware.

Operaciones aritméticas y lógicas

  • Sumar , restar , multiplicar o dividir los valores de dos registros, colocando el resultado en un registro, posiblemente estableciendo uno o más códigos de condición en un registro de estado . [ 7 ]
    • incremento ,Disminución en algunos conjuntos de instrucciones, lo que ahorra la obtención de operandos en casos triviales.
  • Realizar operaciones bit a bit , por ejemplo, tomar la conjunción y la disyunción de los bits correspondientes en un par de registros, tomar la negación de cada bit en un registro.
  • Comparar dos valores en registros (por ejemplo, para ver si uno es menor o si son iguales).
  • Instrucciones de punto flotante para operaciones aritméticas con números de punto flotante. [ 7 ]

Operaciones de control de flujo

  • Acceda a otra sección del programa y ejecute las instrucciones allí.
  • Si se cumple una determinada condición, se realizará una ramificación condicional a otra ubicación.
  • Ramificar indirectamente a otra ubicación.
  • Saltar una o más instrucciones, dependiendo de las condiciones (una bifurcación condicional permite avanzar un número fijo de instrucciones).
  • Trampa Provoca explícitamente una interrupción de software , ya sea de forma condicional o incondicional.
  • Llamar a otro bloque de código, guardando la ubicación de la siguiente instrucción como punto de retorno.
  • Regresar de una llamada anterior recuperando la ubicación guardada.

Instrucciones del coprocesador

  • Cargar/almacenar datos desde y hacia un coprocesador o intercambiarlos con los registros de la CPU.
  • Realizar operaciones de coprocesador.
Algunos ejemplos de instrucciones de coprocesador incluyen las del módulo Vector de IBM 3090 y el Intel 8087 .

Instrucciones detalladas

Los procesadores pueden incluir instrucciones complejas en su conjunto de instrucciones. Una sola instrucción compleja realiza una acción que en otros ordenadores requeriría muchas instrucciones o una subrutina . Estas instrucciones se caracterizan por realizar varios pasos, controlar múltiples unidades funcionales o, en general, ser más complejas que la mayoría de las instrucciones simples implementadas por el procesador. Algunos ejemplos de instrucciones complejas son:

Las instrucciones elaboradas son más comunes en los conjuntos de instrucciones CISC que en los RISC, aunque estos últimos también pueden incluirlas. Generalmente, los conjuntos de instrucciones RISC no incluyen operaciones ALU con operandos de memoria ni instrucciones para mover grandes bloques de memoria, pero la mayoría incluye instrucciones SIMD o vectoriales que realizan la misma operación aritmética en múltiples datos simultáneamente. Las instrucciones SIMD permiten manipular grandes vectores y matrices en un tiempo mínimo. Facilitan la paralelización de algoritmos comúnmente utilizados en el procesamiento de sonido, imagen y vídeo. Diversas implementaciones SIMD se han comercializado bajo nombres como MMX , 3DNow! y AltiVec .

Codificación de instrucciones

Una instrucción puede tener varios campos que identifican la operación lógica, e incluir direcciones de origen y destino, así como valores constantes. Este es el caso de la instrucción MIPS "Add Immediate", que permite seleccionar los registros de origen y destino e incluir una pequeña constante.

En las arquitecturas tradicionales, una instrucción incluye un código de operación que especifica la operación a realizar, como agregar el contenido de la memoria a un registro , y cero o más especificadores de operandos , que pueden especificar registros , ubicaciones de memoria o datos literales. Los especificadores de operandos pueden tener modos de direccionamiento que determinan su significado o pueden estar en campos fijos. En las arquitecturas de instrucciones muy largas (VLIW), que incluyen muchas arquitecturas de microcódigo , se especifican múltiples códigos de operación y operandos simultáneos en una sola instrucción.

Algunos conjuntos de instrucciones poco comunes no tienen un campo de código de operación, como las arquitecturas activadas por transporte (TTA), solo operandos.

La mayoría de las máquinas de pila tienen conjuntos de instrucciones de " 0 operandos " en los que las operaciones aritméticas y lógicas carecen de campos especificadores de operandos; solo las instrucciones que insertan operandos en la pila de evaluación o que los extraen de la pila para asignarlos a variables tienen especificadores de operandos. El conjunto de instrucciones realiza la mayoría de las acciones de la ALU con operaciones posfijas ( notación polaca inversa ) que funcionan únicamente en la pila de expresiones , no en los registros de datos ni en celdas arbitrarias de la memoria principal. Esto puede ser muy conveniente para compilar lenguajes de alto nivel, ya que la mayoría de las expresiones aritméticas se pueden traducir fácilmente a notación posfija. [ 8 ]

Instrucciones condicionales

Las instrucciones condicionales suelen tener un campo de predicado: unos pocos bits que codifican la condición específica que provoca que se realice una operación en lugar de no realizarla. Por ejemplo, una instrucción de salto condicional transferirá el control si la condición es verdadera, de modo que la ejecución continúe a una parte diferente del programa, y ​​no transferirá el control si la condición es falsa, de modo que la ejecución continúe secuencialmente. Algunos conjuntos de instrucciones también tienen movimientos condicionales, de modo que el movimiento se ejecutará y los datos se almacenarán en la ubicación de destino si la condición es verdadera, y no se ejecutará y la ubicación de destino no se modificará si la condición es falsa. De manera similar, IBM z/Architecture tiene una instrucción de almacenamiento condicional. Algunos conjuntos de instrucciones incluyen un campo de predicado en cada instrucción. Tener predicados en las instrucciones se denomina predicación y puede incluir saltos condicionales, como bfen SuperH . [ 9 ]

Instrucciones de control de bucle

Muchas arquitecturas tienen instrucciones de salto condicional diseñadas para controlar bucles. Normalmente, actualizan y prueban un registro. Algunos ejemplos son:

IBM 7070
Palabra de índice decrementada de rama (BDX)
Palabra de índice incremental de rama (BIX)
IBM 7090
Transferencia en índice (TIX)
Transferencia en índice alto (TXH)
Transferencia con índice bajo o igual (TXL)
Sistema IBM/360
Sucursal en recuento (BCT, BCTR)
Ramificación en índice alto (BXH)
Ramificación por índice bajo o igual (BXLE)

Número de operandos

Los conjuntos de instrucciones pueden clasificarse según el número máximo de operandos especificados explícitamente en las instrucciones.

(En los ejemplos que siguen, a , b y c son direcciones (directas o calculadas) que hacen referencia a celdas de memoria, mientras que reg1 y así sucesivamente hacen referencia a registros de la máquina).

C = A+B
  • Máquinas de 0 operandos ( máquinas de direcciones cero ), también llamadas máquinas de pila : Todas las operaciones aritméticas se realizan utilizando las dos primeras posiciones de la pila: [ 10 ]push a , push b, add, pop c.
    • C = A+Bnecesita cuatro instrucciones . [ 11 ] Para las máquinas de pila, los términos "operando 0" y "dirección cero" se aplican a las instrucciones aritméticas, pero no a todas las instrucciones, ya que las instrucciones push y pop de 1 operando se utilizan para acceder a la memoria.
  • Las máquinas de un operando ( máquinas de una dirección ), llamadas máquinas acumuladoras , incluyen las primeras computadoras y muchos microcontroladores pequeños : la mayoría de las instrucciones especifican un único operando derecho (es decir, una constante, un registro o una ubicación de memoria), con el acumulador implícito como operando izquierdo (y el destino si lo hay): load a, add b, store c.
    • C = A+Bnecesita tres instrucciones . [ 11 ]
  • De dos operandos: muchas máquinas CISC y RISC entran en esta categoría:
    • CISC — move Aa C ; luego add Ba C.
      • C = A+BSe necesitan dos instrucciones . Esto efectivamente "almacena" el resultado sin una instrucción de almacenamiento explícita .
    • CISC — A menudo, las máquinas están limitadas a un operando de memoria por instrucción: load a,reg1; add b,reg1; store reg1,c; Esto requiere un par de carga/almacenamiento para cualquier movimiento de memoria, independientemente de si el addresultado es un aumento almacenado en un lugar diferente, como en C = A+B, o en la misma ubicación de memoria: A = A+B.
      • C = A+Bnecesita tres instrucciones .
    • RISC — Requeriendo cargas de memoria explícitas, las instrucciones serían: load a,reg1; load b,reg2; add reg1,reg2; store reg2,c.
      • C = A+Bnecesita cuatro instrucciones .
  • 3 operandos, lo que permite una mejor reutilización de los datos: [ 12 ]
    • CISC — Se convierte en una sola instrucción:add a,b,c
      • C = A+Bnecesita una instrucción .
    • CISC — O, en máquinas limitadas a dos operandos de memoria por instrucción, move a,reg1; add reg1,b,c;
      • C = A+Bnecesita dos instrucciones .
    • RISC: las instrucciones aritméticas usan solo registros, por lo que se necesitan instrucciones explícitas de carga/almacenamiento de 2 operandos: load a,reg1; load b,reg2; add reg1+reg2->reg3; store reg3,c;
      • C = A+Bnecesita cuatro instrucciones .
      • A diferencia de los sistemas de 2 o 1 operando, este deja los tres valores a, b y c en los registros disponibles para su posterior reutilización. [ 12 ]
  • Más operandos: algunas máquinas CISC permiten una variedad de modos de direccionamiento que admiten más de 3 operandos (registros o accesos a memoria), como la instrucción de evaluación de polinomios "POLY" de VAX .

Debido a la gran cantidad de bits necesarios para codificar los tres registros de una instrucción de 3 operandos, las arquitecturas RISC que tienen instrucciones de 16 bits son invariablemente diseños de 2 operandos, como Atmel AVR, TI MSP430 y algunas versiones de ARM Thumb . Las arquitecturas RISC que tienen instrucciones de 32 bits suelen ser diseños de 3 operandos, como las arquitecturas ARM , AVR32 , MIPS , Power ISA y SPARC . Sin embargo, incluso las arquitecturas RISC de 3 operandos tendrán, a un costo considerable, instrucciones de multiplicación y suma fusionadas de 4 operandos por necesidad, debido a la mayor precisión que proporcionan. Ejemplos modernos incluyen Power ISA y RISC-V .

Cada instrucción especifica explícitamente un número determinado de operandos (registros, ubicaciones de memoria o valores inmediatos) . Algunas instrucciones proporcionan uno o ambos operandos de forma implícita, por ejemplo, almacenándolos en la parte superior de la pila o en un registro implícito. Si algunos operandos se proporcionan implícitamente, se necesitan especificar menos operandos en la instrucción. Cuando un "operando de destino" especifica explícitamente el destino, se debe proporcionar un operando adicional. Por consiguiente, el número de operandos codificados en una instrucción puede diferir del número de argumentos matemáticamente necesarios para una operación lógica o aritmética (la aridad ). Los operandos se codifican en la representación del "código de operación" de la instrucción o bien se proporcionan como valores o direcciones después del código de operación.

Registrar presión

La presión de registros mide la disponibilidad de registros libres en cualquier momento durante la ejecución del programa. La presión de registros es alta cuando se utiliza un gran número de registros disponibles. Por lo tanto, cuanto mayor sea la presión de registros, con mayor frecuencia se deberá volcar el contenido de los registros a la caché o la memoria, lo que, dada su menor velocidad, conlleva un alto costo. Aumentar el número de registros en una arquitectura disminuye la presión de registros, pero aumenta el costo. [ 13 ]

Mientras que los conjuntos de instrucciones embebidas como Thumb sufren una presión de registro extremadamente alta debido a que tienen conjuntos de registros pequeños, las arquitecturas RISC de propósito general como MIPS y Alpha disfrutan de una baja presión de registro. Las arquitecturas CISC como x86-64 ofrecen una baja presión de registro a pesar de tener conjuntos de registros más pequeños. Esto se debe a los numerosos modos de direccionamiento y optimizaciones (como el direccionamiento de subregistros, operandos de memoria en instrucciones ALU, direccionamiento absoluto, direccionamiento relativo al contador de programa y desbordamientos de registro a registro) que ofrecen las arquitecturas CISC. [ 14 ]

Duración de la instrucción

El tamaño o longitud de una instrucción varía ampliamente, desde tan solo cuatro bits en algunos microcontroladores hasta muchos cientos de bits en algunos sistemas VLIW . Los procesadores utilizados en computadoras personales , mainframes y supercomputadoras tienen tamaños mínimos de instrucción entre 8 y 64 bits. La instrucción más larga posible en x86 es de 15 bytes (120 bits). [ 15 ] Dentro de un conjunto de instrucciones, diferentes instrucciones pueden tener diferentes longitudes. En algunas arquitecturas, especialmente en la mayoría de las computadoras con conjunto de instrucciones reducido (RISC),Las instrucciones tienen una longitud fija , que generalmente corresponde al tamaño de palabra de esa arquitectura . En otras arquitecturas, las instrucciones tienen longitud variable , generalmente múltiplos enteros de un byte o media palabra . Algunas, como ARM con extensión Thumb, tienen codificación variable mixta , es decir, dos codificaciones fijas, generalmente de 32 y 16 bits, donde las instrucciones no se pueden mezclar libremente, sino que deben alternarse en una bifurcación (o límite de excepción en ARMv8).

Las instrucciones de longitud fija son menos complicadas de manejar que las instrucciones de longitud variable por varias razones (por ejemplo, no es necesario comprobar si una instrucción abarca una línea de caché o un límite de página de memoria virtual, [ 12 ] ), y por lo tanto son algo más fáciles de optimizar para la velocidad.

Densidad de código

A principios de la década de 1960, la memoria principal de los ordenadores era cara y muy limitada, incluso en los mainframes. Minimizar el tamaño de un programa para asegurar que cupiera en la memoria limitada era fundamental. Por lo tanto, el tamaño de las instrucciones necesarias para realizar una tarea específica, la densidad del código , era una característica importante de cualquier conjunto de instrucciones. Siguió siendo importante en las memorias inicialmente minúsculas de los miniordenadores y, posteriormente, de los microprocesadores. La densidad sigue siendo importante hoy en día para las aplicaciones de teléfonos inteligentes, las aplicaciones descargadas en navegadores a través de conexiones a Internet lentas y en las ROM para aplicaciones integradas. Una ventaja más general de una mayor densidad es la mejora de la eficacia de las cachés y la precarga de instrucciones.

Los ordenadores con alta densidad de código suelen tener instrucciones complejas para la entrada de procedimientos, retornos parametrizados, bucles, etc. (de ahí que se les denomine retroactivamente Ordenadores con Conjunto de Instrucciones Complejas , CISC ). Sin embargo, las instrucciones "CISC" más típicas o frecuentes simplemente combinan una operación básica de la ALU, como "sumar", con el acceso a uno o más operandos en memoria (utilizando modos de direccionamiento como directo, indirecto, indexado, etc.). Ciertas arquitecturas pueden permitir dos o tres operandos (incluido el resultado) directamente en memoria o pueden realizar funciones como el incremento automático de punteros, etc. Los conjuntos de instrucciones implementados por software pueden tener instrucciones aún más complejas y potentes.

Las computadoras con conjunto de instrucciones reducido ( RISC ) se implementaron ampliamente durante un período de rápido crecimiento de los subsistemas de memoria. Estas computadoras sacrifican la densidad del código para simplificar los circuitos de implementación e intentan aumentar el rendimiento mediante frecuencias de reloj más altas y un mayor número de registros. Una instrucción RISC suele realizar una sola operación, como la suma de registros o la carga de datos desde una ubicación de memoria a un registro. Un conjunto de instrucciones RISC normalmente tiene una longitud fija , mientras que un conjunto de instrucciones CISC típico tiene instrucciones de longitud muy variable. Sin embargo, dado que las computadoras RISC normalmente requieren más instrucciones, y a menudo más largas, para implementar una tarea determinada, su uso del ancho de banda del bus y de la memoria caché es inherentemente menos óptimo.

Ciertas arquitecturas RISC integradas, como Thumb y AVR32, suelen presentar una densidad muy alta debido a una técnica denominada compresión de código. Esta técnica empaqueta dos instrucciones de 16 bits en una palabra de 32 bits, que luego se desempaqueta en la etapa de decodificación y se ejecuta como dos instrucciones. [ 16 ]

Las computadoras con conjunto mínimo de instrucciones (MISC) suelen ser una forma de máquina de pila , donde hay pocas instrucciones separadas (8-32), de modo que se pueden incluir varias instrucciones en una sola palabra de máquina. Este tipo de núcleos a menudo requieren poco silicio para su implementación, por lo que se pueden realizar fácilmente en una FPGA ( matriz de puertas programables en campo ) o en una arquitectura multinúcleo . La densidad de código de MISC es similar a la de RISC; el aumento en la densidad de instrucciones se compensa con la necesidad de utilizar más instrucciones primitivas para realizar una tarea. [ 17 ]

Se ha investigado la compresión de archivos ejecutables como mecanismo para mejorar la densidad del código. Las matemáticas de la complejidad de Kolmogorov describen los desafíos y las limitaciones de este enfoque.

En la práctica, la densidad del código también depende del compilador . La mayoría de los compiladores optimizadores ofrecen opciones para controlar si se optimiza la generación de código para la velocidad de ejecución o para la densidad del código. Por ejemplo, GCC permite -Osoptimizar para obtener un código máquina pequeño y, -O3a costa de un código máquina más grande, optimizar para la velocidad de ejecución.

Representación

Las instrucciones que constituyen un programa rara vez se especifican utilizando su forma interna numérica ( código máquina ); pueden ser especificadas por programadores utilizando un lenguaje ensamblador o, más comúnmente, pueden ser generadas a partir de lenguajes de programación de alto nivel por compiladores . [ 18 ]

Diseño

El diseño de conjuntos de instrucciones es un tema complejo. La historia del microprocesador se divide en dos etapas. La primera fue la del CISC (computadora con conjunto de instrucciones complejo), que contaba con numerosas instrucciones diferentes. Sin embargo, en la década de 1970, empresas como IBM investigaron y descubrieron que muchas instrucciones podían eliminarse. El resultado fue el RISC (computadora con conjunto de instrucciones reducido), una arquitectura que utiliza un conjunto de instrucciones más pequeño. Un conjunto de instrucciones más simple puede ofrecer mayor velocidad, menor tamaño del procesador y menor consumo de energía. Por otro lado, un conjunto más complejo puede optimizar las operaciones comunes, mejorar la eficiencia de la memoria y la caché , o simplificar la programación.

Algunos diseñadores de conjuntos de instrucciones reservan uno o más códigos de operación para algún tipo de llamada al sistema o interrupción de software . Por ejemplo, MOS Technology 6502 usa 00 H , Zilog Z80 usa los ocho códigos C7, CF, D7, DF, E7, EF, F7, FF H [ 19 ] , mientras que Motorola 68000 usa códigos en el rango 4E40 H - 4E4F H. [ 20 ]

Las máquinas virtuales rápidas son mucho más fáciles de implementar si un conjunto de instrucciones cumple con los requisitos de virtualización de Popek y Goldberg .

El deslizamiento NOP utilizado en la programación con conciencia de inmunidad es mucho más fácil de implementar si el estado "no programado" de la memoria se interpreta como un NOP .

En sistemas con múltiples procesadores, los algoritmos de sincronización sin bloqueo son mucho más fáciles de implementar si el conjunto de instrucciones incluye soporte para algo como " fetch-and-add ", " load-link/store-conditional " (LL/SC) o "atomic compare-and-swap ".

Implementación del conjunto de instrucciones

Un conjunto de instrucciones determinado puede implementarse de diversas maneras. Todas las implementaciones de un conjunto de instrucciones específico ofrecen el mismo modelo de programación , y todas pueden ejecutar los mismos programas. Las distintas formas de implementar un conjunto de instrucciones presentan diferentes ventajas y desventajas en cuanto a coste, rendimiento, consumo de energía, tamaño, etc.

Al diseñar la microarquitectura de un procesador, los ingenieros utilizan bloques de circuitos electrónicos cableados (a menudo diseñados por separado), como sumadores, multiplexores, contadores, registros, ALU, etc. Posteriormente, se suele utilizar algún tipo de lenguaje de transferencia de registros para describir la decodificación y secuenciación de cada instrucción de un conjunto de instrucciones (ISA) utilizando esta microarquitectura física. Existen dos formas básicas de construir una unidad de control para implementar esta descripción (aunque muchos diseños utilizan soluciones intermedias o de compromiso):

  1. Algunos diseños de computadoras integran de forma permanente la decodificación y secuenciación del conjunto completo de instrucciones (al igual que el resto de la microarquitectura).
  2. Otros diseños emplean rutinas o tablas de microcódigo (o ambas) para lograr esto, utilizando ROM o RAM grabables ( memoria de control grabable ), PLA o ambas.

Algunos diseños de CPU microcodificadas con una memoria de control escribible la utilizan para permitir que se cambie el conjunto de instrucciones (por ejemplo, el procesador Rekursiv y el Imsys Cjip ). [ 21 ]

Las CPU diseñadas para la computación reconfigurable pueden utilizar matrices de puertas programables en campo (FPGA).

Un conjunto de instrucciones (ISA) también puede emularse mediante software con un intérprete . Naturalmente, debido a la sobrecarga de la interpretación, esto resulta más lento que ejecutar programas directamente en el hardware emulado, a menos que el hardware que ejecuta el emulador sea mucho más rápido. Actualmente, es práctica común que los proveedores de nuevos ISA o microarquitecturas pongan a disposición de los desarrolladores de software emuladores antes de que la implementación en hardware esté lista.

A menudo, los detalles de la implementación tienen una fuerte influencia en las instrucciones particulares seleccionadas para el conjunto de instrucciones. Por ejemplo, muchas implementaciones de la tubería de instrucciones solo permiten una única carga o almacenamiento de memoria por instrucción, lo que da lugar a una arquitectura de carga-almacenamiento (RISC). Por ejemplo, algunas formas iniciales de implementar la tubería de instrucciones dieron lugar a una ranura de retardo .

Las exigencias del procesamiento de señales digitales de alta velocidad han impulsado la dirección opuesta, obligando a que las instrucciones se implementen de una manera particular. Por ejemplo, para realizar filtros digitales con la suficiente rapidez, la instrucción MAC en un procesador de señales digitales (DSP) típico debe utilizar una arquitectura tipo Harvard que pueda obtener una instrucción y dos palabras de datos simultáneamente, y requiere un multiplicador de multiplicación-acumulación de un solo ciclo .

Véase también

Referencias

  1. "GLOSARIO: Arquitectura del conjunto de instrucciones (ISA)" . arm.com . Archivado del original el 11 de noviembre de 2023. Consultado el 3 de febrero de 2024 .
  2. Pugh, Emerson W.; Johnson, Lyle R.; Palmer, John H. (1991). IBM's 360 and Early 370 Systems . MIT Press. ISBN 0-262-16123-0.
  3. Chen, Crystal; Novick, Greg; Shimano, Kirk (16 de diciembre de 2006). "Arquitectura RISC: RISC vs. CISC" . cs.stanford.edu . Archivado del original el 21 de febrero de 2015. Recuperado el 21 de febrero de 2015 .
  4. Schlansker, Michael S.; Rau, B. Ramakrishna (febrero de 2000). "EPIC: Computación de instrucciones explícitamente paralelas". Computer . 33 (2): 37– 45. doi : 10.1109/2.820037 .
  5. Shaout, Adnan; Eldos, Taisir (verano de 2003). "Sobre la clasificación de la arquitectura de computadoras" . Revista Internacional de Ciencia y Tecnología . 14 : 3. Recuperado el 2 de marzo de 2023 .
  6. Gilreath, William F.; Laplante, Phillip A. (6 de diciembre de 2012). Arquitectura de computadoras: una perspectiva minimalista . Springer Science+Business Media . ISBN 978-1-4615-0237-1.
  7. 1 2 Hennessy y Patterson 2003 , pág. 108.
  8. Durand, Paul. "Arquitectura del conjunto de instrucciones (ISA)" . Introducción a la informática CS 0 .
  9. "Resumen del conjunto de instrucciones Renesas SH" . Shared-ptr.com . Consultado el 16 de junio de 2026 .
  10. Hennessy y Patterson 2003 , pág. 92.
  11. 1 2 Hennessy y Patterson 2003 , pág. 93.
  12. 1 2 3 Cocke, John; Markstein, Victoria (enero de 1990). "La evolución de la tecnología RISC en IBM" (PDF) . IBM Journal of Research and Development . 34 (1): 4– 11. doi : 10.1147/rd.341.0004 . Recuperado el 6 de febrero de 2026 .
  13. Page, Daniel (2009). "11. Compiladores". Una introducción práctica a la arquitectura de computadoras . Springer. pág. 464. Bibcode : 2009pica.book.....P . ISBN  978-1-84882-255-9.
  14. Venkat, Ashish; Tullsen, Dean M. (2014). Aprovechamiento de la diversidad de ISA: Diseño de un multiprocesador de chip con ISA heterogénea . 41.º Simposio Internacional Anual sobre Arquitectura de Computadoras.
  15. "Manual del desarrollador de software para arquitecturas Intel® 64 e IA-32" . Intel Corporation . Consultado el 5 de octubre de 2022 .
  16. Weaver, Vincent M.; McKee, Sally A. (2009). Problemas de densidad de código para nuevas arquitecturas . Conferencia Internacional IEEE sobre Diseño de Computadoras. CiteSeerX 10.1.1.398.1967 . doi : 10.1109/ICCD.2009.5413117 . 
  17. "RISC vs. CISC" . cs.stanford.edu . Consultado el 18 de diciembre de 2021 .
  18. Hennessy y Patterson 2003 , pág. 120.
  19. Ganssle, Jack (26 de febrero de 2001). "Depuración proactiva" . embedded.com .
  20. Manual del usuario de los microprocesadores M68000 de 8, 16 y 32 bits (9.ª ed.). TRAP: Motorola. 1993. pág. 4-188.  
  21. "Grandes microprocesadores del pasado y del presente (V 13.4.0)" . cpushack.net . Consultado el 25 de julio de 2014 .

Lecturas adicionales

  • Bowen, Jonathan P. (julio-agosto de 1985). "Tarjetas de programación de microprocesadores estándar". Microprocesadores y microsistemas . 9 (6): 274– 290. doi : 10.1016/0141-9331(85)90116-4 .
  • Hennessy, John L.; Patterson , David A. (2003). Arquitectura de computadoras: un enfoque cuantitativo (Tercera  ed.). Morgan Kaufmann Publishers . ISBN 1-55860-724-2. Consultado el 4 de marzo de 2023 .
  • Logotipo de Wikimedia CommonsContenido multimedia relacionado con las arquitecturas de conjuntos de instrucciones en Wikimedia Commons.
  • Archivos de texto de programación: Tarjetas de resumen de instrucciones de Bowen
  • Página de Mark Smotherman sobre diseños históricos de computadoras