¿Cómo "sabe" una CPU qué significan realmente los comandos e instrucciones?

73

¿Cómo 'sabe' un procesador lo que significan los diferentes comandos?

Estoy pensando en comandos de nivel de ensamblaje como MOV, PUSH, CALL, etc.

Simon Verbeke
fuente
Esto es muy informativo, pero lo que estoy buscando es ¿qué es lo que permite que una CPU reciba y envíe comandos?
No entiendo ese comentario. Una CPU "recibe" instrucciones de la memoria, solicitándolas por dirección. Los únicos comandos que una CPU "envía" (en la vista simplista, al menos) son comandos a la memoria para entregar datos y comandos en buses de E / S para operar dispositivos de E / S.
Daniel R Hicks el
En el corazón de cualquier CPU hay alguna lógica que está (literalmente) programada para ejecutar un procedimiento simple: tome el valor del registro de dirección de instrucciones, envíelo a la memoria, recupere la instrucción que devuelve la memoria y luego atasque en un lugar más complejo nido de lógica cableada que "comprende" lo que significa la instrucción y cómo ejecutarla. Ah, y en algún lugar a lo largo de allí, incremente el registro de dirección de instrucciones.
Daniel R Hicks
Los lectores pueden estar interesados ​​en la pregunta ¿Cómo funciona una computadora? sobre informática .
Raphael

Respuestas:

88

Cuando una computadora interpreta instrucciones de nivel de ensamblaje , estas instrucciones se convierten en sus equivalentes binarios para que la CPU los lea. Cuando la CPU ejecuta las instrucciones, interpreta la parte del código de operación de la instrucción en "microprogramas" individuales, que contienen sus equivalentes de microcódigo . Para su información, una instrucción de ensamblaje completa consta de un código de operación y cualquier dato aplicable que lo acompañe, si es necesario (por ejemplo, nombres de registro, direcciones de memoria).

Las instrucciones de microcódigo tienen un nivel extremadamente bajo (más que el ensamblaje) y controlan las señales digitales reales que controlan el flujo de lógica en el microprocesador. Por ejemplo, una instrucción de microcódigo podría actualizar un indicador de registro de código de condición con un nuevo valor, o conectar un registro de CPU con una de las unidades ALU . Son posibles tareas más complejas, pero esto le muestra la idea general de para qué se utiliza el microcódigo.

El flujo general de la compilación a la ejecución es el siguiente. Las instrucciones de ensamblaje se ensamblan (se convierten en sus binarios equivalentes 0s y 1s, o de ahora en adelante, señales lógicas). Estas señales lógicas son interpretadas a su vez por la CPU, y se convierten en señales lógicas de bajo nivel que dirigen el flujo de la CPU para ejecutar la instrucción particular. Esto puede tomar uno o más ciclos de reloj, dependiendo de la arquitectura y el diseño del procesador (la mayoría de los manuales de referencia del procesador le indican cuántos ciclos de reloj se necesitan para ejecutar una instrucción en particular, como este, por ejemplo ).

Todo esto se realiza con un microcódigo programado (incrustado físicamente dentro del procesador en algún tipo de ROM , configurado durante la fabricación), que dirige el flujo a través de puertas lógicas de bajo nivel reales . Esto proporciona una interfaz entre las instrucciones de ensamblaje abstractas y la lógica eléctrica física en el procesador.


Entonces, en resumen, las instrucciones del procesador son ensambladas y cargadas por el procesador. El procesador usará estas instrucciones para buscar el microprograma (en forma de microcódigo) correspondiente a esa instrucción en particular, que es lo que "en realidad" ejecuta la instrucción. Una vez que se han ejecutado los microcódigos para la instrucción particular (que puede tomar uno o más ciclos de reloj), el procesador ejecuta el microcódigo para obtener la siguiente instrucción y el ciclo se repite.

Gran descubrimiento o desarrollo, progreso, ruptura, penetracion
fuente
2
Ok, lo entiendo, creo :) ¿Entonces los bits de comando alternan los "interruptores" que harán que el procesador haga ciertas cosas con los datos que recibe?
Simon Verbeke
44
@ Simon Verbeke, exactamente correcto. Simplemente alternan los interruptores para dirigir el flujo de señales eléctricas en el procesador (que también puede dirigirlo para que vuelva a cargar más comandos). La analogía del interruptor es buena, ya que todo es digital (ya sea lógica 1/0 o verdadero / falso). Para que lo sepas, el nivel lógico es un voltaje real. Depende del ingeniero especificar qué es un 0 o un 1 (por ejemplo, un 1 lógico podría especificarse como más de 2 voltios).
Avance el
1
Las "instrucciones binarias equivalentes" a las que el compilador o ensamblador reduce todo se denominan códigos de operación. Si observa la estructura de código de operación de una arquitectura RISC como MIPS o ARM, puede ver cómo varios bits en el código de operación se asignan a operaciones específicas. Intel, debido a su longevidad y tendencia a extenderse una y otra vez, ya no tiene una estructura de mapeo simple.
LawrenceC
3
No, estaba diciendo que debido a la longevidad y la extensión una y otra vez de la arquitectura x86, el mapeo de bits individuales en códigos de operación a microoperaciones no es tan simple como en MIPS o ARM hasta cierto punto (ver d.umn.edu/~gshute/spimsal/talref.html , por ejemplo, los códigos de operación Intel no son nada como esto). No creo que haya mucha noción de "RISC" cuando Intel introdujo las CPU x86 en 1978.
LawrenceC
55
Cabe señalar que solo algunas CPU están microcodificadas. Algunos (en su mayoría dispositivos más pequeños) funcionan directamente desde los códigos de operación del ensamblaje. Depende de la arquitectura.
Nombre falso el
37

