¿Se pueden manejar individualmente los bytes que componen una palabra? [cerrado]

En máquinas direccionables por palabra, los números de punto fijo son manejados naturalmente por palabra por la CPU. Esto significa que cualquier número entero se almacena en celdas de memoria del tamaño de una palabra y que tiene que acceder a una palabra completa para leer o escribir un solo número entero. Pero, ¿qué hay de las unidades de datos más pequeñas como caracteres, comúnmente codificadas como piezas de datos de 8 bits? Dado que una palabra está formada por varios bytes, ¿la CPU es capaz de almacenar varios caracteres en una sola palabra mientras los maneja como piezas de datos individuales? Por ejemplo, si almaceno 4 caracteres (codificados con un esquema de 8 bits) en una palabra de 32 bits, ¿puede la CPU entenderlos como un conjunto con 4 elementos? ¿O es necesario almacenar un solo carácter en una palabra completa? ¿Existe un estándar o distintas arquitecturas tratan este asunto de manera diferente?

¿Hay un chip/arquitectura específico en mente? De lo contrario, esto no parece ser el tema aquí.
Voto para cerrar esta pregunta como fuera de tema porque no se trata de diseño electrónico.
Brian, publiqué esta pregunta aquí porque me refería a los microprocesadores en general. Es una pregunta sobre la arquitectura de las computadoras; es decir, hardware. ¿Debo mover la pregunta al sitio de CS?
Desde el centro de ayuda: "Si hace una pregunta vaga, obtendrá una respuesta vaga. Pero si nos brinda detalles y contexto, podemos brindarle una respuesta útil". El sistema de moderación de SE está diseñado para cerrar preguntas amplias, si lo lleva a otro sitio puede ocurrir el mismo resultado, si siente la necesidad de publicar en otro sitio, no haga publicaciones cruzadas. Sea específico, edite su pregunta y vuelva a intentarlo. Dado que este no es un sitio de discusión, las preguntas se mantienen en un formato de preguntas y respuestas.
@Humberto Fioravante Ferro, sí, esta es principalmente una pregunta de CS. Sin embargo, creo que las respuestas a continuación responden a su pregunta. Por favor, solo acepte uno.

Respuestas (4)

Sí tu puedes. Por ejemplo, la línea Texas Instruments MSP430 son procesadores de 16 bits y tienen palabras de 16 bits. Una variedad de registros tienen una longitud de 16 bits, pero también se pueden direccionar como registros de 8 bits. Sin embargo, su bus de memoria tiene 16 bits de ancho. Puede agregar bytes de 8 bits a la memoria sin problema. Y use ambos bytes de una ubicación de memoria de forma independiente o juntos si lo desea.

Ahora que lo mencionaste, recordé que las extensiones multimedia para los procesadores x86 (MMX y SSE) tratan las palabras enteras como conjuntos de unidades más pequeñas. También me hiciste recordar que el primer microprocesador de 16 bits de Intel permitía tratar un solo registro de 16 bits (por ejemplo, AX) como dos piezas de 8 bits (por ejemplo, AH y AL). Por lo tanto, incluso si el bus de datos tiene 16 bits de ancho (o más), algunas CPU le permiten manejar cada byte por separado. El problema es que no puede hacer eso directamente en la memoria principal, primero debe cargar la palabra en el registro de la CPU. Duda resuelta. ¡Gracias, @Passerby!

Si está programando en C, un carácter normalmente tiene el mismo tamaño que la unidad de memoria direccionable más pequeña. Si lo más pequeño que puede abordar es una palabra de 16 o 32 bits, entonces eso será un carácter. En la mayoría de las arquitecturas modernas, los caracteres son de 8 bits y se pueden empaquetar en una palabra de 32 bits en la memoria. Pero en algunos (algunos DSP) se utilizan bytes más grandes.

Siempre es posible trabajar en una parte de una palabra que es más pequeña que un byte usando las operaciones AND, OR y shift. De esa manera, podría empaquetar valores ASCII en 8 bits independientemente de cómo funcione el direccionamiento. Sin embargo, eso no sería muy portátil o fácil de trabajar.

Suena mucho como si estuvieras hablando de uniones de estilo c. Combinado con algo de magia de estructura, esto le permite interpretar la misma colección de bytes de diferentes maneras mientras mantiene los tipos. El compilador hace la magia del bitshifting/bitmasking por usted.

union data{
     struct{
         uint8_t byte1;
         uint8_t byte2;
         uint8_t byte3;
         uint8_t byte4;
     } bytes_individual;

     uint32_t bytes_all;
}

union storage;
storage.bytes_all = 0x04030201;
storage.bytes_individual.byte1 == 0x04; // true
storage.bytes_individual.byte2 == 0x03; // true
                                        // etc

Asumí una CPU little-endian aquí, por lo que la dirección menos significativa se almacena primero, o "LSB primero".

Hice referencia a este enlace si desea investigar un poco más: https://www.tutorialspoint.com/cprogramming/c_unions.htm

Si está buscando comprimir datos como este, depende de usted. El Micro hará lo que le digas que haga. Incluso puede tener instrucciones para manipular segmentos de datos de 8 bits. Es posible que ya existan bibliotecas para hacerlo. Puede ser que si está utilizando un compilador/lib de C que está escrito para hacerlo con datos de tamaño de caracteres y ni siquiera tiene que manejarlo con rutinas de bajo nivel.

Pero si está trabajando con un Cortex, probablemente tenga suficiente RAM para que esto no sea una preocupación.