Endianness (Deutsch)

HistoryEdit

Viele historische und vorhandene Prozessoren verwenden eine Big-Endian-Speicherdarstellung, entweder ausschließlich oder als Entwurfsoption. Die Big-Endian-Speicherdarstellung wird allgemein als Netzwerkreihenfolge bezeichnet, wie sie in der Internet Protocol Suite verwendet wird. Andere Prozessortypen verwenden Little-Endian-Speicherdarstellung; andere verwenden ein weiteres Schema namens „Middle-Endian“, „Mixed-Endian“ oder „PDP-11-Endian“.

Das IBM System / 360 verwendet Big-Endian-Bytereihenfolge, ebenso wie seine Nachfolger System / 370, ESA/390 und z / Architecture., Der PDP-10 verwendet auch die Big-Endian-Adressierung für byteorientierte Anweisungen. Der Minicomputer der IBM-Serie/1 verwendet auch die Big-Endian-Bytereihenfolge.

Der Umgang mit Daten unterschiedlicher Endianness wird manchmal als NUXI-Problem bezeichnet. Diese Terminologie spielt auf die Bytereihenfolgekonflikte an, die bei der Anpassung von UNIX, das auf dem Mixed-Endian PDP-11 lief, an einen Big-Endian IBM Series/1-Computer aufgetreten sind. Unix war eines der ersten Systeme, mit dem derselbe Code für Plattformen mit unterschiedlichen internen Darstellungen kompiliert werden konnte., Eines der ersten konvertierten Programme sollte Unix ausdrucken, aber auf der Serie/1 wurde stattdessen nUxi gedruckt.

Der Datapoint 2200 verwendet eine einfache bit-serielle Logik mit Little-Endian, um die Übertragungsausbreitung zu erleichtern. Als Intel den 8008-Mikroprozessor für Datapoint entwickelte, verwendeten sie Little-Endian für die Kompatibilität., 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. Die 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 Little-Endian.

Das Motorola 6800 / 6801, die 6809-und die 68000-Prozessorserie 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 die Rücksendeadresse jedoch im Little-Endian-Format auf dem Stapel.

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

Aktuelle Architekturedit

Die Prozessoren der Intel x86-und AMD64 / x86-64-Serie verwenden das Little-Endian-Format. Andere Befehlssatzarchitekturen, die dieser Konvention folgen und nur den Little-Endian-Modus zulassen, 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. Dies umfasst ARM, AArch64, C-Sky, Power ISA, und RISC-V.,

Allein big-endian-Architekturen gehören die IBM z/Architecture, Freescale ColdFire (das ist der Motorola-68000-Basis), Atmel AVR32, und OpenRISC. Die IBM AIX-und Oracle Solaris-Betriebssysteme auf Bi-Endian Power ISA und SPARC laufen im Big-Endian-Modus; Einige Linux-Distributionen auf Power sind in den Little-Endian-Modus übergegangen.,

Bi-endiannessEdit

Einige Architekturen (einschließlich ARM-Versionen 3 und höher, PowerPC, Alpha, SPARC V9, MIPS, PA-RISC, Superhite-4 und IA-64) verfügen über eine Einstellung, die eine umschaltbare Endianness beim Abrufen und Speichern von Daten, beim Abrufen von Befehlen oder beidem ermöglicht. Diese Funktion kann die Leistung verbessern oder die Logik von Netzwerkgeräten und Software vereinfachen. Das Wort Bi-Endian bezeichnet, wenn es um Hardware geht, die Fähigkeit der Maschine, Daten im Endian-Format zu berechnen oder zu übergeben.,

Viele dieser Architekturen können über Software auf ein bestimmtes Endian-Format umgeschaltet werden (normalerweise beim Start des Computers); Auf einigen Systemen wird die Standard-Endianness jedoch von der Hardware auf dem Motherboard ausgewählt und kann nicht über Software geändert werden (z. B. das Alpha, das nur im Big-Endian-Modus auf dem Cray T3E ausgeführt wird).

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 Endianness annehmen, auch wenn Datenzugriffe vollständig bi-Endian sind, obwohl dies nicht immer der Fall ist, wie bei Intels IA-64-basierter Itanium-CPU, die beides erlaubt.