El procesador realmente no "sabe" cuáles son los comandos. Los comandos son solo patrones binarios que hacen que el procesador haga lo que interpretamos que significan los comandos.

Por ejemplo, una operación ADD-R1-into-R2 hará que los valores de los registros 1 y 2 alcancen la ALU (unidad aritmética y lógica), haga que la ALU use la salida del sumador en lugar de las otras cosas, y hará que salida de la ALU para reemplazar el valor en el registro 2. Existen circuitos lógicos simples para lograr todas estas cosas ( multiplexor , sumador , contador , ...), aunque los procesadores reales utilizan optimizaciones muy complicadas.

Es como si estuvieras preguntando cómo sabe un auto reducir la velocidad cuando presionas los frenos. El automóvil no lo sabe, el pedal de freno simplemente controla indirectamente cómo se presionan las pastillas contra las ruedas.

Craig Gidney
fuente
55
Bonita analogía con los coches rompen el pedal.
rjmunro
10

Tomemos, por ejemplo, la instrucción que le dice a un procesador x86 / IA-32 que mueva un valor inmediato de 8 bits a un registro. El código binario para esta instrucción es 10110 seguido de un identificador de 3 bits para el registro que se utilizará. El identificador para el registro AL es 000, por lo que el siguiente código de máquina carga el registro AL con los datos 01100001.

10110000 01100001

Este código de computadora binario puede hacerse más legible para los humanos expresándolo en hexadecimal de la siguiente manera

B0 61

Aquí, B0 significa 'Mover una copia del siguiente valor a AL', y 61 es una representación hexadecimal del valor 01100001, que es 97 en decimal. El lenguaje ensamblador de Intel proporciona el MOV mnemónico (una abreviatura de movimiento) para instrucciones como esta, por lo que el código de máquina anterior se puede escribir de la siguiente manera en lenguaje ensamblador, completo con un comentario explicativo si es necesario, después del punto y coma. Esto es mucho más fácil de leer y recordar.

http://en.wikipedia.org/wiki/Assembler_language

En otras palabras, cuando 'ensamblas' tu programa de ensamblaje, tus instrucciones como

MOV AL, 61h

se convierten en números, que la CPU asocia un significado especial y luego actúa en consecuencia.

Nate
fuente
2
También vale la pena señalar que la asignación del símbolo mnemónico "mov" a este patrón de bits en particular fue completamente arbitraria. En principio, podría escribir un ensamblador que llamara a esa instrucción "oof" y funcionaría igual de bien, además de ser más difícil de recordar.
dmckee
4

En el nivel más bajo extremo, todo lo que la CPU puede hacer es agregar. De la suma, puede restar, multiplicar y dividir (ya que estos son solo sumas de una manera diferente). La CPU usa esto para mover datos en la memoria aplicando las adiciones a las direcciones de memoria.

Sin embargo, tenga en cuenta que esto está en el nivel más bajo posible. De hecho, la CPU "comprende" ciertos comandos, en forma de microcódigo. Ver la respuesta de Breakthrough, está muy bien escrita.

n0pe
fuente
77
Las operaciones lógicas como AND, OR y NOT, así como el desplazamiento de bits son más fundamentales que la suma. La suma puede expresarse en términos de estas operaciones. En realidad, hay circuitos integrados discretos (la serie LS de Texas Instruments) que no hacen más que realizar estas operaciones y es posible construir una especie de CPU a partir de ellos. Google "Pong schematic" para ver cómo se hace un juego, por ejemplo, sin una CPU.
LawrenceC
Quise decir desde un punto de vista más software :) Sí, en cuanto a hardware / lógica, tienes una cantidad increíble de compuertas NAND y NOR. Buen punto.
n0pe
2

He dado una respuesta relacionada en programmers.stackexchange.com, vea ¿Cómo funcionan las computadoras? donde caminé brevemente sobre todo desde cero sobre cómo las computadoras interpretan las instrucciones para mover los electrones.

Lie Ryan
fuente