Endianität - Endianness

In der Computertechnik ist Endianness die Reihenfolge oder Folge von Bytes eines Wortes digitaler Daten im Computerspeicher . Endianness wird hauptsächlich als Big-Endian ( BE ) oder Little-Endian ( LE ) ausgedrückt . Ein Big-Endian-System speichert das höchstwertige Byte eines Wortes an der kleinsten Speicheradresse und das niedrigstwertige Byte an der größten. Im Gegensatz dazu speichert ein Little-Endian-System das niederwertigste Byte an der kleinsten Adresse.

Endianness kann auch verwendet werden, um die Reihenfolge zu beschreiben, in der die Bits über einen Kommunikationskanal übertragen werden, zB überträgt Big-Endian in einem Kommunikationskanal die höchstwertigen Bits zuerst. Bit-Endianness wird in anderen Kontexten selten verwendet.

Computer speichern Informationen in verschieden großen Gruppen von binären Bits. Jeder Gruppe wird eine Nummer zugewiesen, die als Adresse bezeichnet wird und die der Computer verwendet, um auf diese Daten zuzugreifen. Auf den meisten modernen Computern ist die kleinste Datengruppe mit einer Adresse acht Bit lang und wird als Byte bezeichnet. Größere Gruppen umfassen zwei oder mehr Bytes, beispielsweise enthält ein 32-Bit- Wort vier Bytes. Es gibt zwei Möglichkeiten, wie ein Computer die einzelnen Bytes in einer größeren Gruppe nummerieren könnte, beginnend an beiden Enden. Beide Arten von Endianness sind in der digitalen Elektronik weit verbreitet. Die anfängliche Wahl der Endianness eines neuen Designs ist oft willkürlich, aber spätere Technologierevisionen und -aktualisierungen verewigen die vorhandene Endianness, um die Abwärtskompatibilität aufrechtzuerhalten .

Intern funktioniert jeder Computer gleich gut, unabhängig davon, welche Endianness er verwendet, da seine Hardware durchgängig dieselbe Endianness zum Speichern und Laden seiner Daten verwendet. Aus diesem Grund ignorieren Programmierer und Computerbenutzer normalerweise die Endianness des Computers, mit dem sie arbeiten. Endianness kann jedoch zu einem Problem werden, wenn Daten außerhalb des Computers verschoben werden – beispielsweise bei der Übertragung von Daten zwischen verschiedenen Computern oder wenn ein Programmierer interne Computerdatenbytes aus einem Speicherabzug untersucht – und die verwendete Endianness von den Erwartungen abweicht. In diesen Fällen muss die Endianness der Daten verstanden und berücksichtigt werden. Bi-Endianness ist eine Funktion, die von zahlreichen Computerarchitekturen unterstützt wird, die eine umschaltbare Endianness bei Datenabrufen und -speichern oder für Befehlsabrufe aufweisen.

Big-Endianness ist die vorherrschende Reihenfolge in Netzwerkprotokollen, wie z. B. in der Internet Protocol Suite , wo sie als Netzwerkreihenfolge bezeichnet wird und das höchstwertige Byte zuerst überträgt. Umgekehrt ist Little-Endianness die vorherrschende Ordnung für Prozessorarchitekturen ( x86 , die meisten ARM- Implementierungen, RISC-V- Basisimplementierungen) und den zugehörigen Speicher. Dateiformate können eine der beiden Reihenfolgen verwenden; Einige Formate verwenden eine Mischung aus beidem oder enthalten einen Indikator dafür, welche Reihenfolge in der gesamten Datei verwendet wird.

Die Stile von Little- und Big-Endian können auch allgemeiner verwendet werden, um die Anordnung jeder Darstellung zu charakterisieren, zB die Ziffern in einem Zahlensystem oder die Abschnitte eines Datums . Zahlen in Positionsnotation werden im Allgemeinen mit ihren Ziffern in Big-Endian-Reihenfolge geschrieben, sogar in Rechts-nach-Links-Schriften . In ähnlicher Weise verwenden Programmiersprachen die Big-Endian-Ziffernreihenfolge für numerische Literale .

Beispiel

Endian-Beispiel
Big-Endian
Little-Endian

Diese beiden Diagramme zeigen, wie zwei Computer, die unterschiedliche Endianness verwenden, eine 32-Bit-Ganzzahl (vier Byte) mit dem Wert 0x0A0B0C0D speichern . In beiden Fällen wird die Ganzzahl in vier Bytes unterteilt, 0x0A , 0x0B , 0x0C und 0x0D , und die Bytes werden in vier aufeinanderfolgenden Byte-Speicherplätzen gespeichert, beginnend mit dem Speicherort mit der Adresse a , dann a + 1 , a + 2 und a + 3 . Der Unterschied zwischen Big- und Little-Endian ist die Reihenfolge der vier Bytes der ganzen Zahl, die gespeichert werden.