Beachten Sie auch, dass einige nominell Bi-Endian-CPUs Motherboard-Hilfe benötigen, um die Endianness vollständig zu wechseln., Zum Beispiel fungieren die 32-Bit-Desktop-orientierten PowerPC-Prozessoren im Little-Endian-Modus 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 sicherzustellen, dass die Little-Endian-Ansicht der Dinge für E/A-Geräte gilt. In Ermangelung dieser ungewöhnlichen Motherboard-Hardware muss die Gerätetreibersoftware an verschiedene Adressen schreiben, um die unvollständige Transformation rückgängig zu machen, und auch einen normalen Byte-Swap durchführen.,

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

SPARC-Prozessoren seit Ende der 1990er Jahre („SPARC v9“ – konforme Prozessoren) ermöglichen die Auswahl der Datenenden mit jedem einzelnen Befehl, der aus oder in den Speicher geladen wird.

Die ARM-Architektur unterstützt zwei Big-Endian-Modi, BE-8 und BE-32. CPUs bis ARMv5 unterstützen nur den BE-32-oder Word-Invariant-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 nicht ausgerichteter Zugriff ist nicht zulässig. ARMv6 führt den BE-8-oder Byte-Invarianten-Modus ein, bei dem der Zugriff auf ein einzelnes Byte wie im Little-Endian-Modus funktioniert, der Zugriff auf ein 16-Bit -, 32-Bit-oder (beginnend mit ARMv8) 64-Bit-Wort jedoch zu einem Byte-Swap der Daten führt. Dies vereinfacht den nicht ausgerichteten Speicherzugriff sowie den speicherzuordneten Zugriff auf andere Register als 32 Bit.,

Viele Prozessoren haben Anweisungen, 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 umgekehrt.

Aktuelle Intel x86 und x86-64 architektur CPUs haben eine MOVBE anweisung (Intel Core seit generation 4, nach Atom), die holt eine big-endian format wort aus dem speicher oder schreibt ein wort in speicher in big-endian format. Diese Prozessoren sind ansonsten gründlich Little-Endian., Sie hatten auch bereits eine Reihe von Swap-Anweisungen, um die Bytereihenfolge des Inhalts von Registern umzukehren, z. B. wenn Wörter bereits von Speicherorten abgerufen wurden, an denen sie sich in der „falschen“ Endianness befanden.

Gleitkommazahlen

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 Hardware-Architekturen wo Gleitkommazahlen in Big-Endian-Form dargestellt werden, während ganze Zahlen in Little-Endian-Form dargestellt werden., Es gibt ARM-Prozessoren, die halb Little-Endian, halb Big-Endian Gleitkomma-Darstellung für Zahlen mit doppelter Genauigkeit haben: beide 32-Bit-Wörter werden in Little-Endian wie ganzzahlige Register gespeichert, aber die wichtigste zuerst. Da es viele Gleitkommaformate ohne „Netzwerk“-Standarddarstellung für sie gab, verwendet der XDR-Standard Big-Endian IEEE 754 als Darstellung. Es mag daher seltsam erscheinen, dass der weit verbreitete IEEE 754-Gleitkommastandard keine Endianness angibt., Theoretisch bedeutet dies, dass selbst standardmäßige IEEE-Gleitkommadaten, die von einer Maschine geschrieben wurden, möglicherweise nicht von einer anderen lesbar sind. Auf modernen Standardcomputern (dh bei der Implementierung von IEEE 754) kann man jedoch in der Praxis sicher davon ausgehen, dass die Endianness für Gleitkommazahlen die gleiche ist wie für Ganzzahlen, was die Konvertierung unabhängig vom Datentyp unkompliziert macht. (Kleine eingebettete Systeme mit speziellen Gleitkommaformaten können jedoch eine andere Sache sein.,)

dataEdit variabler Länge

Die meisten bisher betrachteten Anweisungen enthalten die Größe (Länge) ihrer Operanden im Operationscode. 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 gehalten werden kann, z. B. mittels einer Wortmarke. Ein solcher Ansatz ermöglicht Operandenlängen bis zu 256 Byte oder sogar die volle Speichergröße.Die Datentypen solcher Operanden sind Zeichenfolgen oder BCD.,

OptimizationEdit

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

