¿Qué hace la CPU 8086 con los datos devueltos desde una dirección en la RAM?

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.

La RAM devuelve las 16 tiendas individuales de unos y ceros en la dirección especificada. Dependiendo de la CPU, podría ser la mitad de un código de operación, 1 código de operación o dos códigos de operación.
Las CPU funcionan de manera diferente según la arquitectura. ¿Quiere decir "las CPU Intel más populares" o algo más?
Todo esto depende de la ISA (Arquitectura del conjunto de instrucciones) de esa CPU. Todos son diferentes. Incluso dentro de una ISA, por lo general se encuentran varios formatos de instrucciones diferentes.
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?
Puede leer el artículo de wikipedia sobre 8086: en.wikipedia.org/wiki/Intel_8086 . Espero que haya entendido que la instrucción se obtiene de la cola de instrucciones y no de la RAM. Si está interesado en este campo, puede aprender gratis de la academia Saylor: learn.saylor.org Tienen un curso en línea gratuito sobre Arquitectura de Computadores
@Frævik, si obtuvo la respuesta que deseaba, no olvide aceptarla. Esto evita que el sistema lo golpee de vez en cuando.

Respuestas (2)

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.

Esto puede ser más detallado de lo que nadie quiere, pero el 8086 es más complicado que eso. La decisión de 1 byte frente a 2 bytes la toma la ROM de decodificación de grupo, que está fuera del microcódigo. Las instrucciones o prefijos simples de 1 byte no usan el microcódigo en absoluto. Luego, el microcódigo obtiene bytes adicionales del búfer de captación previa según sea necesario. Consulte la patente para obtener más detalles: patentes.google.com/patent/US4449184A