¿Cómo se realiza el acceso al registro en el caso de la arquitectura X86 cuando solo hay comandos de entrada y salida para los puertos?

En la arquitectura ARM, los registros de un periférico se asignan a la RAM para que podamos acceder al registro usando la RAM.

Lo que está preguntando es la diferencia entre IO mapeada en memoria y IO mapeada IO. Al acceder a través de IO mapeado IO, se emite una instrucción para tomar datos de 1 o más Registros de uso general (sí, CADA IC digital hoy en día tiene estos. Intel solía tener 8, pero lo han aumentado) y transferirlo a los registros apropiados en otro lugar. El inconveniente obvio es que debe haber una instrucción para que esto suceda (lo que genera arquitecturas complicadas). El beneficio obvio es que tiene más espacio de memoria para RAM.

Respuestas (2)

En primer lugar, para ser precisos, en algunos microcontroladores, los registros periféricos pueden asignarse al mismo espacio de direcciones que la RAM y, por lo tanto, aparecer como si estuvieran en la RAM. Pero no son físicamente parte de la RAM. Esto se denomina E/S mapeada en memoria y Motorola lo utilizó por primera vez en la década de 1970 en microprocesadores como el 6800, 6809 y 68000.

Por lo tanto, puede haber un bloque de direcciones de memoria de 16K en un microcontrolador que comience en 0x0000, y el primer 1K está reservado para E/S. Las direcciones de E/S se ejecutarían de 0x0000 a 0x03FF y la RAM de 0x0800 a 0x4000.

Si la RAM fuera externa al chip, por lo que realmente había una RAM de 16K en este ejemplo, el primer 1K de la RAM se "perdería" ya que no se podía abordar.

Entonces, la desventaja de la E/S mapeada en memoria es que "come" el espacio de direcciones del procesador. Para microcontroladores pequeños que tienen solo un par de KB de espacio de direcciones de RAM, esto puede convertirse en un verdadero problema.

En los microcontroladores que usan direccionamiento de puertos, todavía hay registros periféricos, pero se accede a ellos mediante instrucciones IN (lectura) o OUT (escritura). Cada registro de E/S tendrá una dirección de puerto, al igual que la dirección de memoria utilizada en la E/S asignada a la memoria. Pero estas direcciones están separadas de las direcciones utilizadas para RAM. Puede tener una dirección de memoria 0x55 y una dirección de puerto 0x55 y no interfieren entre sí.

Intel introdujo el direccionamiento de puertos en la década de 1970, con microprocesadores como el 8008, 8080, 8085 y 8086. (El 8051, por otro lado, usa E/S mapeadas en memoria).

El 8080 y el 8085, por ejemplo, solo podían abordar 256 puertos (0x0000 a 0x00FF); se ignoró el byte superior de la dirección de 16 bits. El 8086 usaba direccionamiento de puertos de 16 bits reales y teóricamente podría direccionar 65536 direcciones de puertos.

La desventaja del direccionamiento de puertos usando las instrucciones IN y OUT es que solo funcionaban con los registros AL o AX, y luego solo para cargar o almacenar desde el registro. por ejemplo, podría leer un valor de 8 bits de un puerto en AL, o un valor de 16 bits en AX usando la instrucción IN. Pero no podía hacer ninguna operación aritmética o lógica ya que el valor se leía desde el puerto como puede hacer con la E/S asignada a la memoria.

Los procesadores que utilizan el direccionamiento de puertos también pueden tener direccionamiento de E/S asignado a la memoria, siempre que la RAM y los periféricos de E/S sean externos al chip del microprocesador.

Con la arquitectura X86, los registros periféricos se pueden asignar a direcciones de RAM oa direcciones de puertos de E/S.

Las instrucciones IN y OUT pueden abordar muchos puertos de E/S: 256 en el 8085, si no recuerdo mal, probablemente más en el X86.

Significa solo 256 registros para acceder?? ¿No es demasiado menos?
¡256 fue suficiente en 1978!
@user3287223 "muy pocos"