Das linke Diagramm zeigt einen Computer mit Big-Endian. Dies startet die Speicherung der ganzen Zahl mit dem meist -significant Byte, 0x0A , bei der Adresse a , und endet mit dem mindestens -significant Byte, 0x0D , bei der Adresse A + 3 .

Das rechte Diagramm zeigt einen Computer mit Little-Endian. Dies startet die Speicherung der ganzen Zahl mit dem mindestens -significant Byte, 0x0D , bei der Adresse a , und endet mit dem meist -significant Byte, 0x0A , bei der Adresse A + 3 .

Da jeder Computer dieselbe Endianness verwendet, um die ganze Zahl zu speichern und abzurufen, sind die Ergebnisse für beide Computer gleich. Probleme können auftreten, wenn der Speicher durch Bytes statt durch ganze Zahlen adressiert wird oder wenn Speicherinhalte zwischen Computern mit unterschiedlicher Endianness übertragen werden.

Etymologie

Danny Cohen führte in einer 1980 veröffentlichten Internet Experiment Note die Begriffe Big-Endian und Little-Endian für die Datenordnung in die Informatik ein .

Das Adjektiv endian hat seinen Ursprung in den Schriften des anglo-irischen Schriftstellers Jonathan Swift aus dem 18. Jahrhundert . In dem Roman Gullivers Reisen von 1726 schildert er den Konflikt zwischen Sekten von Liliputanern, die in diejenigen unterteilt sind, die die Schale eines gekochten Eies vom großen Ende oder vom kleinen Ende zerbrechen. Er nannte sie die Big-Endians und die Little-Endians . Cohen macht die Verbindung zu Gullivers Reisen im Anhang zu seiner Notiz von 1980 deutlich.

Grundlagen

Der Computerspeicher besteht aus einer Folge von Speicherzellen (kleinsten adressierbaren Einheiten), die am häufigsten als Bytes bezeichnet werden . Jedes Byte wird in Hardware und Software durch seine Speicheradresse identifiziert und darauf zugegriffen . Wenn die Gesamtzahl der Bytes im Speicher n beträgt , werden die Adressen von 0 bis n  − 1 aufgezählt .

Computerprogramme verwenden oft Datenstrukturen oder Felder , die aus mehr Daten bestehen können, als in einem Byte gespeichert werden können. Im Rahmen dieses Artikels, dessen Typ nicht beliebig kompliziert sein kann, besteht ein „Feld“ aus einer fortlaufenden Folge von Bytes und stellt einen „einfachen Datenwert“ dar, der – zumindest potentiell – durch einen einzigen Hardwarebefehl manipuliert werden kann . Die Adresse eines solchen Feldes ist meistens die Adresse seines ersten Bytes.

Ein weiteres wichtiges Attribut eines Bytes als Teil eines "Feldes" ist seine "Bedeutung". Diese Attribute der Teile eines Feldes spielen eine wichtige Rolle in der Reihenfolge, in der auf die Bytes von der Computerhardware zugegriffen wird, genauer: von den Low-Level-Algorithmen, die zu den Ergebnissen einer Computeranweisung beitragen.

Zahlen

Positionszahlensysteme (meist zur Basis 10, zur Basis 2 oder zur Basis 256 bei 8-Bit-Bytes) sind die vorherrschende Art, ganzzahlige Daten durch Computer darzustellen und insbesondere zu manipulieren . In reiner Form gilt dies für mittelgroße nicht negative ganze Zahlen, zB vom Datentyp C unsigned. In einem solchen Zahlensystem wird der Wert einer Ziffer, den sie zur ganzen Zahl beiträgt, nicht nur durch ihren Wert als einzelne Ziffer bestimmt, sondern auch durch die Position, die sie in der vollständigen Zahl einnimmt, ihre Bedeutung. Diese Positionen können hauptsächlich auf zwei Arten dem Speicher zugeordnet werden:

  • abnehmende numerische Signifikanz mit zunehmender Speicheradresse (oder zunehmender Zeit), bekannt als Big-Endian und
  • zunehmende numerische Signifikanz mit zunehmender Speicheradresse (oder zunehmender Zeit), bekannt als Little-Endian .

Die Integer-Daten, die direkt von der Computerhardware unterstützt werden, haben eine feste Breite einer kleinen Potenz von 2, zB 8 Bit 1 Byte, 16 Bit ≙ 2 Byte, 32 Bit ≙ 4 Byte, 64 Bit ≙ 8 Byte, 128 Bit ≙ 16 Byte. Die Zugriffssequenz auf niedriger Ebene auf die Bytes eines solchen Feldes hängt von der durchzuführenden Operation ab. Für Addition , Subtraktion und Multiplikation wird zuerst auf das niederwertigste Byte zugegriffen . Für Division und Vergleich wird zuerst auf das höchstwertige Byte zugegriffen . Siehe § Berechnungsreihenfolge .

Für Gleitkommazahlen siehe § Gleitkomma .

