Endianita

HistoryEdit

Mnoho historických i současných procesorů používá big-endianskou reprezentaci paměti, ať už výhradně, nebo jako volitelný návrh. Big-endiánská reprezentace paměti se běžně označuje jako síťové pořadí, jak se používá v sadě internetových protokolů. Jiné typy procesorů používají little-endian reprezentaci paměti; další používají ještě jiné schéma nazývané „middle-endian“, „mixed-endian“ nebo „PDP-11-endian“.

IBM System/360 používá big-endian pořadí bajtů, stejně jako jeho nástupci System/370, ESA/390 a z/Architektura. PDP-10 rovněž používá big-endianské adresování pro instrukce orientované na bajty. Minipočítače IBM Series/1 rovněž používají big-endianské pořadí bajtů.

Práce s daty různé endianity se někdy označuje jako problém NUXI. Tato terminologie odkazuje na konflikty pořadí bajtů, které se vyskytly při adaptaci systému UNIX, který běžel na počítači PDP-11 se smíšeným endianem, na počítač IBM Series/1 s bigendianem. Unix byl jedním z prvních systémů, který umožňoval kompilaci stejného kódu pro platformy s různou vnitřní reprezentací. Jeden z prvních konvertovaných programů měl vypisovat Unix, ale na Series/1 místo toho vypisoval nUxi.

Datapoint 2200 používá jednoduchou bitově-sériovou logiku s little-endian pro usnadnění šíření přenosů. Když Intel vyvíjel mikroprocesor 8008 pro Datapoint, použil kvůli kompatibilitě little-endian. Protože však Intel nebyl schopen dodat 8008 včas, Datapoint použil ekvivalent střední integrace, ale little-endian byl zachován ve většině návrhů Intelu, včetně MCS-48 a 8086 a jeho nástupců x86. DEC Alpha, Atmel AVR, VAX, rodina MOS Technology 6502 (včetně Western Design Center 65802 a 65C816), Zilog Z80 (včetně Z180 a eZ80), Altera Nios II a mnoho dalších procesorů a rodin procesorů jsou také little-endian.

Procesory Motorola 6800 / 6801, 6809 a řada 68000 používaly formát big-endian.

Procesor Intel 8051 na rozdíl od ostatních procesorů Intel očekává 16bitové adresy pro LJMP a LCALL ve formátu big-endian; instrukce xCALL však ukládají návratovou adresu na zásobník ve formátu little-endian.

Procesor SPARC historicky používal big-endian až do verze 9, která je bi-endian; podobně rané procesory IBM POWER byly big-endian, ale potomci PowerPC a Power ISA jsou nyní bi-endian. Architektura ARM byla little-endian před verzí 3, kdy se stala bi-endian.

Současné architekturyEdit

Procesory Intel řady x86 a AMD64 / x86-64 používají formát little-endian. Mezi další architektury s instrukční sadou, které dodržují tuto konvenci a umožňují pouze režim little-endian, patří Nios II, Andes Technology NDS32 a Qualcomm Hexagon.

Některé architektury s instrukční sadou umožňují provozovat software obou endianit na architektuře bi-endian. Patří sem ARM AArch64, C-Sky, Power ISA a RISC-V.

Mezi výhradně bigendiánské architektury patří IBM z/Architektura, Freescale ColdFire (která je založena na řadě Motorola 68000), Atmel AVR32 a OpenRISC. Operační systémy IBM AIX a Oracle Solaris na bi-endianových architekturách Power ISA a SPARC běží v režimu big-endian; některé distribuce Linuxu na Power přešly na režim little-endian.

Bi-endiannessEdit

Některé architektury (včetně ARM verze 3 a vyšší, PowerPC, Alpha, SPARC V9, MIPS, PA-RISC, SuperH SH-4 a IA-64) mají nastavení, které umožňuje přepínat endianitu při načítání a ukládání dat, načítání instrukcí nebo obojí. Tato funkce může zlepšit výkon nebo zjednodušit logiku síťových zařízení a softwaru. Slovo bi-endian, když se řekne o hardwaru, označuje schopnost stroje počítat nebo předávat data v obou endianových formátech.

Mnoho z těchto architektur lze softwarově přepnout na výchozí konkrétní endianový formát (obvykle se to provádí při spuštění počítače); u některých systémů je však výchozí endianita zvolena hardwarem na základní desce a nelze ji softwarově změnit (např.Alpha, která na Cray T3E běží pouze v režimu big-endian).

Všimněte si, že termín bi-endian se vztahuje především na to, jak procesor zachází s přístupy k datům. Přístupy k instrukcím (načítání instrukčních slov) na daném procesoru mohou stále předpokládat pevnou endianitu, i když jsou přístupy k datům plně bi-endian, i když tomu tak není vždy, například u procesoru Itanium založeného na architektuře IA-64 společnosti Intel, který umožňuje obojí.

