Ya hemos tratado la forma en la que las CPU ejecutan las instrucciones, lo que es denominado el ciclo de instrucción. Pero, ¿qué es una instrucción cuando hablamos de procesadores? Si lo desconocéis o el vocablo os lleva a confusiones, entonces no os preocupéis, una vez leáis este artículo al completo entenderéis sin problema lo que es la instrucción de un programa informático.
Las CPU de millones de ordenadores en todo el mundo solo saben hacer una cosa, ejecutar instrucciones de manera continua. Sin embargo, ¿qué es una instrucción? Seguid leyendo para saberlo.
¿Qué es una instrucción?
Para entender de manera coloquial lo que es una instrucción, esta no es más que una acción que realiza cualquier procesador con los datos que almacena la memoria en binario. Se puede definir como una oración completa donde no especificamos el sujeto, al ser este obvio, la acción que ejecutará y sobre que datos lo hará. Una instrucción es, por tanto, la unidad mínima de un programa, la cual le indica a la CPU que ha de hacer a través de una serie de instrucciones que se ejecutan de manera secuencial.
Composición de una instrucción
Las instrucciones están compuestas por bloques de código binario de tamaño fijo o variable. En las CPU con sets de instrucciones complejos, CISC, dicho tamaño suele variar, en cambió las que tienen conjuntos de instrucciones reducidos suelen tener un tamaño fijo. En general suelen tener la siguiente composición:
- Bit de datos o instrucción: dependiendo cuál sea el valor de esa parte del código binario el procesador lo interpretará como una instrucción a ejecutar o un cúmulo de datos.
- Bits de instrucción: estos bits indican que instrucción ejecutara la CPU y, por tanto, el camino que seguirá la instrucción para ejecutarse, también es llamado opcode.
- Bits de datos: indican donde se encuentran el objeto de la instrucción, es decir, los datos que manipulará la CPU.
- Bits de modo: Los bits de modo indican como se ejecuta una instrucción, se utilizan cuando hay varias formas de ejecutar una instrucción o existen diferentes condicionantes.
Si queréis saber la forma en la que una CPU ejecuta las instrucciones os recomendamos el artículo «Así es como tu CPU ejecuta las instrucciones que le da el software» en HardZone, este mismo sitio web.
Direccionamiento de instrucciones
En una CPU pueden existir varias versiones de una instrucción dependiendo de donde se encuentren los datos con los que tenemos que trabajar. A esto lo llamamos modos de direccionamiento de un procesador.
- El direccionamiento inmediato se utiliza cuando el dato se encuentra la misma instrucción, en este caso el dato se almacena en un registro o memoria interna del procesador para ejecutarse desde allí.
- El segundo tipo de direccionamiento es el directo, donde el programa indica la dirección de la memoria en la que se encuentra el dato.
- El tercer tipo de direccionamiento es el indirecto, el cual nos da la dirección donde se encuentra la dirección de memoria en la que se encuentra el dato.
Se ha de tener en cuenta que cuanto más alejado esté un dato del procesador entonces habrá más latencia y el tiempo, medido en ciclos de reloj, que tarde en ejecutarse esa instrucción será más lento. Así pues una instrucción de direccionamiento inmediato será la más rápida de todas y una de direccionamiento inmediato la más lenta.
Tipos de instrucción en una CPU
A continuación os hacemos un resumen de las instrucciones más comunes utilizadas por los diferentes procesadores. Estas instrucciones son frecuentes en todos los conjuntos de registros e instrucciones, independientemente si son x86, ARM, MIPS, PowerPC, etc. Así como tampoco tiene relación si el conjunto de instrucciones es RISC o CISC.
- Las instrucciones de manipulación aritmética son las que realizan operaciones de manipulación matemática como suma, resta, multiplicación y división. Así como también de operaciones más complejas como pueden ser fórmulas trigonométricas, raíces cuadradas, potencias.
- Las instrucciones lógicas son el segundo tipo de instrucciones ejecutadas por la ALU, en realidad son operaciones binarias que emulan el funcionamiento de las puertas lógicas. Es decir, AND, OR, XOR, NAND, NOR, XNOR y NOT.
- Las instrucciones de manipulación de bits, se basan en manipular los bits de una cadena de idem con instrucciones como desplazar un bit a izquierda o derecha, invertir el orden o conmutarlos.
- Las instrucciones de movimiento de datos encargan del movimiento de datos de una parte a otra de la memoria, de una memoria a otra, del procesador a la memoria y de la memoria al procesador.
- Las instrucciones de salto son las que indican que el programa no continua en la siguiente dirección de memoria, sino a una dirección de memoria en concreto que es marcada por la instrucción de salto.
Tipos de datos y multiplicidad de instrucciones
Debido a que una CPU a día de hoy puede tratar con diferentes tipos de datos, por ejemplo enteros y coma flotante. Algunas instrucciones aritméticas suelen estar duplicadas para el conjunto de instrucciones en coma flotante. También están las instrucciones vectoriales, como los sets de instrucciones AVX, o conocidas también como instrucciones SIMD, las cuales operan con varios operandos al mismo tiempo.
Dado que dichas instrucciones se ejecutan en unidades distintas estas acaban por necesitar bits de instrucción distintos, lo que se traduce en que el añadido de nuevos tipos de datos en un procesador supone en muchos casos aumentar considerablemente el conjunto de instrucciones, la complejidad de los mismos. Así como la parte que las descodifica y ejecuta en una CPU.
Además, este tipo de instrucciones adicionales tienen sus propios códigos de instrucción, de esta manera la unidad de control sabe hacia donde tiene que unidades de ejecución tiene que derivarlas para su posterior resolución.
CISC vs RISC
Existen dos filosofías a la hora de diseñar un set de instrucciones, no obstante después de varias décadas la línea se ha roto y conjuntos de instrucciones reducidas se han vuelto tan complejas como las del tipo CISC en cuanto a cantidad de instrucciones que estos albergan.
Las instrucciones CISC requieren menos ciclos de reloj a la hora de ejecutarse, mientras que las RISC se descomponen en varias distintas mucho más simples. El primer caso necesita decodificadores extremadamente complejos mientras que el segundo caso no y son más fáciles de implementar. No obstante, la ventaja de los procesadores CISC es que su código requiere menos instrucciones que los RISC y es mucho más compacto.
A día de hoy las CPU ya no funcionan internamente bajo ese concepto, sino que cada instrucción es descodificada en varias microinstrucciones. Por lo que se dice que los procesadores de PC son CISC por fuera, pero RISC por dentro.