Text

Wenn Zeichenketten (Text-Strings) miteinander verglichen werden sollen, zB um Mechanismen wie das Sortieren zu unterstützen , geschieht dies sehr häufig lexikographisch, wobei ein einzelnes Positionselement (Zeichen) auch einen Positionswert hat. Der lexikographische Vergleich bedeutet fast überall: Das erste Zeichen steht am höchsten – wie im Telefonbuch.

Integer - Zahlen als Text geschrieben werden immer höchstwertige Stelle zuerst im Speicher dargestellt , die auf Big-Endian - ähnlich ist, unabhängig von Textrichtung .

Hardware

Geschichte

Viele historische und vorhandene Prozessoren verwenden eine Big-Endian-Speicherdarstellung, entweder ausschließlich oder als Designoption. Andere Prozessortypen verwenden die Little-Endian-Speicherdarstellung; andere verwenden noch ein anderes Schema namens Middle-Endian , Mixed-Endian oder PDP-11- Endian .

Das IBM System/360 verwendet Big-Endian-Byte-Reihenfolge, ebenso wie seine Nachfolger System/370 , ESA/390 und z/Architecture . Der PDP-10 verwendet Big-Endian-Adressierung für byteorientierte Befehle. Der Minicomputer IBM Series/1 verwendet eine Big-Endian-Byte-Reihenfolge.

Der Umgang mit Daten unterschiedlicher Endianness wird manchmal als NUXI-Problem bezeichnet . Diese Terminologie spielt auf Konflikte in der Byte-Reihenfolge an, die bei der Anpassung von UNIX , das auf dem Mixed-Endian-PDP-11 lief, an einen Big-Endian-Computer der IBM Series/1 angetroffen wurden . Unix war eines der ersten Systeme, das es ermöglichte, den gleichen Code für Plattformen mit unterschiedlichen internen Darstellungen zu kompilieren. Eines der ersten konvertierten Programme sollte ausdrucken Unix, aber auf der Serie/1 wurde es nUxistattdessen gedruckt .

Der Datapoint 2200 verwendet einfache bitserielle Logik mit Little-Endian, um die Übertragsausbreitung zu erleichtern . Als Intel den 8008- Mikroprozessor für Datapoint entwickelte, wurde Little-Endian aus Kompatibilitätsgründen verwendet. Da Intel den 8008 jedoch nicht rechtzeitig liefern konnte, verwendete Datapoint ein mittelgroßes Integrationsäquivalent , aber die Little-Endianness wurde in den meisten Intel-Designs beibehalten, einschließlich des MCS-48 und des 8086 und seiner x86- Nachfolger. Der DEC Alpha , Atmel AVR , VAX , die MOS Technology 6502 Familie (einschließlich Western Design Center 65802 und 65C816 ) ), der Zilog Z80 (einschließlich Z180 und eZ80 ), der Altera Nios II und viele andere Prozessoren und Prozessorfamilien sind ebenfalls wenig endian.

Die Prozessorserien Motorola 6800 / 6801, 6809 und 68000 verwendeten das Big-Endian-Format.

Der Intel 8051 erwartet im Gegensatz zu anderen Intel-Prozessoren 16-Bit-Adressen für LJMP und LCALL im Big-Endian-Format; xCALL-Anweisungen speichern jedoch die Rückkehradresse auf dem Stack im Little-Endian-Format.

SPARC verwendet in der Vergangenheit Big-Endian bis Version 9, die Bi-Endian ist ; ähnlich waren die frühen IBM POWER-Prozessoren Big-Endian, aber die Nachkommen von PowerPC und Power ISA sind jetzt Bi-Endian. Die ARM-Architektur war vor Version 3 Little-Endian, als sie Bi-Endian wurde.

Aktuelle Architekturen

Die Prozessorserien Intel x86 und AMD64 / x86-64 verwenden das Little-Endian-Format. Andere Befehlssatzarchitekturen, die dieser Konvention folgen und nur den Little-Endian-Modus ermöglichen, umfassen Nios II , Andes Technology NDS32 und Qualcomm Hexagon .

Einige Befehlssatzarchitekturen ermöglichen das Ausführen von Software beider Endianness auf einer Bi-Endian-Architektur. Dazu gehören ARM AArch64 , C-Sky , Power ISA und RISC-V .

Zu den Big-Endian-Architekturen gehören ausschließlich IBM z/Architecture , Freescale ColdFire ( basierend auf der Motorola 68000-Serie ), Atmel AVR32 und OpenRISC . Die Betriebssysteme IBM AIX und Oracle Solaris auf Bi-Endian Power ISA und SPARC laufen im Big-Endian-Modus; Einige Distributionen von Linux on Power sind in den Little-Endian-Modus übergegangen.

Bi-Endianität

