Endianness
- HistoryEdit
- Jelenlegi architektúrákSzerkesztés
- Bi-endiannessEdit
- LebegőpontSzerkesztés
- Változó hosszúságú adatokSzerkesztés
- OptimizationEdit
- Számítási sorrendSzerkesztés
- A legkisebb értékű számjegyen kezdődő műveletekSzerkesztés
- A legjelentősebb számjegyről induló műveletekSzerkesztés
- Változó hosszúságú operandusokSzerkesztés
- Hatás nélküli műveletekSzerkesztés
- Közép-endiánSzerkesztés
- PDP-endianEdit
- Honeywell Series 16Szerkesztés
- Intel IA-32 szegmensleírókSzerkesztés
HistoryEdit
Sok történelmi és létező processzor használ big-endian memóriareprezentációt, akár kizárólag, akár tervezési lehetőségként. A big-endian memóriareprezentációt általában hálózati sorrendnek nevezik, ahogyan azt az internetes protokollcsomagban használják. Más processzortípusok little-endian memóriareprezentációt használnak; mások egy másik sémát, az úgynevezett “middle-endian”, “mixed-endian” vagy “PDP-11-endian”.
Az IBM System/360 big-endian bájtsorrendet használ, akárcsak utódai, a System/370, ESA/390 és z/Architecture. A PDP-10 szintén big-endian címzést használ a bájtorientált utasításokhoz. Az IBM Series/1 miniszámítógép szintén big-endian bájtsorrendet használ.
A különböző endiánssal rendelkező adatok kezelését néha NUXI-problémának nevezik. Ez a terminológia azokra a bájtsorrend-konfliktusokra utal, amelyekkel a vegyesen endián PDP-11-en futó UNIX-nek a big-endián IBM Series/1 számítógépre való adaptálása során találkoztunk. A Unix volt az egyik első olyan rendszer, amely lehetővé tette, hogy ugyanazt a kódot különböző belső reprezentációjú platformokra fordítsák. Az egyik első konvertált programnak Unix
-t kellett volna kiírnia, de a Series/1-en ehelyett nUxi
-t írt ki.
A Datapoint 2200 egyszerű bit-soros logikát használ kis-endiánnal, hogy megkönnyítse az átvitel terjedését. Amikor az Intel kifejlesztette a 8008-as mikroprocesszort a Datapoint számára, a kompatibilitás érdekében little-endian-t használtak. Mivel azonban az Intel nem tudta időben leszállítani a 8008-at, a Datapoint egy közepes integrálhatóságú megfelelőt használt, de a little-endiant megtartották a legtöbb Intel-tervezetben, beleértve az MCS-48-at és a 8086-ot és annak x86-os utódait. A DEC Alpha, az Atmel AVR, a VAX, a MOS Technology 6502 család (köztük a Western Design Center 65802 és 65C816), a Zilog Z80 (köztük a Z180 és az eZ80), az Altera Nios II és sok más processzor és processzorcsalád szintén little-endian formátumú.
A Motorola 6800 / 6801, a 6809 és a 68000 sorozatú processzorok a big-endian formátumot használták.
Az Intel 8051, más Intel processzorokkal ellentétben, 16 bites címeket vár el az LJMP és LCALL esetében big-endian formátumban; az xCALL utasítások azonban little-endian formátumban tárolják a visszatérési címet a veremre.
A SPARC történelmileg big-endian formátumot használt a 9-es verzióig, amely bi-endian; hasonlóan a korai IBM POWER processzorok big-endian voltak, de a PowerPC és a Power ISA leszármazottak már bi-endian. Az ARM architektúra little-endian volt a 3. verzió előtt, amikor is bi-endian lett.
Jelenlegi architektúrákSzerkesztés
Az Intel x86 és az AMD64 / x86-64 sorozatú processzorok a little-endian formátumot használják. Más utasításkészlet-architektúrák, amelyek ezt a konvenciót követik, és csak little-endian módot engedélyeznek, közéjük tartozik a Nios II, az Andes Technology NDS32 és a Qualcomm Hexagon.
Egyes utasításkészlet-architektúrák lehetővé teszik bármelyik endianitású szoftver futtatását bi-endian architektúrán. Ide tartozik az ARM AArch64, a C-Sky, a Power ISA és a RISC-V.
A kizárólag big-endian architektúrák közé tartozik az IBM z/Architektúra, a Freescale ColdFire (amely a Motorola 68000-es sorozatán alapul), az Atmel AVR32 és az OpenRISC. Az IBM AIX és az Oracle Solaris operációs rendszerek a bi-endian Power ISA és SPARC rendszereken big-endian módban futnak; a Linux egyes disztribúciói a Power-en áttértek a little-endian módra.
Bi-endiannessEdit
Egyes architektúrák (beleértve az ARM 3-as és magasabb verzióit, a PowerPC-t, az Alfát, a SPARC V9-et, a MIPS-t, a PA-RISC-et, a SuperH SH-4-et és az IA-64-et) rendelkeznek olyan beállítással, amely lehetővé teszi a kapcsolható endiánságot az adatbehívások és -tárolások, az utasításbehívások vagy mindkettő esetében. Ez a funkció javíthatja a teljesítményt vagy egyszerűsítheti a hálózati eszközök és szoftverek logikáját. A bi-endian szó, amikor hardverről beszélünk, a gép azon képességét jelöli, hogy mindkét endian formátumban tud számolni vagy adatokat továbbítani.
Ezek közül az architektúrák közül sok szoftverrel átállítható, hogy alapértelmezetten egy adott endian formátumot használjon (általában a számítógép indításakor); néhány rendszerben azonban az alapértelmezett endianitást az alaplapon lévő hardver választja ki, és szoftveresen nem változtatható meg (pl.pl. az Alpha, amely a Cray T3E-n csak big-endian módban fut).
Megjegyzendő, hogy a bi-endian kifejezés elsősorban arra utal, hogy a processzor hogyan kezeli az adathozzáféréseket. Az utasításhozzáférések (az utasításszavak lehívása) egy adott processzoron még akkor is fix endiánssá válhatnak, ha az adathozzáférések teljesen bi-endikusak, bár ez nem mindig van így, például az Intel IA-64-alapú Itanium CPU-nál, amely mindkettőt lehetővé teszi.
Megjegyzendő az is, hogy néhány névlegesen bi-endikus CPU-nál az endiánsság teljes átváltásához alaplapi segítségre van szükség. Például a 32 bites, desktop-orientált PowerPC processzorok little-endian módban a végrehajtó programok szempontjából little-endian módon viselkednek, de az alaplapnak 64 bites swapot kell végrehajtania mind a 8 bájtsávon, hogy a dolgok little-endian nézete érvényesüljön az I/O eszközökre. E szokatlan alaplapi hardver hiányában az eszközmeghajtó-szoftvereknek más címekre kell írniuk, hogy a nem teljes átalakítást visszacsinálják, és egy normál bájtswapot is végre kell hajtaniuk.
Egyes CPU-k, például számos beágyazott használatra szánt PowerPC processzor és szinte az összes SPARC processzor lehetővé teszi az endiánság oldalankénti megválasztását.
A SPARC processzorok az 1990-es évek vége óta (SPARC v9 kompatibilis processzorok) lehetővé teszik az adatok endiánssága kiválasztását minden egyes utasítással, amely a memóriából tölt vagy a memóriába tárol.
Az ARM architektúra két big-endian módot támogat, amelyeket BE-8 és BE-32-nek neveznek. A CPU-k az ARMv5-ig csak a BE-32 vagy a szóinvariáns módot támogatják. Itt minden természetesen igazított 32 bites hozzáférés úgy működik, mint a little-endian módban, de a bájt vagy 16 bites szóhoz való hozzáférés átirányításra kerül a megfelelő címre, és az igazítás nélküli hozzáférés nem megengedett. Az ARMv6 bevezeti a BE-8 vagy bájtinvariáns módot, ahol az egyetlen bájthoz való hozzáférés úgy működik, mint a little-endian módban, de a 16 bites, 32 bites vagy (az ARMv8-tól kezdve) 64 bites szóhoz való hozzáférés az adatok bájtcseréjét eredményezi. Ez leegyszerűsíti az előjel nélküli memóriaelérést, valamint a 32 biten kívüli regiszterek memóriaképes elérését.
Néhány processzor rendelkezik olyan utasítással, amely egy regiszterben lévő szót az ellenkező endiánssá alakít, azaz felcseréli a 16, 32 vagy 64 bites szó bájtjainak sorrendjét. Az egyes bitek felcserélése azonban nem történik meg.
A legújabb Intel x86 és x86-64 architektúrájú CPU-k rendelkeznek MOVBE utasítással (Intel Core a 4. generáció óta, az Atom után), amely egy big-endian formátumú szót hív ki a memóriából, vagy egy szót ír be a memóriába big-endian formátumban. Ezek a processzorok egyébként alapvetően little-endian formátumúak. Ezek már rendelkeztek egy sor swap utasítással is, amelyekkel megfordítható a regiszterek tartalmának bájtsorrendje, például amikor a szavakat már olyan memóriahelyekről hívták be, ahol azok “rossz” endiánban voltak.
LebegőpontSzerkesztés
Bár a manapság mindenütt elterjedt x86-os processzorok minden adattípus (egész szám, lebegőpont) számára little-endian tárolást használnak, számos olyan hardverarchitektúra létezik, ahol a lebegőpontos számokat big-endian, míg az egész számokat little-endian formában ábrázolják. Vannak ARM processzorok, amelyek félig little-endian, félig big-endian lebegőpontos reprezentációval rendelkeznek a dupla pontosságú számok esetében: mindkét 32 bites szó az integer regiszterekhez hasonlóan little-endianban tárolódik, de a legjelentősebbet előbb. Mivel számos olyan lebegőpontos formátum létezett, amelyeknek nem volt “hálózati” szabványos reprezentációja, az XDR szabvány a big-endian IEEE 754-es szabványt használja reprezentációként. Ezért furcsának tűnhet, hogy a széles körben elterjedt IEEE 754-es lebegőpontos szabvány nem határozza meg az endiánságot. Elméletileg ez azt jelenti, hogy még az egyik gép által írt szabványos IEEE lebegőpontos adatok sem biztos, hogy egy másik gép által olvashatók. A modern szabványos (azaz az IEEE 754-et megvalósító) számítógépeken azonban a gyakorlatban nyugodtan feltételezhetjük, hogy a lebegőpontos számok esetében az endiség ugyanaz, mint az egész számok esetében, így a konverzió az adattípustól függetlenül egyszerű. (A speciális lebegőpontos formátumokat használó kis beágyazott rendszerek azonban más kérdés lehet.)
Változó hosszúságú adatokSzerkesztés
A legtöbb eddig vizsgált utasítás tartalmazza operandusainak méretét (hosszát) a műveleti kódon belül. Gyakran elérhető operandushossz 1, 2, 4, 8 vagy 16 bájt, de vannak olyan architektúrák is, ahol az operandus hosszát az utasítás külön mezőjében vagy magával az operandusszal együtt, pl. szójelzéssel tartják. Az ilyen megközelítés lehetővé teszi, hogy az operandus hossza elérje a 256 bájtot vagy akár a teljes memóriaméretet.Az ilyen operandusok adattípusai karakterláncok vagy BCD.
Az ilyen adatokat egy utasítással (pl. compare, add) manipulálni képes gépeket pl. IBM 1401, 1410, 1620, System/3×0, ESA/390 és z/Architecture, mindegyik big-endian típusú.
OptimizationEdit
A little-endian rendszernek az a tulajdonsága, hogy ugyanazt az értéket különböző hosszúságban lehet kiolvasni a memóriából anélkül, hogy különböző címeket kellene használni (még igazítási korlátozások esetén is). Például egy 32 bites, 4A 00 00 00 00 00
tartalmú 32 bites memóriahely ugyanarról a címről olvasható 8 bites (érték = 4A), 16 bites (004A), 24 bites (00004A) vagy 32 bites (0000004A) címről, amelyek mindegyike megtartja ugyanazt a számértéket. Bár ezt a little-endian tulajdonságot a magas szintű programozók ritkán használják közvetlenül, gyakran alkalmazzák a kódoptimalizálók, valamint az assembly nyelvi programozók.
Konkrétan az ilyen optimalizálás a következő C kódnak felel meg, amely a legtöbb little-endian rendszerben igaz értéket ad vissza:
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");
Míg a C++ nem engedélyezi, az ilyen típuspárosító kódot a C11 szabvány “implementáció által meghatározott” kódként engedélyezi, és gyakran használják a hardverrel kölcsönhatásban lévő kódokban.
Másrészt, bizonyos helyzetekben hasznos lehet egy több bájtos vagy több szóból álló érték közelítését úgy megkapni, hogy a teljes reprezentáció helyett csak a legjelentősebb részét olvassuk; egy big-endian processzor az ilyen közelítést ugyanazzal az alapcímmel olvashatja, mint amit a teljes értékhez használnánk.
Az ilyen típusú közelítések nem hordozhatók különböző endianitású rendszerek között.
Számítási sorrendSzerkesztés
A pozicionális számrendszerekben egyes műveleteknek van egy természetes vagy preferált sorrendje, amelyben az elemi lépéseket végre kell hajtani.Ez a sorrend befolyásolhatja a teljesítményüket a kis bájtcímezhető processzorokon és mikrokontrollereken.
A nagy teljesítményű processzorok azonban általában ugyanannyi idő alatt hívják le a memóriából a tipikus több bájtos operandusokat, mintha egyetlen bájtot hívnának le, így a hardver bonyolultságát nem befolyásolja a bájtsorrend.
A legkisebb értékű számjegyen kezdődő műveletekSzerkesztés
Az összeadás, kivonás és szorzás a legkisebb értékű számjegy pozíciójából indul, és az átvitel a következő, nagyobb értékű pozícióba terjed.A többjegyű adat címzése az első (= legkisebb címzésű) bájtjánál az uralkodó címzési séma.Ha ez az első bájt tartalmazza a legkevésbé szignifikáns számjegyet – ami a little-endiannessnek felel meg -, akkor ezeknek a műveleteknek a végrehajtása minimálisan egyszerűbb.
A legjelentősebb számjegyről induló műveletekSzerkesztés
Az összehasonlítás és az osztás a legjelentősebb számjegyről indul, és az esetleges hordozást a következő, kevésbé jelentős számjegyekre propagálja. Fix hosszúságú számértékek (jellemzően 1,2,4,8,16 hosszúságúak) esetén ezeknek a műveleteknek a megvalósítása big-endian gépeken kis mértékben egyszerűbb.
Változó hosszúságú operandusokSzerkesztés
Néhány big-endian processzor tartalmaz hardveres utasításokat változó hosszúságú karakterláncok lexikografikus összehasonlítására (pl. az IBM System/360 és utódai).
Hatás nélküli műveletekSzerkesztés
A hozzárendelési utasítás normál adattovábbítása elvileg független a processzor endiánsságától.
Közép-endiánSzerkesztés
Számtalan más, általánosan közép-endiánnak vagy vegyes-endiánnak nevezett sorrend lehetséges. Ilyen példa az informatikán kívül a hónap/nap/év szabványos amerikai dátumformázás.
PDP-endianEdit
A PDP-11 elvileg 16 bites little-endian rendszer. A PDP-11/45, PDP-11/70 és néhány későbbi processzor opcionális lebegőpontos processzorában a lebegőpontos és egész szám értékek közötti konverzióra szolgáló utasítások 32 bites “double precision integer long” értékeket tároltak, a 16 bites feleket az elvárt little-endian sorrendtől felcserélve. A UNIX C fordítója ugyanezt a formátumot használta a 32 bites hosszú egész számokhoz. Ezt a sorrendezést PDP-endian néven ismerjük.
Egy módja ennek az endianitásnak az, hogy a 32 bites egész számot két 16 bites szóként tárolja big-endian, de maguk a szavak little-endian (E.pl. “jag cog sin” lenne “gaj goc nis”):
növekvő címeken → | |||||
0Bh | 0Ah | 0Dh | 0Ch | ||
0A0Bh | 0C0Dh |
A 16 bites értékek itt a számértékükre vonatkoznak, nem pedig a tényleges elrendezésükre.
Honeywell Series 16Szerkesztés
A Honeywell Series 16 16 bites számítógépei, beleértve a Honeywell 316-ot is, a PDP-11 ellentéte a 32 bites szavak C-ben történő tárolása. Az egyes 16 bites szavakat big-endian sorrendben tárolja, de little-endian módon egyesíti őket:
növekvő címeken → | |||||
0Ch | 0Dh | 0Ah | 0Bh | ||
0C0Dh | 0A0Bh |
Intel IA-32 szegmensleírókSzerkesztés
Az IA-32 és kompatibilis processzorok szegmensleírói a szegmens 32 bites alapcímét little-endian sorrendben, de négy nem egymást követő bájton, a leíró kezdetének relatív 2, 3, 4 és 7 pozíciójában tárolják.