Können die Bytes, die ein Wort bilden, einzeln behandelt werden? [geschlossen]

Bei wortadressierbaren Maschinen werden Festkommazahlen natürlich wortweise von der CPU behandelt. Das bedeutet, dass jede ganze Zahl in wortgroßen Speicherzellen gespeichert wird und dass Sie auf ein ganzes Wort zugreifen müssen, um eine einzelne ganze Zahl zu lesen oder zu schreiben. Aber wie wäre es mit kleineren Dateneinheiten als Zeichen, die üblicherweise als 8-Bit-Datenstücke codiert sind? Da ein Wort aus mehreren Bytes besteht, ist die CPU in der Lage, mehrere Zeichen in einem einzigen Wort zu speichern und sie als einzelne Datenstücke zu behandeln? Wenn ich beispielsweise 4 Zeichen (mit einem 8-Bit-Schema codiert) in einem 32-Bit-langen Wort speichere, kann die CPU sie dann als eine Menge mit 4 Elementen verstehen? Oder ist es notwendig, ein einzelnes Zeichen in einem ganzen Wort zu speichern? Gibt es einen Standard oder gehen verschiedene Architekturen unterschiedlich damit um?

Gibt es einen bestimmten Chip/Architektur im Sinn? Ansonsten scheint das hier nicht Thema zu sein.
Ich stimme dafür, diese Frage als nicht zum Thema gehörend zu schließen, da es nicht um Elektronikdesign geht.
Brian, ich habe diese Frage hier gepostet, weil ich mich allgemein auf Mikroprozessoren bezogen habe. Es ist eine Frage zur Computerarchitektur; dh Hardware. Soll ich die Frage auf die CS-Site verschieben?
Aus dem Hilfezentrum: „Wenn Sie eine vage Frage stellen, erhalten Sie eine vage Antwort. Aber wenn Sie uns Details und Kontext geben, können wir eine nützliche Antwort geben.“ Das SE-Moderationssystem ist darauf ausgerichtet, allgemeine Fragen zu schließen. Wenn Sie es auf eine andere Website bringen, kann das gleiche Ergebnis auftreten. Wenn Sie das Bedürfnis haben, auf einer anderen Website zu posten, posten Sie nicht. Bitte seien Sie konkret, bearbeiten Sie Ihre Frage und versuchen Sie es erneut. Da dies keine Diskussionsseite ist, werden die Fragen in einem Q&A-Format gehalten
@Humberto Fioravante Ferro, ja, das ist hauptsächlich eine CS-Frage. Ich denke jedoch, dass die folgenden Antworten Ihre Frage beantworten. Bitte akzeptieren Sie nur eine.

Antworten (4)

Ja, du kannst. Zum Beispiel sind die MSP430-Reihen von Texas Instruments 16-Bit-Prozessoren und haben 16-Bit-Wörter. Eine Vielzahl von Registern sind 16 Bit lang, können aber auch als 8-Bit-Register adressiert werden. Sein Speicherbus ist jedoch 16 Bit breit. Sie können problemlos 8-Bit-Bytes zum Speicher hinzufügen. Und verwenden Sie beide Bytes eines Speicherplatzes unabhängig voneinander oder zusammen, wenn Sie möchten.

Nachdem Sie das erwähnt haben, erinnerte ich mich daran, dass die Multimedia-Erweiterungen für die x86-Prozessoren (MMX und SSE) ganze Wörter als Sätze kleinerer Einheiten behandeln. Sie haben mich auch daran erinnert, dass der erste 16-Bit-Mikroprozessor von Intel es erlaubte, ein einzelnes 16-Bit-Register (z. B. AX) als zwei 8-Bit-Teile (z. B. AH und AL) zu behandeln. Selbst wenn der Datenbus 16 Bit breit (oder breiter) ist, erlauben Ihnen einige CPUs daher, jedes Byte separat zu behandeln. Der Haken ist, dass Sie das nicht direkt im Hauptspeicher tun können, Sie müssen zuerst das Wort in das Register einer CPU laden. Zweifel gelöst. Danke, @Passant!

Wenn Sie in C programmieren, hat ein Zeichen normalerweise die gleiche Größe wie die kleinste adressierbare Speichereinheit. Wenn die kleinste Sache, die Sie adressieren können, ein 16-Bit- oder 32-Bit-Wort ist, dann ist das ein Zeichen. In den meisten modernen Architekturen sind Zeichen 8 Bit lang und können in ein 32-Bit-Wort im Speicher gepackt werden. Aber in einigen wenigen (einigen DSPs) werden größere Bytes verwendet.

Es ist immer möglich, mit AND-, OR- und Shift-Operationen an einem Wortstück zu arbeiten, das kleiner als ein Byte ist. Auf diese Weise könnten Sie ASCII-Werte in 8 Bit packen, unabhängig davon, wie die Adressierung funktioniert. Das wäre jedoch nicht sehr portabel oder einfach zu handhaben.

Klingt sehr danach, als würden Sie über Gewerkschaften im C-Stil sprechen. In Kombination mit etwas Strukturmagie können Sie so dieselbe Sammlung von Bytes auf unterschiedliche Weise interpretieren, während Sie die Typen beibehalten. Der Compiler erledigt die Magie des Bitshifting/Bitmasking für Sie.

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

Ich habe hier eine Little-Endian-CPU angenommen, also wird die niederwertigste Adresse zuerst gespeichert oder "LSB zuerst".

Ich habe auf diesen Link verwiesen, wenn Sie ein bisschen mehr recherchieren möchten: https://www.tutorialspoint.com/cprogramming/c_unions.htm

Wenn Sie Daten auf diese Weise komprimieren möchten, liegt dies bei Ihnen. Das Mikro wird tun, was Sie ihm sagen. Es kann sogar Anweisungen zum Manipulieren von 8-Bit-Datenstücken enthalten. Möglicherweise gibt es dafür bereits Bibliotheken. Es kann sein, dass Sie, wenn Sie einen C-Compiler/eine C-Bibliothek verwenden, die dafür geschrieben wurde, dies mit Daten der Zeichengröße zu tun, und Sie nicht einmal mit Low-Level-Routinen umgehen müssen.

Wenn Sie jedoch mit einem Cortex arbeiten, haben Sie wahrscheinlich genug RAM, sodass dies kein Problem darstellt.