Einige Architekturen (einschließlich ARM- Versionen 3 und höher, PowerPC , Alpha , SPARC V9, MIPS , PA-RISC , SuperH SH-4 und IA-64 ) verfügen über eine Einstellung, die eine umschaltbare Endianness bei Datenabrufen und -speichern, Befehlsabrufen oder . ermöglicht beide. Diese Funktion kann die Leistung verbessern oder die Logik von Netzwerkgeräten und Software vereinfachen. Das Wort Bi-Endian bezeichnet , wenn es von Hardware gesprochen wird, die Fähigkeit der Maschine, Daten in jedem Endian-Format zu berechnen oder weiterzugeben.

Viele dieser Architekturen können per Software auf ein bestimmtes Endian-Format umgestellt werden (normalerweise beim Starten des Computers); auf einigen Systemen wird die Standard-Endianness jedoch durch die Hardware auf dem Motherboard ausgewählt und kann nicht per Software geändert werden (zB Alpha, das auf dem Cray T3E nur im Big-Endian-Modus läuft ).

Beachten Sie, dass sich der Begriff Bi-Endian in erster Linie darauf bezieht, wie ein Prozessor Datenzugriffe behandelt. Befehlszugriffe (Abrufe von Befehlswörtern) auf einem bestimmten Prozessor können immer noch eine feste Endianität annehmen, selbst wenn die Datenzugriffe vollständig bi-endian sind, obwohl dies nicht immer der Fall ist, wie bei Intels IA-64- basierter Itanium-CPU, die lässt beides zu.

Beachten Sie auch, dass einige nominell Bi-Endian-CPUs die Unterstützung des Motherboards benötigen, um die Endianness vollständig umzuschalten. Die 32-Bit-Desktop-orientierten PowerPC- Prozessoren im Little-Endian-Modus fungieren beispielsweise aus Sicht der ausführenden Programme als Little-Endian, erfordern jedoch, dass das Motherboard einen 64-Bit-Swap über alle 8 Byte-Lanes durchführt, um Stellen Sie sicher, dass die Little-Endian-Sicht auf E/A- Geräte zutrifft . In Abwesenheit dieser ungewöhnlichen Motherboard-Hardware muss die Gerätetreibersoftware an verschiedene Adressen schreiben, um die unvollständige Transformation rückgängig zu machen, und muss außerdem einen normalen Byte-Swap durchführen.

Einige CPUs, wie z. B. viele PowerPC-Prozessoren, die für den Embedded-Einsatz gedacht sind, und fast alle SPARC-Prozessoren ermöglichen die Auswahl der Endianness pro Seite.

SPARC-Prozessoren seit den späten 1990er Jahren (SPARC v9-konforme Prozessoren) ermöglichen die Auswahl der Datenendianität mit jedem einzelnen Befehl, der aus dem Speicher geladen oder in den Speicher gespeichert wird.

Die ARM-Architektur unterstützt zwei Big-Endian-Modi, BE-8 und BE-32 genannt . CPUs bis ARMv5 unterstützen nur BE-32 oder den wortinvarianten Modus. Hier funktioniert jeder natürlich ausgerichtete 32-Bit-Zugriff wie im Little-Endian-Modus, aber der Zugriff auf ein Byte oder 16-Bit-Wort wird an die entsprechende Adresse umgeleitet und ein unausgerichteter Zugriff ist nicht erlaubt. ARMv6 führt BE-8 oder den byte-invarianten Modus ein, bei dem der Zugriff auf ein einzelnes Byte wie im Little-Endian-Modus funktioniert, aber der Zugriff auf ein 16-Bit-, 32-Bit- oder (ab ARMv8) 64-Bit-Wort zu einem Byte-Swap führt der Daten. Dies vereinfacht den unausgerichteten Speicherzugriff sowie den speicherabgebildeten Zugriff auf andere Register als 32 Bit.

Viele Prozessoren haben Anweisungen, um ein Wort in einem Register in die entgegengesetzte Endianness umzuwandeln, dh sie tauschen die Reihenfolge der Bytes in einem 16-, 32- oder 64-Bit-Wort aus. Alle einzelnen Bits werden jedoch nicht vertauscht.

Neuere Intel x86- und x86-64-Architektur-CPUs verfügen über einen MOVBE-Befehl ( Intel Core seit Generation 4, nach Atom ), der ein Wort im Big-Endian-Format aus dem Speicher holt oder ein Wort im Big-Endian-Format in den Speicher schreibt. Diese Prozessoren sind ansonsten durchaus Little-Endian. Sie verfügten auch bereits über eine Reihe von Swap-Befehlen, um die Byte-Reihenfolge des Inhalts von Registern umzukehren, beispielsweise wenn Wörter bereits aus Speicherplätzen geholt wurden, an denen sie sich in der "falschen" Endianness befanden.

Gleitkomma

