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

1

En las máquinas direccionables por palabra, los números de punto fijo son manejados naturalmente por la CPU. Esto significa que cualquier entero se almacena en celdas de memoria de tamaño de palabra y que tiene que acceder a una palabra completa para leer o escribir un solo entero. Pero ¿qué hay de unidades de datos más pequeñas como caracteres, codificados comúnmente como piezas de datos de 8 bits? Dado que una palabra está formada por varios bytes, ¿la CPU puede almacenar múltiples caracteres en una sola palabra mientras los maneja como 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 entera? ¿Existe una arquitectura estándar o diferente que trate este asunto de manera diferente?

    

4 respuestas

1

Sí, 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 pueden tratarse como registros de 8 bits. Sin embargo, el bus de memoria tiene 16 bits de ancho. Podría agregar bytes de 8 bits a la memoria sin problema. Y use ambos bytes de una ubicación de memoria independientemente o en conjunto si lo desea.

    
respondido por el Passerby
1

Si está programando en C, un carácter es normalmente del mismo tamaño que la unidad de memoria direccionable más pequeña. Si lo más pequeño que puedes abordar es una palabra de 16 bits o de 32 bits, entonces eso es lo que será un personaje. 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 unos pocos (algunos DSPs) se utilizan bytes más grandes.

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

    
respondido por el Adam Haun
1

Suena mucho como si estuvieras hablando de uniones de estilo c. Combinado con alguna estructura mágica, esto le permite interpretar la misma colección de bytes de diferentes maneras mientras se mantienen los tipos. El compilador hace la magia de bitshifting / bitmasking para ti.

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í un 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: enlace

    
respondido por el gregb212
0

Si desea comprimir datos como este, eso depende de usted. El Micro hará lo que le digas que haga. Incluso puede tener instrucciones para manipular segmentos de datos de 8 bits. Puede que ya haya bibliotecas por ahí para hacerlo. Puede suceder que si está utilizando un compilador / lib de C que está escrito para hacerlo con datos de tamaño char y no tenga 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.

    
respondido por el lakeweb

Lea otras preguntas en las etiquetas