Všimněte si také, že některé nominálně bi-endian procesory vyžadují pomoc základní desky, aby bylo možné plně přepnout endianitu. Například 32bitové desktopově orientované procesory PowerPC se v režimu little-endian chovají z pohledu prováděných programů jako little-endian, ale vyžadují, aby základní deska provedla 64bitový swap ve všech 8 bajtových linkách, aby bylo zajištěno, že se na I/O zařízeních uplatní little-endian pohled na věc. Při absenci tohoto neobvyklého hardwaru základní desky musí software ovladače zařízení zapisovat na jiné adresy, aby zrušil neúplnou transformaci, a také musí provést normální výměnu bajtů.

Některé procesory, například mnoho procesorů PowerPC určených pro vestavné použití a téměř všechny procesory SPARC, umožňují volbu endianity na stránku.

Procesory SPARC od konce devadesátých let (procesory kompatibilní s SPARC v9) umožňují volbu endianity dat při každé jednotlivé instrukci, která načítá data z paměti nebo je do ní ukládá.

Architektura ARM podporuje dva režimy big-endian, nazývané BE-8 a BE-32.

Procesory ARM podporují dva režimy big-endian. Procesory až do verze ARMv5 podporují pouze režim BE-32 neboli word-invariant. Zde jakýkoli přirozeně zarovnaný 32bitový přístup funguje stejně jako v režimu little-endian, ale přístup k bajtu nebo 16bitovému slovu je přesměrován na odpovídající adresu a nezarovnaný přístup není povolen. ARMv6 zavádí režim BE-8 neboli byte-invariant, kde přístup k jednomu bajtu funguje jako v režimu little-endian, ale přístup k 16bitovému, 32bitovému nebo (počínaje ARMv8) 64bitovému slovu vede k výměně bajtů dat. To zjednodušuje přístup do nezarovnané paměti i přístup do paměťových map k jiným než 32bitovým registrům.

Mnoho procesorů má instrukce pro převod slova v registru na opačnou endianitu, tj. prohodí pořadí bajtů v 16-, 32- nebo 64bitovém slově. Všechny jednotlivé bity se však nepřehodí.

Současné procesory architektury Intel x86 a x86-64 mají instrukci MOVBE (Intel Core od 4. generace, po Atomu), která načte z paměti slovo ve formátu big-endian nebo zapíše do paměti slovo ve formátu big-endian. Tyto procesory jsou jinak důsledně little-endian. Také již měly řadu instrukcí swap, které umožňovaly obrátit pořadí bajtů v obsahu registrů, například když již byla slova načtena z míst v paměti, kde byla ve „špatném“ endianismu.

Floating pointEdit

Ačkoli dnešní všudypřítomné procesory x86 používají pro všechny typy dat (celá čísla, čísla s pohyblivou řádovou čárkou) little-endian paměť, existuje řada hardwarových architektur, kde jsou čísla s pohyblivou řádovou čárkou reprezentována ve tvaru big-endian, zatímco celá čísla jsou reprezentována ve tvaru little-endian. Existují procesory ARM, které mají pro čísla s dvojnásobnou přesností napůl little-endian a napůl big-endian reprezentaci v plovoucí řádové čárce: obě 32bitová slova jsou uložena v little-endian jako celočíselné registry, ale nejdříve to nejvýznamnější. Protože existovalo mnoho formátů s plovoucí desetinnou čárkou, pro které neexistovala žádná „síťová“ standardní reprezentace, používá standard XDR jako reprezentaci big-endian IEEE 754. Může se proto zdát zvláštní, že rozšířený standard IEEE 754 s plovoucí desetinnou čárkou nespecifikuje endianitu. Teoreticky to znamená, že i standardní data IEEE s plovoucí desetinnou čárkou zapsaná jedním strojem nemusí být čitelná jiným strojem. Na moderních standardních počítačích (tj. implementujících IEEE 754) však lze v praxi bezpečně předpokládat, že endianita je stejná pro čísla s pohyblivou řádovou čárkou jako pro celá čísla, takže převod je jednoduchý bez ohledu na typ dat. (Malé vestavěné systémy používající speciální formáty s plovoucí desetinnou čárkou však mohou být jinou záležitostí.)

Data proměnné délkyUpravit

Většina dosud uvažovaných instrukcí obsahuje velikost (délky) svých operandů v kódu operace. Často jsou k dispozici délky operandů 1, 2, 4, 8 nebo 16 bajtů, ale existují i architektury, kde může být délka operandu vedena v samostatném poli instrukce nebo se samotným operandem, např. pomocí slovní značky. Takový přístup umožňuje délku operandu až 256 bajtů nebo dokonce celou velikost paměti. datovými typy takových operandů jsou řetězce znaků nebo BCD.

Stroje schopné manipulovat s takovými daty pomocí jedné instrukce (např. porovnání, sčítání) jsou např. IBM 1401, 1410, 1620, System/3×0, ESA/390 a z/Architektura, všechny typu big-endian.

OptimizationEdit