Obwohl die allgegenwärtigen x86-Prozessoren von heute Little-Endian-Speicher für alle Arten von Daten (Ganzzahl, Gleitkomma) verwenden, gibt es eine Reihe von Hardwarearchitekturen, bei denen Gleitkommazahlen in Big-Endian-Form dargestellt werden, während Ganzzahlen in Little-Endian-Form dargestellt werden. Endian-Form. Es gibt ARM- Prozessoren, die halb Little-Endian-, halb Big-Endian-Gleitkommadarstellung für Zahlen mit doppelter Genauigkeit haben: Beide 32-Bit-Wörter werden in Little-Endian-ähnlichen Integer-Registern gespeichert, aber das höchstwertige zuerst. Da es viele Gleitkommaformate ohne " Netzwerk "-Standarddarstellung für sie gab, verwendet der XDR- Standard Big-Endian-IEEE 754 als seine Darstellung. Es mag daher seltsam erscheinen, dass der weit verbreitete Gleitkomma-Standard IEEE 754 keine Endianness spezifiziert. Theoretisch bedeutet dies, dass selbst Standard-IEEE-Gleitkommadaten, die von einem Computer geschrieben wurden, von einem anderen möglicherweise nicht gelesen werden können. Auf modernen Standardcomputern (dh die IEEE 754) implementieren, kann man jedoch in der Praxis sicher annehmen, dass die Endianness für Gleitkommazahlen dieselbe ist wie für ganze Zahlen, was die Konvertierung unabhängig vom Datentyp unkompliziert macht. (Kleine eingebettete Systeme, die spezielle Gleitkommaformate verwenden, können jedoch eine andere Sache sein.)

VAX- Gleitkomma speichert Little-Endian-16-Bit-Wörter in Big-Endian-Reihenfolge.

Daten variabler Länge

Die meisten bisher betrachteten Anweisungen enthalten die Größe (Längen) ihrer Operanden innerhalb des Operationscodes . Häufig verfügbare Operandenlängen sind 1, 2, 4, 8 oder 16 Byte. Es gibt aber auch Architekturen, bei denen die Länge eines Operanden in einem separaten Feld der Anweisung oder mit dem Operanden selbst, zB durch eine Wortmarke , festgehalten werden kann . Ein solcher Ansatz ermöglicht Operandenlängen bis zu 256 Byte oder sogar die volle Speichergröße. Die Datentypen solcher Operanden sind Zeichenketten oder BCD .

Maschinen, die solche Daten mit einer Anweisung manipulieren (zB vergleichen, addieren) sind zB IBM 1401 , 1410 , 1620 , System/3x0 , ESA/390 und z/Architecture , alle vom Typ Big-Endian.

Optimierung

Das Little-Endian-System hat die Eigenschaft, dass derselbe Wert in unterschiedlichen Längen aus dem Speicher gelesen werden kann, ohne unterschiedliche Adressen zu verwenden (auch wenn Ausrichtungsbeschränkungen auferlegt werden). Beispielsweise kann ein 32-Bit-Speicherplatz mit Inhalt 4A 00 00 00an derselben Adresse gelesen werden, entweder als 8-Bit (Wert = 4A), 16-Bit (004A), 24-Bit (00004A) oder 32-Bit (0000004A) , die alle denselben numerischen Wert beibehalten. Obwohl diese Little-Endian-Eigenschaft selten direkt von Programmierern auf hoher Ebene verwendet wird, wird sie häufig von Codeoptimierern sowie von Assemblerprogrammierern verwendet .

Konkreter ausgedrückt entsprechen solche Optimierungen dem folgenden C-Code , der auf den meisten Little-Endian-Systemen true zurückgibt:

union {
  uint8_t u8; uint16_t u16; uint32_t u32; uint64_t u64;
} u = { .u64 = 0x4A };
puts(u.u8 == u.u16 && u.u8 == u.u32 && u.u8 == u.u64 ? "true" : "false");

Obwohl dies von C++ nicht erlaubt ist, wird ein solcher Typ-Punning- Code vom C11-Standard als "implementierungsdefiniert" zugelassen und häufig in Code verwendet, der mit Hardware interagiert.

Andererseits kann es in manchen Situationen nützlich sein, eine Annäherung an einen Mehrbyte- oder Mehrwortwert zu erhalten, indem nur der signifikanteste Teil anstelle der vollständigen Darstellung gelesen wird; ein Big-Endian-Prozessor kann eine solche Näherung unter Verwendung derselben Basisadresse lesen, die für den vollen Wert verwendet würde.

Optimierungen dieser Art sind nicht auf Systeme unterschiedlicher Endianness übertragbar.

Berechnungsreihenfolge

Einige Operationen in Positionszahlensystemen haben eine natürliche oder bevorzugte Reihenfolge, in der die elementaren Schritte ausgeführt werden sollen. Diese Reihenfolge kann ihre Leistung auf kleinen byteadressierbaren Prozessoren und Mikrocontrollern beeinträchtigen . Hochleistungsprozessoren holen jedoch normalerweise typische Multibyte-Operanden aus dem Speicher in der gleichen Zeit, in der sie ein einzelnes Byte geholt hätten, so dass die Komplexität der Hardware durch die Byte-Reihenfolge nicht beeinflusst wird.

