Todos los microprocesadores y, de hecho, todos los circuitos digitales síncronos funcionan en lo que se llama un "Nivel de transferencia de registro". Básicamente, todo lo que hace cualquier microprocesador es cargar valores en registros de diferentes fuentes. Esas fuentes pueden ser memoria, otros registros o la ALU (Unidad lógico-artificial, una calculadora dentro del procesador). Algunos de los registros son simples registros dentro del asesor, algunos registros pueden ser registros de funciones especiales que se encuentran alrededor de la CPU, en 'periféricos' como los puertos de E / S, la unidad de administración de memoria, la unidad de interrupción, esto y aquello.
En este modelo, las 'Instrucciones' son secuencias básicas de transferencias de registros. Normalmente no tiene sentido darle al programador la capacidad de controlar cada transferencia de registro individualmente, porque no todas las posibles combinaciones de transferencia de registro son significativas, por lo que permitir que el programador las exprese todas sería un desperdicio en términos de consumo de memoria. Básicamente, cada procesador declara un conjunto de conjuntos de transferencias de registros que le permite al programador pedirle al procesador que haga, y estas se llaman "Instrucciones".
Por ejemplo, ADD A, B, C puede ser una operación en la que la suma de los registros A y B se coloca en el registro C. Internamente, serían tres transferencias de registros: Cargue la entrada izquierda del sumador desde A, cargue la entrada derecha del sumador desde B, luego carga C desde la salida del sumador. Además, el procesador realiza las transferencias necesarias para cargar el registro de direcciones de memoria desde el contador de programas, cargar el registro de instrucciones desde el bus de datos de memoria y finalmente cargar el contador de programas desde el incrementador de contador de programas.
El 8086 usó una tabla de búsqueda de ROM interna para ver qué transferencias de registro realizan cada instrucción. Los diseñadores de la CPU 8086 programaron libremente los contenidos de esa ROM, por lo que eligieron secuencias de instrucciones, que parecían útiles para el programador, en lugar de elegir secuencias que serían sencillas y rápidas de ejecutar por la máquina. Recuerde que en esos días, la mayoría del software estaba escrito en lenguaje ensamblador, por lo que tenía sentido hacerlo lo más fácil posible para el programador. Más tarde, Intel diseñó 80286, en el que cometieron, lo que ahora parece ser un error crítico. Les quedaba algo de memoria de microcódigo sin usar y pensaron que también podrían llenarla con algo, y dieron algunas instrucciones solo para llenar el microcódigo. Esto los mordió al final, ya que todas esas instrucciones adicionales debían ser compatibles con los procesadores 386, 486, Pentium y posteriores, que ya no usaban microcódigo.
ARM es un diseño de procesador mucho más nuevo que el 8086 y la gente de ARM tomó una ruta de diseño diferente. Para entonces, las computadoras eran comunes y había muchos compiladores disponibles. Así que en lugar de diseñar un conjunto de instrucciones que sea agradable para el programador, eligieron un conjunto de instrucciones que es rápido para que la máquina ejecute y eficiente para que el compilador genere el código. Y por un tiempo, el X86 y el ARM fueron diferentes en la forma en que ejecutaron las instrucciones.
El tiempo pasa y las CPU se vuelven cada vez más complejas. Y también los microprocesadores están diseñados utilizando computadoras y no lápiz y papel. Ya nadie usa microcódigo, todos los procesadores tienen una unidad de control de ejecución cableada (lógica pura). Todos tienen múltiples unidades de cálculo de enteros y múltiples buses de datos. Todos traducen sus instrucciones entrantes, las reprograman y las distribuyen entre las unidades de procesamiento. Incluso los antiguos conjuntos de instrucciones RISC se traducen en nuevos conjuntos de operaciones RISC. Así que la vieja pregunta de RISC versus CISC
ya no existe realmente Nuevamente estamos de nuevo en el nivel de transferencia de registro, los programadores piden a la CPU que realice las operaciones y la CPU los traduce en transferencias de registro. Y ya sea que la traducción se realice mediante una ROM de microcódigo o una lógica digital cableada, realmente ya no es tan interesante.