Endianness

HistoryEdit

veel historische en bestaande processoren gebruiken een big-endian geheugenrepresentatie, uitsluitend of als een ontwerpoptie. Big-endian memory representation wordt vaak aangeduid als netwerkvolgorde, zoals gebruikt in de Internet protocol suite. Andere processortypen gebruiken little – endian memory representation; anderen gebruiken nog een ander schema genaamd “middle-endian”, “mixed-endian” of “PDP-11-endian”.

het IBM systeem / 360 gebruikt big-endian bytevolgorde, evenals zijn opvolgers System / 370, ESA / 390 en z/Architecture., De PDP-10 gebruikt ook big-endian adressering voor byte-georiënteerde instructies. De IBM-Serie/1 minicomputer gebruikt ook big-endian byteorde.

omgaan met gegevens van verschillende endianness wordt soms het NUXI-probleem genoemd. Deze terminologie verwijst naar de byte volgorde conflicten ondervonden tijdens het aanpassen van UNIX, die liep op de mixed-endian PDP-11, aan een big-endian IBM Serie/1 computer. Unix was een van de eerste systemen waarmee dezelfde code kon worden gecompileerd voor platforms met verschillende interne representaties., Een van de eerste geconverteerde programma ‘ s moest Unix printen, maar in de Serie/1 werd nUxi afgedrukt.

Het Datapoint 2200 maakt gebruik van eenvoudige bit-seriële logica met little-endian om carry propagatie te vergemakkelijken. Toen Intel de 8008 microprocessor voor Datapoint ontwikkelde, gebruikten ze little-endian voor compatibiliteit., Omdat Intel de 8008 echter niet op tijd kon leveren, gebruikte Datapoint een middelgroot integratie-equivalent, maar de weinig-endianness bleef behouden in de meeste Intel-ontwerpen, waaronder de MCS-48 en de 8086 en zijn x86 opvolgers. De Dec Alpha, Atmel AVR, VAX, de MOS Technology 6502 familie (inclusief Western Design Center 65802 en 65C816), de Zilog Z80 (inclusief Z180 en eZ80), de Altera Nios II, en vele andere processors en processor families zijn ook weinig-endiaans.

De Motorola 6800 / 6801, de 6809 en de 68000 serie processors gebruikten het big-endian formaat.,

De Intel 8051 verwacht, in tegenstelling tot andere Intel processors, 16-bit adressen voor LJMP en LCALL in big-endian formaat; echter, xcall instructies slaan het retouradres op de stack in little-endian formaat.

SPARC gebruikte big-endian tot versie 9, die bi-endian is; evenzo waren de vroege IBM POWER processors big-endian, maar de PowerPC en Power Isa afstammelingen zijn nu bi-endian. De ARM-architectuur was little-endian voor versie 3 toen het bi-endian werd.,

huidige architectuuredit

De Intel x86 en AMD64 / x86-64 serie processors gebruiken het little-endian formaat. Andere instructiesetarchitecturen die volgen op deze conventie, die alleen little-endian modus toestaan, zijn Nios II, Andes Technology NDS32 en Qualcomm Hexagon.

sommige architecturen van instructiesets staan het draaien van software van beide endianness toe op een bi-endian architectuur. Dit omvat ARM AArch64, C-Sky, Power ISA en RISC-V.,

alleen big-endian-architecturen zijn de IBM z / Architecture, Freescale ColdFire (gebaseerd op de Motorola 68000-serie), Atmel AVR32 en OpenRISC. De IBM AIX en Oracle Solaris besturingssystemen op bi-endian Power ISA en SPARC draaien in big-endian modus; sommige distributies van Linux op Power zijn verplaatst naar little-endian modus.,

Bi-endiannessEdit

sommige architecturen (waaronder ARM versies 3 en hoger, PowerPC, Alpha, SPARC V9, MIPS, PA-RISC, SuperH SH-4 en IA-64) hebben een instelling die schakelbare endianness mogelijk maakt in data fetches en stores, instructie fetches, of beide. Deze functie kan de prestaties verbeteren of de logica van netwerkapparaten en software vereenvoudigen. Het woord bi-endian, wanneer gezegd van hardware, duidt het vermogen van de machine aan om gegevens in beide endian-formaat te berekenen of door te geven.,

veel van deze architecturen kunnen via software naar standaard worden overgezet naar een specifiek endian-formaat (meestal wanneer de computer opstart); op sommige systemen wordt de standaard endianness echter geselecteerd door hardware op het moederbord en kan niet worden gewijzigd via software (bijvoorbeeld de Alpha, die alleen draait in big-endian-modus op de Cray T3E).

merk op dat de term “bi-endian” voornamelijk verwijst naar hoe een processor toegang tot gegevens behandelt., Instructietoegang (fetches van instructiewoorden) op een bepaalde processor kan nog steeds uitgaan van een vaste endianness, zelfs als data-toegang volledig bi-endiaans is, hoewel dit niet altijd het geval is, zoals op Intel ‘ s IA-64-gebaseerde Itanium CPU, die beide toestaat.