Addition, Subtraktion und Multiplikation beginnen an der niedrigstwertigen Stelle und propagieren den Übertrag zur nachfolgenden höherwertigen Stelle. Die Adressierung mehrstelliger Daten an ihrem ersten (= kleinsten Adress-)Byte ist das vorherrschende Adressierungsschema. Wenn dieses erste Byte die niedrigstwertige Ziffer enthält – was Little- Endianness entspricht, dann ist die Implementierung dieser Operationen geringfügig einfacher.

Vergleich und Division beginnen an der höchstwertigen Stelle und propagieren einen möglichen Übertrag an die nachfolgenden niederwertigen Stellen. Für numerische Werte fester Länge (typischerweise der Länge 1,2,4,8,16) ist die Implementierung dieser Operationen auf Big-Endian-Maschinen geringfügig einfacher.

Viele Big-Endian-Prozessoren (zB das IBM System/360 und seine Nachfolger) enthalten Hardware-Anweisungen zum lexikographischen Vergleichen von Zeichenketten unterschiedlicher Länge.

Der normale Datentransport durch eine Zuweisungsanweisung ist grundsätzlich unabhängig von der Endianness des Prozessors.

Middle-Endian

Zahlreiche andere Ordnungen, allgemein als Middle-Endian oder Mixed-Endian bezeichnet , sind möglich. Ein solches Beispiel außerhalb der Informatik ist die amerikanische Standard-Datumsformatierung von Monat/Tag/Jahr.

PDP-Endian

Die PDP-11 ist im Prinzip ein 16-Bit-Little-Endian-System. Die Anweisungen zum Konvertieren zwischen Gleitkomma- und Ganzzahlwerten im optionalen Gleitkommaprozessor des PDP-11/45, PDP-11/70 und in einigen späteren Prozessoren speicherten 32-Bit-Werte mit „doppelter Genauigkeit ganzzahliger Länge“ mit die 16-Bit-Hälften wurden von der erwarteten Little-Endian-Reihenfolge vertauscht. Der UNIX- C- Compiler verwendete das gleiche Format für 32-Bit-Long-Integer. Diese Reihenfolge wird als PDP-endian bezeichnet .

Eine Möglichkeit, diese Endianität zu interpretieren, besteht darin, dass sie eine 32-Bit-Ganzzahl als zwei 16-Bit-Wörter in Big-Endian speichert, aber die Wörter selbst sind Little-Endian (zB "jag cog sin" wäre "gaj goc nis"):

Speicherung einer 32-Bit-Ganzzahl, 0x0A0B0C0D , auf einem PDP-11
steigende Adressen   →
... 0B h 0A h 0D h 0C h ...
... 0A0B h 0C0D h ...

Die 16-Bit-Werte beziehen sich hier auf ihre Zahlenwerte, nicht auf ihr tatsächliches Layout.

Intel IA-32 Segmentdeskriptoren

Segmentdeskriptoren von IA-32 und kompatiblen Prozessoren halten eine 32-Bit-Basisadresse des Segments in Little-Endian-Reihenfolge gespeichert, jedoch in vier nicht aufeinanderfolgenden Bytes, an den relativen Positionen 2, 3, 4 und 7 des Deskriptorstarts.

Byte-Adressierung

Wenn Speicherbytes sequentiell von links nach rechts gedruckt werden (zB in einem Hex-Dump ), hat die Little-Endian-Darstellung von ganzen Zahlen eine von links nach rechts zunehmende Bedeutung. Mit anderen Worten, es erscheint bei der Visualisierung rückwärts, was kontraintuitiv sein kann.

Dieses Verhalten tritt beispielsweise bei FourCC oder ähnlichen Techniken auf, die das Packen von Zeichen in eine ganze Zahl beinhalten, so dass es zu einer Sequenz von bestimmten Zeichen im Speicher wird. Definieren wir die Notation 'John'einfach als das Ergebnis des Schreibens der Zeichen in hexadezimalem ASCII und Anhängen 0xan den Anfang, und analog für kürzere Sequenzen (ein C-Mehrzeichenliteral im Unix/MacOS-Stil):

   '  J  o  h  n  '
hex  4A 6F 68 6E
----------------
   -> 0x4A6F686E

Auf Big-Endian-Maschinen erscheint der Wert von links nach rechts und stimmt mit der richtigen String-Reihenfolge zum Lesen des Ergebnisses überein:

steigende Adressen   →
... 4A h 6F h 68 Stunden 6E h ...
... 'J' 'Ö' 'h' 'n' ...

Aber auf einer Little-Endian-Maschine würde man sehen:

steigende Adressen   →
... 6E h 68 Stunden 6F h 4A h ...
... 'n' 'h' 'Ö' 'J' ...