Systém little-endian má tu vlastnost, že stejnou hodnotu lze z paměti číst v různých délkách bez použití různých adres (i při omezení zarovnání). Například 32bitové místo v paměti s obsahem 4A 00 00 00 lze číst na stejné adrese jako 8bitové (hodnota = 4A), 16bitové (004A), 24bitové (00004A) nebo 32bitové (0000004A), přičemž všechny zachovávají stejnou číselnou hodnotu. Ačkoli tuto vlastnost little-endian programátoři vysoké úrovně přímo používají jen zřídka, často ji využívají optimalizátory kódu i programátoři v assembleru.

Konkrétněji řečeno, takové optimalizace jsou ekvivalentem následujícího kódu jazyka C, který na většině systémů little-endian vrací hodnotu true:

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

Ačkoli to jazyk C++ nedovoluje, standard C11 takový kód s typovou hříčkou povoluje jako „implementačně definovaný“ a běžně se používá v kódu spolupracujícím s hardwarem.

Na druhou stranu může být v některých situacích užitečné získat aproximaci vícebajtové nebo víceslovné hodnoty čtením pouze její nejvýznamnější části namísto úplné reprezentace; big-endiánský procesor může takovou aproximaci číst pomocí stejné základní adresy, která by byla použita pro úplnou hodnotu.

Optimalizace tohoto druhu nejsou přenositelné mezi systémy s různou endianitou.

Pořadí výpočtuUpravit

Některé operace v pozičních číselných systémech mají přirozené nebo preferované pořadí, v němž se mají provádět základní kroky.Toto pořadí může ovlivnit jejich výkonnost na malých procesorech a mikrokontrolérech s bajtovou adresací.

Vysoce výkonné procesory však obvykle načítají typické vícebajtové operandy z paměti za stejnou dobu, za jakou by načetly jeden bajt, takže složitost hardwaru není pořadím bajtů ovlivněna.

Operace začínající na nejméně významné pozici čísliceUpravit

Sčítání, odčítání a násobení začínají na nejméně významné pozici číslice a přenos se propaguje na následující významnější pozici.Adresování vícemístných dat na jejich prvním (= nejmenším adresním) bajtu je převládajícím adresním schématem. pokud tento první bajt obsahuje nejméně významnou číslici – což odpovídá málo významnému číslu, pak je implementace těchto operací nepatrně jednodušší.

Operace začínající na nejvýznamnější čísliciEdit

Srovnávání a dělení začínají na nejvýznamnější číslici a propagují případný přenos na následující méně významné číslice. Pro číselné hodnoty pevné délky (typicky délky 1,2,4,8,16) je implementace těchto operací na bigendiánských strojích nepatrně jednodušší.

Operandy různé délkyEdit

Mnoho bigendiánských procesorů obsahuje hardwarové instrukce pro lexikografické porovnávání různě dlouhých řetězců znaků (např. IBM System/360 a jeho následovníci).

Operace bez dopaduUpravit

Běžný přenos dat příkazem přiřazení je v zásadě nezávislý na endianitě procesoru.

Middle-endianUpravit

Možné je mnoho dalších uspořádání, obecně nazývaných middle-endian nebo mixed-endian. Jedním z takových příkladů mimo informatiku je standardní americké formátování data měsíc/den/rok.

PDP-endianEdit

PDP-11 je v principu 16bitový little-endian systém. Instrukce pro převod mezi hodnotami s plovoucí desetinnou čárkou a celými čísly ve volitelném procesoru s plovoucí desetinnou čárkou PDP-11/45, PDP-11/70 a v některých pozdějších procesorech ukládaly 32bitové hodnoty „double precision integer long“ s přehozenými 16bitovými polovinami oproti očekávanému little-endian pořadí. Překladač UNIX C používal stejný formát pro 32bitová dlouhá celá čísla. Toto uspořádání je známé jako PDP-endian.

Tuto endianitu lze interpretovat tak, že ukládá 32bitové celé číslo jako dvě 16bitová slova v big-endian, ale samotná slova jsou little-endian (E.Např. „jag cog sin“ by bylo „gaj goc nis“):

Uložení 32bitového celého čísla, 0x0A0B0C0D, na PDP-11
rostoucí adresy →
…. 0Bh 0Ah 0Dh 0Ch
0A0Bh 0C0Dh ….

Zde uvedené 16bitové hodnoty odkazují na jejich číselné hodnoty, nikoli na jejich skutečné rozložení.

Honeywell Series 16Edit

Šestnáctibitové počítače Honeywell Series 16, včetně Honeywell 316, jsou opakem PDP-11 v ukládání 32bitových slov v C. Každé 16bitové slovo ukládá v big-endian pořadí, ale spojuje je dohromady v little-endian:

ukládání 32bitového celého čísla, 0x0A0B0C0D, na počítači Honeywell 316
rostoucí adresy →
…. 0Ch 0Dh 0Ah 0Bh
….. 0C0Dh 0A0Bh

Deskriptory segmentů Intel IA-32Upravit

Deskriptory segmentů procesorů IA-32 a kompatibilních procesorů uchovávají 32bitovou základní adresu segmentu uloženou v malém endiánském pořadí, ale ve čtyřech nepokračujících bajtech na relativních pozicích 2, 3, 4 a 7 začátku deskriptoru.

.