merk ook op dat sommige nominaal bi-endian CPU ‘ s hulp van het moederbord nodig hebben om volledig van endianess te wisselen., Bijvoorbeeld, de 32-bits desktop-georiënteerde PowerPC-processors in little-endian-modus fungeren als little-endian vanuit het oogpunt van de uitvoerende programma ‘ s, maar ze vereisen dat het moederbord een 64-bits swap uitvoert over alle 8 byte rijstroken om ervoor te zorgen dat de little-endian kijk op de dingen van toepassing zal zijn op I/O-apparaten. Bij afwezigheid van deze ongebruikelijke moederbordhardware moet apparaatstuurprogramma ‘ s naar verschillende adressen schrijven om de onvolledige transformatie ongedaan te maken en ook een normale byte-swap uitvoeren.,

sommige CPU ‘ s, zoals veel PowerPC-processoren die bedoeld zijn voor embedded gebruik en bijna alle SPARC-processoren, staan de keuze van endianness per pagina toe.

SPARC-processoren sinds de late jaren 1990 (“SPARC v9” – compatibele processoren) maken het mogelijk om gegevens endianness te kiezen met elke individuele instructie die laadt van of opslaat naar het geheugen.

de ARM-architectuur ondersteunt twee big-endian modi, genaamd BE-8 en BE-32. CPU ‘ s tot ARMv5 ondersteunen alleen BE-32 of Word-Invariant modus., Hier werkt elke natuurlijk uitgelijnde 32-bits toegang zoals in little-endian modus, maar toegang tot een byte of 16-bits woord wordt doorgestuurd naar het bijbehorende adres en niet-gebonden toegang is niet toegestaan. ARMv6 introduceert BE-8 of Byte-Invariant modus, waar toegang tot een enkele byte werkt als in little-endian modus, maar toegang tot een 16-bit, 32-bit of (beginnend met ARMv8) 64-bit woord resulteert in een byte swap van de gegevens. Dit vereenvoudigt unaligned geheugen toegang evenals geheugen toegewezen toegang tot registers anders dan 32 bit.,

veel processors hebben instructies om een woord in een register om te zetten naar de tegenovergestelde endianness, dat wil zeggen, ze wisselen de volgorde van de bytes in een 16-, 32 – of 64-bit woord. Alle afzonderlijke bits zijn echter niet omgekeerd.

recente Intel x86 en x86-64 architectuur CPU ‘ s hebben een MOVBE instructie (Intel Core sinds generatie 4, na Atom), die een big-endian formaat woord uit het geheugen haalt of schrijft een woord in het geheugen in big-endian formaat. Deze processors zijn verder grondig weinig-endiaans., Ze hadden ook al een reeks swap-instructies om de bytevolgorde van de inhoud van registers om te keren, zoals wanneer woorden al zijn opgehaald van geheugenlocaties waar ze zich in de ‘verkeerde’ endianness bevonden.

Floating pointEdit

hoewel de alomtegenwoordige x86-processors van vandaag little-endian-opslag gebruiken voor alle soorten gegevens (integer, floating point), zijn er een aantal hardwarearchitecturen waar floating-point-getallen in big-endian-vorm worden weergegeven terwijl gehele getallen in little-endian-vorm worden weergegeven., Er zijn ARM processors die half little-endian, half big-endian floating-point representatie hebben voor dubbele precisie getallen: beide 32-bit woorden worden opgeslagen in Little-Endian achtige integer registers, maar de belangrijkste eerst. Omdat er veel floating-point formaten zijn geweest zonder “netwerk” standaard representatie voor hen, gebruikt de XDR standaard big-endian IEEE 754 als zijn representatie. Het kan daarom vreemd lijken dat de wijdverbreide IEEE 754 floating-point standaard geen endianness specificeert., Theoretisch betekent dit dat zelfs standaard IEEE floating-point data geschreven door een machine misschien niet leesbaar zijn door een andere. Echter, op moderne standaard computers (dat wil zeggen, het implementeren van IEEE 754), kan men in de praktijk veilig aannemen dat de endianness hetzelfde is voor floating-point getallen als voor gehele getallen, waardoor de conversie eenvoudig is ongeacht het gegevenstype. (Kleine embedded systemen die gebruik maken van speciale floating-point formaten kan echter een andere zaak zijn.,)

variabele lengte dataEdit

De meeste tot nu toe beschouwde instructies bevatten de grootte (lengtes) van de operanden binnen de operatiecode. Vaak beschikbare operandlengtes zijn 1, 2, 4, 8 of 16 bytes.Maar er zijn ook architecturen waar de lengte van een operand kan worden gehouden in een afzonderlijk gebied van de instructie of met de operand zelf, bijvoorbeeld door middel van een woordmerk. Een dergelijke aanpak maakt operandlengtes tot 256 bytes of zelfs volledige geheugengrootte mogelijk.De gegevenstypen van dergelijke operanden zijn tekenreeksen of BCD.,