Middle-Endian-Maschinen wie der Honeywell 316 oben verkomplizieren dies noch weiter: Der 32-Bit-Wert wird als zwei 16-Bit-Wörter 'hn' 'Jo' in Little-Endian gespeichert , selbst mit einer Big-Endian-Notation (also 'h' 'n' 'J' 'o' ).

Byte-Swapping

Byte-Swapping besteht darin, jedes Byte zu maskieren und an die richtige Stelle zu verschieben. Viele Compiler bieten eingebaute Funktionen , die wahrscheinlich in native Prozessorbefehle ( bswap/ movbe) kompiliert werden , wie z __builtin_bswap32. Softwareschnittstellen für den Austausch umfassen:

  • Standard- Netzwerk-Endianness- Funktionen (von/bis BE, bis 32-Bit). Windows hat eine 64-Bit-Erweiterung in winsock2.h.
  • BSD- und Glibc- endian.hFunktionen (von/bis BE und LE, bis 64-Bit).
  • macOS- OSByteOrder.h Makros (von/bis BE und LE, bis 64-Bit).

Dateien und Dateisysteme

Die Erkennung der Endianness ist wichtig, wenn eine Datei oder ein Dateisystem gelesen wird, die auf einem Computer mit anderer Endianness erstellt wurde.

Einige CPU- Befehlssätze bieten native Unterstützung für Endian-Byte-Swapping, wie bswap( x86 - 486 und höher) und rev( ARMv6 und höher).

Einige Compiler verfügen über eingebaute Funktionen zum Byte-Swapping. Beispielsweise unterstützt der Intel Fortran- Compiler CONVERTbeim Öffnen einer Datei den nicht standardmäßigen Spezifizierer, zB: . OPEN(unit, CONVERT='BIG_ENDIAN',...)

Einige Compiler verfügen über Optionen zum Generieren von Code, der die Konvertierung für alle Datei-E/A-Operationen global aktiviert. Dies ermöglicht die Wiederverwendung von Code auf einem System mit der entgegengesetzten Endianness ohne Codemodifikation.

Fortran-sequentielle unformatierte Dateien, die mit einer Endianness erstellt wurden, können normalerweise nicht auf einem System gelesen werden, das die andere Endianness verwendet, da Fortran normalerweise einen Datensatz (definiert als die Daten, die von einer einzelnen Fortran-Anweisung geschrieben werden) als Daten implementiert , denen Zählfelder vorangehen und folgen, die ganze Zahlen gleich sind auf die Anzahl der Bytes in den Daten. Ein Versuch, eine solche Datei mit Fortran auf einem System der anderen Endianness zu lesen, führt dann zu einem Laufzeitfehler, da die Zählfelder falsch sind. Dieses Problem kann vermieden werden, indem sequentielle Binärdateien geschrieben werden, im Gegensatz zu sequentiellen unformatierten. Beachten Sie jedoch , dass es relativ einfach ist , ein Programm in einer anderen Sprache (zB zu schreiben C oder Python ) , die Parsen Fortran sequentielle unformatierte Dateien von „fremdem“ Endian und wandelt sie in „native“ Endian, von der „fremden“ Endian - Umwandlung , wenn Lesen der Fortran-Datensätze und -Daten.

Unicode- Text kann optional mit einer Byte-Reihenfolge-Markierung (BOM) beginnen, um die Endianness der Datei oder des Streams zu signalisieren. Sein Codepunkt ist U+FEFF. In UTF-32 beispielsweise sollte eine Big-Endian-Datei mit 00 00 FE FF; ein Little-Endian sollte mit beginnen FF FE 00 00.

Binäre Anwendungsdatenformate, wie beispielsweise MATLAB .mat- Dateien oder das in der Topographie verwendete .bil -Datenformat, sind normalerweise endianness-unabhängig. Dies wird dadurch erreicht, dass die Daten immer in einer festen Endianness gespeichert werden oder indem mit den Daten ein Schalter mitgeführt wird, um die Endianness anzuzeigen.

Ein Beispiel für den ersten Fall ist das binäre XLS-Dateiformat , das zwischen Windows- und Mac-Systemen portierbar und immer Little-Endian ist, sodass die Mac-Anwendung die Bytes beim Laden austauschen und speichern kann, wenn sie auf einem Big-Endian-Motorola 68K- oder PowerPC-Prozessor ausgeführt wird .