In konkreteren Worten 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 C++ dies nicht zulässt, ist ein solcher Typ-Punning-Code vom C11-Standard als“ implementierungsdefiniert “ zulässig und wird häufig in Code verwendet, der mit Hardware interagiert.,

Andererseits kann es in einigen Situationen nützlich sein, eine Annäherung eines Mehrbyte-oder Mehrwortwerts zu erhalten, indem nur sein wichtigster Teil anstelle der vollständigen Darstellung gelesen wird; Ein Big-Endian-Prozessor kann eine solche Annäherung unter Verwendung derselben Basisadresse lesen, die für den vollständigen 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 in der gleichen Zeit aus dem Speicher ab, in der sie ein einzelnes Byte abgerufen hätten, sodass die Komplexität der Hardware nicht von der Bytereihenfolge beeinflusst wird.

Operationen, die an der am wenigsten signifikanten Stelle beginnen.

Wie in der Schule gelernt, beginnen Addition, Subtraktion und Multiplikation an der am wenigsten signifikanten Stelle und verbreiten den Carry an die nachfolgende signifikantere Position.,Das Adressieren mehrstelliger Daten an seinem ersten (=kleinsten Adressbyte) ist das vorherrschende Adressierungsschema.Wenn dieses erste Byte die niedrigstwertige Ziffer enthält-was der Little-Endianness entspricht -, ist die Implementierung dieser Operationen geringfügig einfacher.

Operationen, die an der signifikantesten Stelle beginnen.

Vergleich und Division beginnen an der signifikantesten Stelle und geben einen möglichen Carry an die nachfolgenden weniger signifikanten Stellen weiter., 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.

Operanden unterschiedlicher Länge.

In der Programmiersprache C muss der lexikographische Vergleich von Zeichenketten durch Unterprogramme erfolgen, die häufig als Unterprogramm angeboten und implementiert werden (z. B. strcmp).

Viele Big-Endian-Prozessoren enthalten Hardware-Anweisungen zum lexikografischen Vergleich von Zeichenfolgen unterschiedlicher Länge (z. B. IBM System/360 und seine Nachfolger).,

Operationen ohne impactEdit

Der normale Datentransport durch eine Assignment-Anweisung 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 standardmäßige amerikanische Datumsformatierung von Monat/Tag / Jahr.

PDP-endianEdit

Das PDP-11 ist prinzipiell ein 16-Bit Little-Endian System., Die Anweisungen zum Konvertieren zwischen Gleitkomma-und ganzzahligen Werten im optionalen Gleitkommaprozessor des PDP-11/45, PDP-11/70 und in einigen späteren Prozessoren speicherten 32-Bit-Werte „Double precision Integer long“ mit den 16-Bit-Hälften getauscht von der erwarteten Little-Endian-Reihenfolge. Der UNIX – C-Compiler verwendete dasselbe Format für 32-Bit – Ganzzahlen. Diese Reihenfolge wird als PDP-Endian bezeichnet.

Eine Möglichkeit, diese Endianness zu interpretieren, besteht darin, dass eine 32-Bit-Ganzzahl als zwei 16-Bit-Wörter im Big-Endian gespeichert wird, die Wörter selbst jedoch Little-Endian sind (z., „jag cog sin“ would be „gaj goc nis“):

Storage of a 32-bit integer, 0x0A0B0C0D, on a PDP-11
increasing addresses →
0Bh 0Ah 0Dh 0Ch
0A0Bh 0C0Dh …,

Die 16-bit-Werte beziehen sich hier auf Ihre numerischen Werte, nicht Ihre tatsächliche layout.

Honeywell Series 16Edit

Die 16-Bit-Computer der Honeywell Series 16, einschließlich des Honeywell 316, sind das Gegenteil des PDP-11 beim Speichern von 32-Bit-Wörtern in C., It stores each 16-bit word in big-endian order, but joins them together in little-endian manner:

storage of a 32-bit integer, 0x0A0B0C0D, on a Honeywell 316
increasing addresses →
0Ch 0Dh 0Ah 0Bh
…, 0C0Dh 0A0Bh

Intel IA-32 segment descriptorsEdit

Segment descriptors of IA-32 and compatible processors keep a 32-bit base address of the segment stored in little-endian order, but in four nonconsecutive bytes, at relative positions 2, 3, 4 and 7 of the descriptor start.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.