- Conjunto de instrucciones
-
Conjunto de instrucciones
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 (Specific Instruction Set Computer).
La arquitectura del conjunto de instrucciones (ISA) se emplea a veces para distinguir este conjunto de características de la microarquitectura, que son los elementos y técnicas que se emplean para implementar el conjunto de instrucciones. Entre estos elementos se encuentras 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 internos completamente opuestos.
Contenido
El lenguaje máquina
El lenguaje maquina esta construido a partir de los estados discretos o instrucciones. En la arquitectura de procesamiento, una instrucción dada puede especificar:
* Registros particulares para operaciones aritméticas, de direccionamiento o de control. * Ubicaciones particulares de memoria * Modos de direccionamiento para interpretar operandos
Las operaciones mas complejas se construyen a partir de estas, que(en una maquina Von Neumann) se ejecutan secuencialmente, o segun el control de flujo.
Algunas de las operaciones disponibles incluidas en la mayoria de conjuntos son:
* Desplazamiento * Establecer un registro a un valor constante * Mover datos desde una posición de memoria a un registro y viceversa. Esto se realia para obtener datos para operaciones matemáticas y su almacenamiento. * Leer y escribir datos desde dispositivos de hardware * Operaciones matemáticas * Sumar, restar, multiplicar o dividir dos registros y colocar el resultado en alguno de ellos. * Realizar operaciones bit a bit, teniendo el AND y el OR de cada bit en un par de registros, o el NOT de cada bit en un registro. * Comparar dos valores que se encuentren en registros(por ejemplo, si son iguales o si uno es mayor que otro) * Afectan al flujo de programa * Saltar a otra posición del programa y ejecutar instrucciones allí. * Saltar a otra posición si se cumple cierta condición * Saltar a otra posición, pero salvando la posición actual para poder volver (realizar una llamada, por ejemplo call printf)
Algunos ordenadores incluyen instrucciones "complejas". Dichas instrucciones pueden tomar muchas instrucciones en otros equipos. Estas se caracterizan por intrucciones que necesitan varios pasos, como el control de múltiples unidades funcionales. Algunos ejemplos son:
* Ahorro de regsitros en la pila * Mover grandes bloques de memoria * Complejas operaciones and/or con aritética de coma flotante, tales como el seno o la raíz cuadrada. * Instrucciones que combinan ALU con un operando de la memoria mas que de registros.
Un tipo complejo de la instrucción que ha llegado a ser particularmente popular recientemente es SIMD o Simple_Instruccion_Multiplos_Datos, una operación que realice la misma operación aritmética en pedazos múltiples de datos al mismo tiempo. SIMD tienen la capacidad de manipular vectores y matrices grandes en tiempo mínimo. Las instrucciones de SIMD permiten la paralelización fácil de los algoritmos implicados comúnmente en sonido, imagen, y el proceso video. Varias implementaciones de SIMD se han traído al mercado bajo nombres comerciales tales como MMX, 3DNow! y AltiVec.
El diseño de sistemas de instrucción es una edición compleja. Había dos etapas en la historia para el microprocesador. El primer era el CISC (Complex Instruction Set Computer) que tenía muchas instrucciones diferentes. En los años 70 IBM hicieron la investigación y encontraron que muchas instrucciones en el sistema podrían ser eliminadas. El resultado era el RISC (Reduced Instruction Set Computer), una arquitectura que utiliza un sistema más pequeño de instrucciones. Un conjunto de instrucción más simple puede ofrecer el potencial para velocidades más altas, tamaño reducido del procesador, y consumo de energía reducido. Sin embargo, un conjunto más complejo puede optimizar operaciones comunes, mejorar memoria/eficiencia de cache, o simplificar la programación.
Implementacion del conjunto de intrucciones
Cualquier conjunto de instrucciónes se puede implementar de varias maneras. Todas las maneras de implementar un conjunto de instrucciónes dan el mismo modelo programado, y todas pueden hacer funcionar los mismos ejecutables binarios. Las varias maneras de implementar un conjunto de instrucciónes dan diversas compensaciones entre el coste, el funcionamiento, el consumo de energía, el tamaño, el etc.
Al diseñar microarquitecturas, los ingenieros usaon bloques de circuitos electrónicos “duramente-conectados” (diseñado a menudo por separado) por ejemplo l, los multiplexores, los contadores, los registros, ALUs etc. Un ciertao tipo del lenguaje de la transferencia de registros es a menudo usado para describir la codificación y la secuencia de cada instrucción de ISA usando esta microarquitectura física.
Hay también algunos nuevos diseños de la CPU que compilan el conjunto de instrucción a un RAM escribible o FLASH dentro de la CPU (tal como el procesador Recursiv y el Imsys Cjip) , o FPGA (computación reconfigurable). Western Digital MCP-1600 es un ejemplo antiguo, usando una ROM dedicada, separada del microcódigo.
ISA se puede también emular en software por un intérprete. Naturalmente, debido a la interpretación de “overhead”, es más lento que ejecutar programas directamente sobre el hardware emulado. Hoy, es práctica para los vendedores de nuevos ISAs o microarchitectures poner emuladores del software a disposición de los gdesarolladores de programas informáticos antes de que la implementacion del hardware sea lista.Los detalles de la implemetación tienen una influencia fuerte en las instrucciones particulares seleccionadas para el conjunto de instrucción. Por ejemplo, muchas implementaciones de la instrucción “pipline” permiten solamente una sola carga de memoria (load) o almacén en memoria (store) por instrucción, llevando a carga-almacena arquitectura (RISC). Por otro ejemplo, algunas maneras de implementar la instrucción “pipline” llevaron a una ranura del retardo.
Las demandas del procesamiento de señal digital de alta velocidad se han empujado en el sentido coontrario- forzando la implementacion de instrucción de manera particular. Por ejemplo, para realizar los filtros digitales es bastante insuficiente, la instrucción del MAC en un procesador típico de señal digital (DSP) se debe implementar usando una arquitectura de Harvard que pueda traer una instrucción y dos palabras de datos simultáneamente, y requiere un solo ciclo.
DISEÑO DEL CONJUNTO DE INSRUCCIONES
La densidad del código En computadoras antiguas, la memoria del programa era costosa, así que minimizar el tamaño de un programa para asegurar que va a caber en la memoria limitada era a menudo central. Así el tamaño combinado de todas las instrucciones necesitó realizar una tarea particular, la densidad del código, era una característica importante de cualquier sistema de instrucción. Las computadoras con alta densidad del código también tenían a menudo instrucciones complejas para la entrada del procedimiento, los retornos parametrizados, los lazos etc . Sin embargo, " instucciones CISC" combinan simplemente una operación básica de la ALU, tal como " add" , con el acceso de uno o más operandos en memoria (usando modos de dirección tales como directo, indirecto, índexado). Ciertas arquitecturas pueden permitir dos o tres operandos (incluido el resultado) directamente en memoria o pueden permitir realizar funciones tales como el incremento automático del puntero.
Las computadoras mínimas del conjunto de instrucciones (MISC) son una forma de máquina apilada, donde hay pocas instrucciones separadas (16-64), para poder caber instrucciones múltiples en una sola palabra de máquina. Éstos tipo de núcleos llevan a menudo poco silicio para implementarse, así que pueden ser observadas fácilmente en un FPGA o en una forma multinucleo. La densidad del código es similar al RISC; la densidad creciente de la instrucción es compensada requiriendo más de las instrucciones primitivas de hacer una tarea.
Características que debe tener un conjunto de instrucciones
Las características que se pretende que tenga un conjunto de instrucciones son cuatro, principalmente:
- Completo: Que se pueda realizar en un tiempo finito cualquier tarea ejecutable con un ordenador (computable o decidible).
- Eficiente: Que permita alta velocidad de cálculo sin exigir una elevada complejidad en su UC y ALU y sin consumir excesivos recursos (memoria), es decir, debe cumplir su tarea en un tiempo razonable minimizando el uso de los recursos.
- Autocontenidas: Esto es, que contengan en sí mismas toda la información necesaria para ejecutarse.
- Independientes: Que no dependan de la ejecución de alguna otra instrucción.
Se puede comprobar que para que un conjunto de instrucciones sea completo solo se necesitan cuatro instrucciones:-> escritura
-> mover a la izquierda una posición y leer
-> mover a la derecha una posición y leer
-> parar
En esta idea se basan las arquitecturas RISC, no obstante, con este conjunto no se puede conseguir la eficiencia del repertorio de instrucciones por lo que en la práctica el conjunto suele ser más amplio en aras de conseguir un mejor rendimiento, tanto en uso de recursos como en consumo de tiempo.Tipos de instrucciones y ejemplos
- Transferencia de datos: Copian datos de un origen a un destino, sin modificar el origen y normalmente sin afectar a los flags o indicadores de condición. Pueden transferir palabras, fracciones de palabras (bytes, media palabra) o bloques completos de n bytes o palabras.
Estas operaciones pueden ser:
-> registro - registro-> registro - memoria
-> memoria - registro
-> memoria - memoria
Nemotécnicos más frecuentes:- move: copia el contenido de un registro(o memoria) a otro.
- store: copia el contenido de un registro a memoria.
- load: copia el contenido de una posición de memoria a un registro.
- move block: copia un bloque de datos de una posición de memoria a otra.
- move multiple: copia del origen en varias posiciones de memoria.
- exchange: intercambia el contenido de dos operandos.
- clear: pone a 0 el destinto. (todos los bits)
- set: pone a 1 el destino. (todos los bits)
- push: introduce un dato en la cabecera de la pila. (indicada por el SP)
- pop: saca un dato de la cabecera de la pila. (indicada por el SP)
- Instrucciones aritmeticas: Son efectuadas por la ALU y suelen cambiar los flags o indicadores de condición.
Nemotécnicos más frecuentes:- add: Suma.
- add with carry: Suma con acarreo.
- subtrack: Resta.
- subtrack with borrow: Resta teniendo en cuenta el adeudo anterior.
- increment: incrementa en 1 un valor.
- decrement: decrementa en 1 un valor.
- multiply: multiplica.
- divide: divide.
- extend: aumenta el operando de tamaño.
- negate: cambia de signo.
- absolute: valor absoluto.
-> Pueden tener instrucciones para tratar con numeros en BCD e incluyen operaciones en coma flotante, lo cual se identifica con una 'f' antes del nombre del nemotécnico como por ejemplo:fabsolute
- Instrucciones de comparación: Suelen preceder a una instrucción de bifurcación condicional y modifican los flags. No hay que pensar que las instrucciones de salto condicional dependen de este repertorio, ya que lo único que hace el salto condicional es consultar los flags y salta si precede, pero no depende de ninguna instrucción de comparación. (de hecho cualquier operación aritmetica realizada anteriormente a un salto condicional puede provocar que este "salte").
Nemotécnicos más frecuentes:- compare: Resta los dos operandos pero no almacena el resultado, solo modifica los flags.
- test: compara un cierto valor especificado con el 0.
- Instrucciones lógicas: Realizan operaciones booleanas "bit a bit" entre dos operandos. Como las aritméticas también modifican los flags.
Nemotécnicos más frecuentes:- and: el "y" lógico.
- or: el "o inclusivo" lógico.
- xor: el "o exclusivo" lógico.
- not: la negación lógica. (complemento a 1, no confundir con el cambio de signo "negate" que es el complemento a 2)
- Instrucciones de Desplazamiento: Pueden ser aritmético o lógico y pueden incluir o no rotaciones. Pueden ser de izquierda a derecha.
Nemotécnicos más frecuentes:- shift: desplazamiento aritmetico o lógico.
- rotate: rotación con o sin acarreo.
- Instrucciones de bits: Comprueban un bit del operando y su valor lo reflejan en el indicador de cero. Pueden poner un bit a 0 o complementarlo.
Nemotécnicos más frecuentes:- bit test: comprueba un bit.
- bit clear: comprueba un bit y lo pone a 0.
- bit set: comprueba un bit y lo pone a 1.
- Instrucciones de control: Permiten modificar la secuencia normal de ejecución de un programa, puede hacerse por salto condicional relativo o absoluto.
Se clasifican en cuatro grupos:
-> salto incondicional
-> salto condicional
-> Llamada a subrutinas
-> Gestión de las interrupciones
- saltos: Pueden ser condicionales o incondicionales, se suelen especificar como jump o brantch, y en el caso de los condicionales se suele llamar jcond o bcond donde cond es una o más letras que indican la condición que ha de cumplirse para que el salto se produzca.
-> Incondicional: salta sin comprobar ninguna condicion.Nemotécnicos más frecuentes: jump o brantch
-> Condicional: salta si la condición se cumple.
Nemotécnicos más frecuentes: jcond o bcond
- Llamadas a subrutinas: Invoca la ejecución de funciones anteriormente definidas.
Nemotécnicos más frecuentes: call (llamada) y ret (retorno)
- Gestion de interrupciones: Se usan para llamar a las rutinas de servicio de interrupción y esto se puede hacer por hardware o bien por software. Necesita una instrucción similar a return para retornar al contexto anterior pero restableciendo el estado de la máquina, para no afectar a la aplicación a la cual se interrumpió (iret).
- Instrucciones de E/S: Son instrucciones de transferencia salvo que el origen/destino de dicho flujo es un puerto de un dispositivo de E/S. Estas instrucciones pueden darse mediante dos alternativas:
->E/S "mapeada" en memoria: Los perifericos tienen direcciones asignadas de la MP por lo que no se necesitan instrucciones especiales y las operaciones se realizan con las ya vistas, como son: load, store y move.
->E/S independiente: Necesitan unas instrucciones especiales para indicarle al procesador que nos estamos refiriendo al mapa de direcciones de E/S, ya que este mapa y el mapa de memoria son disjuntos.Nemotécnicos más frecuentes:
- input o read: Premite leer información de un puerto y trasladarla a memoria principal.
- output o write: Permite escribir información en un puerto de un dispositivo.
- test i/o: Lee información de control de un periférico.
- control i/o: Envia información de control hacia un periférico.
Instrucciones de control y misceláneas:Nemoténicos más frecuentes:
- halt: Detiene la ejecucion del programa hasta que una interrupción arranca otro programa.
- wait: Sirve para deterner la ejecución de un programa hasta que sucede un determinado evento que no es una interrupción (otra condición externa al primer programa).
- nop: No realiza ninguna operación, sirve para rellenar huecos en un programa o temporizar esperas.
- enable: Habilita las interrupciones.
- disable: Desabilita las interrupciones.
- test and set: Se utiliza para la implementación de la exclusión mutua, esto es, que un procesador no pueda acceder a un determinado recurso que esta siendo usado por otro procesador en ese mismo momento.
Se usan como semáforos, esto es, se declara una variable entera que tendrá el valor 0 si el recurso esta libre y 1 si esta siendo utilizado, de manera que si un procesador comprueba y el semáforo esta en 1 tendrá que esperar hasta que este cambie a 0. (1 = s.rojo y 0 = s.verde)
Listado de conjuntos de instrucciones
- 6800 (Motorola)
- Alpha (DEC)
- ARM (Advanced_RISC_Machines)
- DLX (John Hennessy y David Patterson)
- IA-64 (Intel)
- MIPS (MIPS_Computer_Systems)
- PA-RISC (HP)
- POWER (IBM)
- PowerPC (Alianza AIM)
- SPARC (Sun Microsystems)
- x86 -IA-32 (Intel), AMD64 (AMD) y EM64T (Intel)-
Categorías: Arquitectura de computadoras | Unidad central de procesamiento
Wikimedia foundation. 2010.