TIFF- Bilddateien sind ein Beispiel für die zweite Strategie, deren Header die Anwendung über die Endianness ihrer internen binären Integer anweist. Wenn eine Datei mit der Signatur beginnt MM, bedeutet dies, dass Ganzzahlen als Big-Endian dargestellt werden, während es sich um IILittle-Endian handelt. Diese Signaturen benötigen jeweils ein einzelnes 16-Bit-Wort, und sie sind Palindrome ( dh sie lesen vorwärts und rückwärts gleich), also sind sie unabhängig von der Endianität. Isteht für Intel und Msteht für Motorola , die jeweiligen CPU- Anbieter der IBM PC- kompatiblen (Intel) und Apple Macintosh- Plattformen (Motorola) in den 1980er Jahren. Intel-CPUs sind Little-Endian, während Motorola 680x0-CPUs Big-Endian sind. Diese explizite Signatur ermöglicht es einem TIFF-Leseprogramm, bei Bedarf Bytes auszutauschen, wenn eine gegebene Datei von einem TIFF-Schreibprogramm generiert wurde, das auf einem Computer mit einer anderen Endianness ausgeführt wird.

Als Folge seiner ursprünglichen Implementierung auf der Intel 8080-Plattform ist das betriebssystemunabhängige File Allocation Table (FAT)-Dateisystem mit Little-Endian-Byte-Reihenfolge definiert, selbst auf Plattformen, die nativ andere Endiannes verwenden, was Byte-Swap-Operationen für die Wartung erfordert das Fett.

ZFS / OpenZFS kombinierter Dateisystem- und Logical Volume Manager ist dafür bekannt, adaptive Endianness bereitzustellen und sowohl mit Big-Endian- als auch Little-Endian-Systemen zu arbeiten.

Vernetzung

Viele IETF-RFCs verwenden den Begriff Netzwerkreihenfolge , was die Übertragungsreihenfolge für Bits und Bytes über die Leitung in Netzwerkprotokollen bedeutet . Unter anderem hat der historische RFC 1700 (auch bekannt als Internetstandard STD 2) die Netzwerkreihenfolge für Protokolle in der Internet Protocol Suite als Big-Endian definiert , daher der Begriff "Network Byte Order" für Big-Endian-Byte Auftrag.

Allerdings verwenden nicht alle Protokolle die Big-Endian-Bytereihenfolge als Netzwerkreihenfolge. Das Server Message Block (SMB)-Protokoll verwendet die Little-Endian-Byte-Reihenfolge. Bei CANopen werden Multi-Byte-Parameter immer das niederwertigste Byte zuerst gesendet (Little-Endian). Das gleiche gilt für Ethernet Powerlink .

Die Berkeley-Sockets- API definiert eine Reihe von Funktionen zum Konvertieren von 16-Bit- und 32-Bit-Ganzzahlen in und aus der Netzwerk-Byte-Reihenfolge: Die Funktionen htons(Host-zu-Netzwerk-kurz) und htonl(Host-zu-Netzwerk-lang) konvertieren 16- Bit- bzw. 32-Bit-Werte von der Maschine ( Host ) zur Netzwerkreihenfolge; die ntohsund ntohl-Funktionen konvertieren von Netzwerk- in Host-Reihenfolge. Diese Funktionen können auf einem Big-Endian-System eine No-Op sein.

Während die High-Level-Netzwerkprotokolle normalerweise das Byte (meist als Oktett gemeint ) als ihre atomare Einheit betrachten, können sich die niedrigsten Netzwerkprotokolle mit der Anordnung von Bits innerhalb eines Bytes befassen.

Bit-Endianität

Die Bitnummerierung ist ein Konzept, das der Endianness ähnelt, jedoch auf einer Ebene von Bits und nicht von Bytes. Bit-Endianness oder Bit-Level-Endianness bezieht sich auf die Übertragungsreihenfolge von Bits über ein serielles Medium. Das Bit-Level-Analogon von Little-Endian (niederwertiges Bit geht zuerst) wird in RS-232 , HDLC , Ethernet und USB verwendet . Einige Protokolle verwenden die entgegengesetzte Reihenfolge (zB Teletext , I 2 C , SMBus , PMBus und SONET und SDH ), und ARINC 429 verwendet eine Reihenfolge für sein Label-Feld und die andere Reihenfolge für den Rest des Rahmens. Üblicherweise besteht eine konsistente Sicht auf die Bits unabhängig von ihrer Reihenfolge im Byte, so dass letztere nur auf sehr geringem Niveau relevant werden. Eine Ausnahme wird durch das Merkmal einiger zyklischer Redundanzprüfungen verursacht , um alle Burstfehler bis zu einer bekannten Länge zu erkennen, die verdorben würden, wenn sich die Bitreihenfolge von der Bytereihenfolge bei der seriellen Übertragung unterscheidet.

Abgesehen von der Serialisierung werden die Begriffe Bit-Endianness und Bit-Level-Endianness selten verwendet, da Computerarchitekturen, bei denen jedes einzelne Bit eine eindeutige Adresse hat, selten sind. Auf einzelne Bits oder Bitfelder wird über ihren Zahlenwert oder in höheren Programmiersprachen über vergebene Namen zugegriffen, deren Auswirkungen jedoch maschinenabhängig sein können oder keine Software-Portabilität aufweisen .

Anmerkungen

Verweise

Zitate

Weiterlesen

Externe Links