Entiendo cómo funciona una CPU bastante bien, pero hay una cosa a la que nunca le he llegado a dominar.
Digamos que tenemos una CPU Intel 8086 (registros de 16 bits de ancho) que está a punto de obtener su siguiente instrucción de la RAM (también con un ancho de datos de 16 bits). A medida que la CPU obtiene la instrucción, digamos en 0x44AB, ¿qué devuelve exactamente la RAM? ¿Es un código de operación de 8 bits y un operando de 8 bits? ¿Devuelve un código de operación de 16 bits y luego el operando se almacena en 0x44AC?
En el primer caso, los operandos no pueden tener un valor superior a 0xFF (255), pero entonces, ¿por qué tendría registros de 16 bits? En el segundo caso, el contador del programa debe incrementarse en dos entre cada instrucción, y usa el doble de memoria.
Entonces, ¿cómo funciona esto? La pregunta puede parecer un poco vaga, pero todo lo que pregunto es realmente qué hace la CPU con los datos devueltos desde una dirección en la RAM.
EDITAR: Hizo la pregunta más específica para que sea más fácil dar una buena respuesta.
Tampoco, en cuanto a la CPU 8086, el código del programa es solo bytes de datos en la memoria, y el número de bits de los registros casi no tiene nada que ver con la longitud del código de operación, ya que puede mover bytes o palabras de 16 bits, y también saltar lejos a un 32 -dirección de bit (definida por segmento y desplazamiento).
Como el 8086 es una CPU con un bus de 16 bits y los códigos de operación pueden tener una longitud de 1 a 6 bytes, los códigos de operación pueden o no estar alineados de alguna manera con la memoria. Sin embargo, una optimización típica (manualmente o por compilador) es colocar variables de 16 bits y objetivos para saltos de código en direcciones pares en la memoria.
Esto se debe a que el bus tiene 16 bits de ancho, por lo que debe tener una memoria de 16 bits en cada dirección de memoria par, y todas las direcciones de memoria impares son simplemente la parte alta de 8 bits del bus de 16 bits.
Entonces, si hay un comando que le dice a la CPU que ejecute el código en 0x44AB, que es una dirección extraña, la Unidad de interfaz de bus de la CPU (BIU) primero leerá un byte de 8 bits de esa dirección en la cola de precarga y continuará. obteniendo palabras de 16 bits a la vez desde la dirección 0x44AC en adelante en la cola de captación previa.
La Unidad de Ejecución de CPU (EU) simplemente tomará bytes de la cola de captación previa, o esperará a que aparezcan bytes si está vacío, y luego decodificará los códigos de operación y tomará cualquier cantidad de bytes necesaria de la cola para decodificar completamente los códigos de operación.
Si desea acceder a una palabra de 16 bits de lectura o escritura en direcciones impares, la BIU debe realizar dos accesos de 8 bits. Necesita acceder a un byte en la parte alta de 16 bits de una ubicación de memoria y al otro byte en la parte baja de 16 bits de la siguiente ubicación de memoria.
Al ejecutar el programa, la CPU primero lee el código de operación y luego lo decodifica para decidir cuántos bytes más, si es que necesita alguno, debe obtener en ciclos sucesivos para cumplir con la instrucción.
Lo que 'decide' es el microcódigo de la CPU , un programa interno/máquina de estados finitos que controla el funcionamiento ciclo a ciclo de la CPU. El microcódigo también decodifica la instrucción para realizar los movimientos de datos solicitados por la instrucción.
La arquitectura x86 tiene instrucciones de longitud variable y operandos de tamaño variable. El microcódigo x86 se da cuenta de todo esto mientras decodifica el código de operación. Otras máquinas, en particular RISC, pueden usar códigos de operación de longitud fija, pero aun así manejarán operandos de diferentes tamaños. Esto simplifica la decodificación de instrucciones y aumenta la velocidad, pero compensa la densidad de instrucciones.
RISC o CISC (p. ej., x86), el compilador/ensamblador/enlazador arma un programa ejecutable, de modo que las secuencias de bytes se organizan con el conocimiento exacto de cómo la CPU obtiene códigos de operación y operandos.
La CPU que ejecuta el programa compilado asume que lo que lee está en el orden correcto y en el formato correcto; y siempre que el programa se haya construido correctamente, este será el caso. El 'orden correcto' está definido por el conjunto de instrucciones , con el formato y la longitud de cada instrucción determinados por el código de operación inicial.
De lo contrario, no hay forma de que una CPU en ejecución sepa explícitamente a partir de los datos mismos si lo que se lee es código de operación, extensión de código de operación, operando o basura aleatoria. Solo el microcódigo de la CPU lo sabe.
usuario1850479
Reinderien
usuario_1818839
jsotola
all I'm asking is really what the CPU does with the data returned from an address in RAM.
no coincideHow are programs stored in RAM?
Máquina virtual Shashank
Máquina virtual Shashank