OptimizationEdit

het little-endian systeem heeft de eigenschap dat dezelfde waarde kan worden gelezen vanuit het geheugen op verschillende lengtes zonder gebruik te maken van verschillende adressen (zelfs wanneer uitlijningsbeperkingen worden opgelegd). Een 32-bit geheugenlocatie met inhoud 4A 00 00 00 kan bijvoorbeeld worden gelezen op hetzelfde adres als 8-bit (waarde = 4A), 16-bit (004A), 24-bit (00004A) of 32-bit (0000004A), die allemaal dezelfde numerieke waarde behouden., Hoewel deze little-endian eigenschap zelden direct wordt gebruikt door high-level programmeurs, wordt het vaak gebruikt door code optimizers evenals door assembler programmeurs.

in meer concrete termen zijn dergelijke optimalisaties het equivalent van de volgende C-code die true retourneert op de meeste little-endian-Systemen:

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");

hoewel niet toegestaan door C++, is een dergelijke type-punningcode toegestaan als “implementatie-gedefinieerd” door de C11-standaard en algemeen gebruikt in code-interactie met hardware.,

aan de andere kant, in sommige situaties kan het nuttig zijn om een benadering van een multi-byte of multi-woord waarde te verkrijgen door alleen het belangrijkste deel te lezen in plaats van de volledige representatie; een big-endian processor kan een dergelijke benadering lezen met behulp van hetzelfde basis-adres dat zou worden gebruikt voor de volledige waarde.

optimalisaties van dit soort zijn niet overdraagbaar tussen systemen van verschillende aard.

Calculation orderEdit

sommige bewerkingen in positionele getalsystemen hebben een natuurlijke of voorkeursvolgorde waarin de elementaire stappen moeten worden uitgevoerd.,Deze volgorde kan van invloed zijn op hun prestaties op kleinschalige byte-adresseerbare processors en microcontrollers.

echter, high-performance processors halen meestal typische multi-byte operanden uit het geheugen in dezelfde tijd dat ze een enkele byte zouden hebben opgehaald, dus de complexiteit van de hardware wordt niet beïnvloed door de byte volgorde.

operaties die beginnen met de minst significante digitEdit

zoals geleerd op school, optellen, aftrekken en vermenigvuldigen beginnen met de minst significante cijferpositie en propageren de carry naar de daaropvolgende meer significante positie.,Het adresseren van meercijferige gegevens op de eerste (= kleinste adresbyte) byte is het overheersende adresseringsschema.Wanneer deze eerste byte het minst significante cijfer bevat-wat overeenkomt met weinig-endianness, dan is de uitvoering van deze operaties marginaal eenvoudiger.

bewerkingen die beginnen bij de meest significante digitEdit

vergelijking en deling beginnen bij de meest significante digit en propageren een mogelijke carry naar de volgende minder significante cijfers., Voor numerieke waarden met een vaste lengte (gewoonlijk 1,2,4,8,16) is de uitvoering van deze bewerkingen marginaal eenvoudiger op big-endiaanse machines.

operanden van verschillende lengtedit

in de programmeertaal C de lexicografische vergelijking van tekenreeksen moet worden gedaan door subroutines, die vaak worden aangeboden en geïmplementeerd als een subroutine (bijv. strcmp).

veel big-endian processors bevatten hardwareinstructies voor het lexicografisch vergelijken van tekenreeksen van verschillende lengte (bijvoorbeeld het IBM-systeem / 360 en zijn opvolgers).,

bewerkingen zonder effectedit

het normale datatransport door een assignment statement is in principe onafhankelijk van de beschikbaarheid van de processor.

Middle-endianEdit

talrijke andere ordeningen, algemeen middle-endian of mixed-endian genoemd, zijn mogelijk. Een voorbeeld buiten de informatica is de standaard Amerikaanse datumopmaak van Maand / Dag / jaar.

PDP-endianEdit

de PDP-11 is in principe een 16-bit little-endian systeem., De instructies om te converteren tussen floating-point en integer waarden in de optionele floating-point processor van de PDP-11/45, PDP-11/70, en in sommige latere processors, opgeslagen 32-bit “double precision integer long” waarden met de 16-bit helften verwisseld van de verwachte little-endian orde. De UNIX C compiler gebruikte hetzelfde formaat voor 32-bits lange gehele getallen. Deze volgorde staat bekend als PDP-endian.

een manier om deze endianess te interpreteren is dat het een 32-bit integer opslaat als twee 16 – bit woorden in big-endian, maar de woorden zelf zijn little-endian (bijv., “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 …,

De 16-bit waarden verwijzen hier naar hun numerieke waarden, niet naar hun werkelijke opmaak.

Honeywell Series 16Edit

De Honeywell Series 16 16-bit computers, inclusief de Honeywell 316, zijn het tegenovergestelde van de PDP-11 in het opslaan van 32-bit woorden 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.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *