# Instrucción-máquina

En informática, una instrucción de máquina o instrucción-máquina es una operación elemental que un programa puede solicitar a un procesador para que la ejecute. Una instrucción de máquina es pues una orden básica que el ordenador directamente puede interpretar y ejecutar, sin requerir ningún paso previo o traducción previa.
La colección de instrucciones de máquina que puede interpretar y ejecutar un procesador, es lo que se denomina su juego de instrucciones. Cada instrucción de máquina es expresada en el llamado lenguaje de máquina o código de máquina, y generalmente es indicada por una sucesión de dígitos binarios o de dígitos hexadecimales. Un campo de instrucción llamado « código de operación » o « opcode » designa o señala el tipo de operación; puesto que el valor numérico que corresponde a un determinado código de operación, ya sea que se exprese el mismo en el sistema binario de numeración, o en el sistema decimal, o en el sistema hexadecimal, es dificultoso de manejar y recordar para los humanos, el programador, al concebir sus programas, suele utilizar una abreviación más mnemotécnica para el mismo, que es la que se suele utilizar en los lenguajes de programación tipo assembler.
Suele establecerse una distinción entre una instrucción de máquina y una instrucción informática. En efecto, una instrucción informática o instrucción de informática designa más generalmente a una etapa simple en un programa informático (y si dicho programa informático es un programa tipo assembler, entonces sí, los dos conceptos son casi coincidentes, ya que la instrucción informática sería la instrucción en assembler correspondiente a la instrucción de máquina).

## Tamaño o largo de las instrucciones

El tamaño de una instrucción dependerá obviamente de la arquitectura de la plataforma utilizada y de la propia instrucción de que se trate, aunque usualmente está comprendido entre 8 y 64 bits. Cuando la instrucción se reduce a su código de operación, generalmente el largo de la misma es de 8 bits. Seguidamente se presenta un ejemplo de instrucción x86 en la notación simbólica de un lenguaje assembler :
    SHL AX, 01
SHL señala la operación a cumplir, y por su parte AX y 01 son los dos operandos presentes; aquí AX es el nombre de un registro, y 01 es una constante. En este ejemplo, SHL es una abreviación mnemotécnica de la expresión en inglés « shift left » (corrimiento hacia la izquierda). La ejecución de esta instrucción, provoca el corrimiento hacia la izquierda en una posición, de las señales binarias presentes en el registro AX.
Una instrucción de máquina debe tener uno o varios campos, y el primero de ellos generalmente es el código de operación, el que por lo usual ocupa 8 bits. Al código de operación le pueden seguir uno o varios operandos (o eventualmente ninguno), cada uno de los cuales representa o alude, o bien a un registro, o bien a una dirección de memoria, o bien a una constante (un valor directo o inmediato). Según los casos, un registro puede aludir o bien a una memoria de 4 bits, o bien a una memoria de 16 o 32 o 64 bits. Por su parte, una dirección de memoria suele estar expresada en 16 o 32 bits, y un valor numérico directo en 8 o 16 o 32 o 64 bits, aunque claro está, puede haber variantes según el tipo de computadora y la clase de instrucción de que se trate.

## Tipo de instrucciones

Las instrucciones que un microprocesador es capaz de interpretar y ejecutar, pueden ser clasificadas en varios diferentes grupos.

### (1) Instrucciones de transferencia

Un procesador pasa una gran parte de su tiempo, realizando transferencias de octetos de una parte a otra del sistema, por ejemplo, de un periférico hacia un registro interno (o viceversa), de un registro interno hacia la memoria RAM (o viceversa), etc. A veces, no se puede efectuar una transferencia directa de una posición de memoria a otra, o de una posición de memoria a un periférico o a una memoria ROM, etc, en cuyo caso los registros internos podrían ser usados como memorias intermedias. Señalemos de paso que, salvo excepciones, lo que genéricamente aquí estamos denominando transferencia, por lo usual se trata en realidad de una copia o duplicación de información, puesto que la memoria de origen guarda su información, mientras tanto allí no se registre otra cosa.

### (2) Instrucciones aritméticas

Los procesadores más simples solamente permiten efectuar adiciones y sustracciones, así como multiplicaciones y divisiones, pero entre números enteros almacenados en una palabra de memoria (cuatro octetos) o en media palabra de memoria (dos octetos); esto es lo corriente en el caso de los microcontroladores. No obstante, muchos procesadores modernos, también disponen de un coprocesador capaz de efectuar cálculos sobre valores con decimales, o sobre valores con exponente y parte decimal; en ausencia de una unidad como la señalada, este tipo de cálculos con decimales igualmente podría ser implementado, pero en la medida que ello se contemple a través del logical (o sea, a través del software, a través de una adecuada programación).
Asimismo, ciertos grandes procesadores de tiempo atrás, a efectos de permitir mayor velocidad de procesamiento, también incluían en su juego básico de instrucciones, el tratamiento de algunas operaciones matemáticas complejas, tal como por ejemplo el tratamiento de valores muy grandes o de valores expresados como fracciones, así como el cálculo de potencias o de raíces cuadradas, el cálculo de funciones trigonométricas, logarítmicas, o exponenciales, etc. En los procesadores más modernos (véase: arquitectura RISC), mucho se ha avanzado en cuanto a velocidad, así que estas operaciones complejas ahora son casi siempre implementadas por software y no por hardware.

### (3) Instrucciones lógicas

Los procesadores también son capaces de efectuar operaciones lógicas, tales como : Y (AND), O (OR), OEX (EXOR), NO (NOT, o sea inversión), así como también rotaciones, desplazamientos, etc. Estas operaciones definidas en realidad para uno o dos valores lógicos señalados como argumentos, se aplican a un registro (un solo argumento) o dos registros (dos argumentos) utilizados como operandos, aplicando la operación en paralelo a los bits correspondientes de los registros señalados.
A veces, es un octeto el que registra el valor lógico allí contenido. La comparación lógica de dos octetos A et B, en caso de que estos dos octetos contengan los respectivos valores lógicos que se desean comparar, puede ser realizada, por ejemplo, a través de una simple sustracción de los contenidos de ambos octetos considerados como enteros, ya que en efecto, si el resultado es cero podrá concluirse que A = B, y si por el contrario el resultado es distinto de cero podrá concluirse que A ≠ B.

### (4) Instrucciones de entrada/salida

Este tipo de instrucciones permiten comunicarse con dispositivos externos, vía interfases de comunicación y puertos de entrada/salida. En ciertas arquitecturas, los puertos simplemente son considerados como áreas de memoria que son gestionadas por convenientes instrucciones de transferencia (entradas/salidas integradas a memorias). En otras arquitecturas, se dispone de instrucciones específicas de entrada/salida (entradas/salidas independientes).

### (5) Instrucciones de alteración de secuencia

En líneas generales, luego de ejecutar una instrucción de máquina, se pasa a interpretar y ejecutar la instrucción siguiente, o sea que en muchos casos, el encadenamiento de instrucciones sigue la secuencia de presentación de las mismas en la memoria. Las instrucciones de alteración de secuencia precisamente permiten romper con esta secuenciación, en forma condicionada o incondicionada; se trata pues de instrucciones que de alguna manera alteran el desarrollo normal de un programa. Puede establecerse cierta diferencia entre las llamadas a rutinas y los saltos:
* Un salto provoca una bifurcación del programa a una dirección de memoria diferente de la dirección de la instrucción siguiente a la instrucción que se está procesando en ese momento ;
* Una llamada a rutina o llamada a subprograma (en inglés: call) es un salto a una parte del programa que constituye un bloque o unidad, y que está preparado para realizar una determinada tarea que para el programador tiene algún sentido o significado. Las rutinas permiten estructurar o parcializar el programa en un programa principal más corto y varias rutinas (subrutinas) auxiliares; así pues, durante la ejecución de un programa, cada rutina puede ser invocada desde otras unidades del programa, una o varias veces (léase en ciertos casos, miles de veces o millones de veces). La gran diferencia entre una llamada a rutina y un simple salto, es que en el primer caso y en el momento de la bifurcación, la dirección de la instrucción siguiente deberá ser memorizada de alguna forma, ya que a ese punto del programa deberá bifurcarse una vez que la rutina haya terminado.
Tanto los saltos como las llamadas a rutinas pueden ser :
* incondicionales, o sea, llegado el procesamiento a ese punto del programa, la secuenciación es siempre alterada ;
* condicionales, o sea, la bifurcación (la alteración de secuencia) solamente tendrá lugar si se verifica una determinada condición; generalmente, la condición que se investiga es el valor o contenido de un indicador de estado, lo que con mucha velocidad y rapidez, permite por ejemplo investigar si el resultado de la última operación aritmética es nulo, positivo, o negativo, o si cierto contenido tiene paridad par o impar, etc.

### (6) Instrucciones diversas

En este grupo se incluyen :
* Instrucciones de gestión de la pila (zona de memoria RAM que permite el almacenamiento de datos locales de rutinas durante la ejecución del programa) ;
* Instrucciones de control del procesador : por ejemplo, ciertos tipos de control sobre los distintos periféricos ;
* Instrucciones que permiten definir o consultar los indicadores internos del procesador.