Endianness
- HistoryEdit
- Nykyiset arkkitehtuuritEdit
- Bi-endiannessEdit
- Floating pointEdit
- Muuttuvan pituiset tiedotEdit
- OptimizationEdit
- LaskentajärjestysMuokkaa
- Vähiten merkitsevästä numerosta alkavat operaatiotEdit
- Operaatioita, jotka alkavat merkitsevimmästä numerostaEdit
- Operandit, joiden pituus vaihteleeEdit
- Operaatioita, joilla ei ole vaikutustaEdit
- Keski-endiaaninenEdit
- PDP-endianEdit
- Honeywell Series 16Edit
- Intel IA-32:n segmenttikuvaajatEdit
HistoryEdit
Monissa historiallisissa ja nykyisissä prosessoreissa käytetään big-endian-muistiesitystä, joko yksinomaan tai suunnitteluvaihtoehtona. Big-endian-muistiesitystä kutsutaan yleisesti verkkojärjestykseksi, jota käytetään Internet-protokollapaketissa. Toiset prosessorityypit käyttävät little-endian-muistiedostoa; toiset taas käyttävät jotain muuta järjestelmää, jota kutsutaan ”middle-endian”-, ”mixed-endian”- tai ”PDP-11-endian”-muistiedostoksi.
IBM:n System/360 käyttää big-endian-muotoista tavujärjestystä, samoin kuin sen seuraajat System/370, ESA/390 ja z/Architecture. Myös PDP-10 käyttää big-endian-osoitteistusta tavuorientoituneissa ohjeissa. IBM:n Series/1-minitietokoneessa käytetään myös big-endian tavujärjestystä.
Erilaisen endiaanisuuden omaavien tietojen käsittelyä kutsutaan joskus NUXI-ongelmaksi. Tämä termi viittaa tavujärjestysristiriitoihin, joita ilmeni sovitettaessa UNIXia, joka toimi seka-endiaanisella PDP-11:llä, big-endiaaniselle IBM Series/1 -tietokoneelle. Unix oli yksi ensimmäisistä järjestelmistä, jotka mahdollistivat saman koodin kääntämisen alustoille, joilla oli erilaiset sisäiset esitystavat. Yhden ensimmäisistä muunnetuista ohjelmista piti tulostaa Unix
, mutta Series/1:llä se tulosti sen sijaan nUxi
.
Datapoint 2200 käyttää yksinkertaista bittisarjalogiikkaa pienellä endiaanilla siirtojen etenemisen helpottamiseksi. Kun Intel kehitti 8008-mikroprosessorin Datapointille, se käytti yhteensopivuuden vuoksi little-endiania. Koska Intel ei kuitenkaan kyennyt toimittamaan 8008:aa ajoissa, Datapoint käytti keskisuurta integraatiota vastaavaa mallia, mutta little-endian säilyi useimmissa Intelin malleissa, kuten MCS-48:ssa ja 8086:ssa ja sen x86:n seuraajissa. DEC Alpha, Atmel AVR, VAX, MOS Technology 6502 -perhe (mukaan lukien Western Design Center 65802 ja 65C816), Zilog Z80 (mukaan lukien Z180 ja eZ80), Altera Nios II ja monet muut prosessorit ja prosessoriperheet ovat myös little-endian-muotoisia.
Motorolan 6800/6801, 6809 ja 68000-sarjan prosessorit käyttivät big-endian-muotoa.
Intel 8051, toisin kuin muut Intelin prosessorit, odottaa 16-bittisiä osoitteita LJMP:lle ja LCALL:lle big-endian-muodossa; xCALL-käskyt kuitenkin tallentavat paluuosoitteen pinoon little-endian-muodossa.
SPARC käytti historiallisesti big-endian-muotoa aina versioon 9 asti, joka on bi-endian-muotoinen; vastaavasti IBM:n varhaisten IBM:n POWER-prosessoreiden osoite oli big-endian-muotoinen, mutta PowerPC:n ja Power ISA:n jälkeläisten osoite on nykyään bi-endians. ARM-arkkitehtuuri oli little-endian ennen versiota 3, jolloin siitä tuli bi-endian.
Nykyiset arkkitehtuuritEdit
Intelin x86- ja AMD64 / x86-64-sarjan prosessorit käyttävät little-endian-formaattia. Muita käskykanta-arkkitehtuureja, jotka noudattavat tätä konventiota ja sallivat vain little-endian-moodin, ovat muun muassa Nios II, Andes Technology NDS32 ja Qualcomm Hexagon.
Jotkut käskykanta-arkkitehtuurit sallivat kumman tahansa endian-moodin ohjelmistojen suorittamisen bi-endian-arkkitehtuurilla. Tällaisia arkkitehtuureja ovat esimerkiksi ARM AArch64, C-Sky, Power ISA ja RISC-V.
Yksinomaan big-endian-arkkitehtuurit ovat muun muassa IBM z/Arkkitehtuuri, Freescale ColdFire (joka perustuu Motorolan 68000-sarjaan), Atmel AVR32 ja OpenRISC. IBM AIX- ja Oracle Solaris -käyttöjärjestelmät, jotka toimivat bi-endian Power ISA- ja SPARC-arkkitehtuurilla, toimivat big-endian-tilassa; jotkin Linux-jakelut Power-arkkitehtuurilla ovat siirtyneet little-endian-tilaan.
Bi-endiannessEdit
Joissakin arkkitehtuureissa (mukaan lukien ARM-versiot 3 ja uudemmat, PowerPC, Alpha, SPARC V9, MIPS, PA-RISC, SuperH SH-4 ja IA-64) on käytössä asetus, joka sallii vaihdettavan endiaanisuuden datan nouto- ja varastointitoiminnoissa, käskynnoutotoiminnoissa tai molemmissa. Tämä ominaisuus voi parantaa suorituskykyä tai yksinkertaistaa verkkolaitteiden ja ohjelmistojen logiikkaa. Laitteistosta puhuttaessa sana bi-endian tarkoittaa koneen kykyä laskea tai välittää dataa kummassakin endian-muodossa.
Monet näistä arkkitehtuureista voidaan vaihtaa ohjelmiston avulla oletusarvoisesti tiettyyn endian-muotoon (tämä tehdään yleensä tietokonetta käynnistettäessä); joissakin järjestelmissä oletusarvoinen endian-muoto valitaan kuitenkin emolevyn laitteistolla, eikä sitä voi vaihtaa ohjelmiston avulla (esim.esim. Alpha, joka toimii vain big-endian-tilassa Cray T3E:ssä).
Huomaa, että termi bi-endian viittaa ensisijaisesti siihen, miten prosessori käsittelee datakäyttöjä. Tietyn prosessorin käskykäyttö (käskysanojen nouto) voi silti olettaa kiinteän endiaanisuuden, vaikka datakäyttö olisikin täysin bi-endiaanista, vaikka näin ei aina olekaan, kuten Intelin IA-64-pohjaisessa Itanium-suorittimessa, joka sallii molempia.
Huomaa myös, että jotkin nimellisesti bi-endiaaniset suorittimet vaativat emolevyn apua, jotta ne voisivat vaihtaa endiaanisuutta täysin. Esimerkiksi 32-bittiset työpöytäsuuntautuneet PowerPC-prosessorit toimivat little-endian-moodissa little-endian-muotoisina suoritettavien ohjelmien näkökulmasta, mutta ne vaativat emolevyn suorittamaan 64-bittisen swap-vaihdon kaikilla 8 tavun kaistoilla varmistaakseen, että little-endian-muotoinen näkemys pätee I/O-laitteisiin. Jos tätä epätavallista emolevyn laitteistoa ei ole, laiteajuriohjelmiston on kirjoitettava eri osoitteisiin peruuttaakseen epätäydellisen muunnoksen ja suoritettava myös normaali tavun vaihto.
Jotkut suorittimet, kuten monet sulautettuun käyttöön tarkoitetut PowerPC-prosessorit ja lähes kaikki SPARC-prosessorit, sallivat endiaanisuuden valinnan sivukohtaisesti.
SPARC-prosessorit 1990-luvun loppupuolelta lähtien (SPARC v9 -yhteensopivat prosessorit) sallivat datan endianssin valinnan jokaisella yksittäisellä käskyllä, joka lataa muistista tai tallentaa muistiin.
ARM-arkkitehtuuri tukee kahta big-endian-tilaa, joita kutsutaan BE-8 ja BE-32. Prosessorit ARMv5:een asti tukevat vain BE-32:ta eli word-invariant-tilaa. Tässä kaikki luonnollisesti kohdistetut 32-bittiset käyttöoikeudet toimivat kuten little-endian-tilassa, mutta tavun tai 16-bittisen sanan käyttöoikeudet ohjataan vastaavaan osoitteeseen, eikä kohdistamaton käyttö ole sallittua. ARMv6:ssa otetaan käyttöön BE-8 eli tavuinvariantti tila, jossa pääsy yksittäiseen tavuun toimii kuten little-endian-tilassa, mutta pääsy 16-bittiseen, 32-bittiseen tai (ARMv8:sta alkaen) 64-bittiseen sanaan johtaa datan tavun vaihtamiseen. Tämä yksinkertaistaa kohdistamatonta muistiin pääsyä sekä muistikartoitettua pääsyä muihin kuin 32-bittisiin rekistereihin.
Monissa prosessoreissa on käskyjä, joilla rekisterissä oleva sana muunnetaan päinvastaiseen endiaanisuuteen eli vaihdetaan tavujen järjestys 16-, 32- tai 64-bittisen sanan sisällä. Kaikkia yksittäisiä bittejä ei kuitenkaan käännetä.
Uudemmissa Intelin x86- ja x86-64-arkkitehtuurin suorittimissa on MOVBE-käsky (Intel Core 4. sukupolvesta lähtien, Atom-arkkitehtuurin jälkeen), joka hakee muistista big-endian-muotoisen sanan tai kirjoittaa sanan muistiin big-endian-muodossa. Muuten nämä prosessorit ovat läpikotaisin little-endian-muotoisia. Niissä oli myös jo erilaisia swap-käskyjä, joiden avulla rekisterien sisällön tavujärjestys voidaan kääntää, esimerkiksi silloin, kun sanat on jo haettu muistipaikoista, joissa ne olivat ”väärän” endiaanin mukaisia.
Floating pointEdit
Vaikka nykyään kaikkialla käytössä olevat x86-prosessorit käyttävät little-endian-muotoista tallennusta kaikentyyppisille tiedoille (kokonaisluvut, liukuluvut), on olemassa joukko laitteistoarkkitehtuureja, joissa liukuluvut esitetään big-endian-muotoisina, kun taas kokonaisluvut esitetään little-endian-muotoisina. On olemassa ARM-prosessoreita, joissa kaksoistarkkuuslukujen liukulukujen esitystapa on puoliksi little-endian, puoliksi big-endian: molemmat 32-bittiset sanat tallennetaan little-endian kuten kokonaislukurekisterit, mutta merkittävin ensin. Koska on ollut monia liukulukuformaatteja, joille ei ole ollut ”verkkostandardin” mukaista esitystä, XDR-standardi käyttää big-endian IEEE 754 -esitystä. Siksi voi tuntua oudolta, että laajalle levinnyt IEEE 754 -liukulukustandardi ei määrittele endiaanisuutta. Teoriassa tämä tarkoittaa, että jopa yhden koneen kirjoittama IEEE-standardin mukainen liukulukutieto ei välttämättä ole luettavissa toisella koneella. Nykyaikaisissa standardikoneissa (eli IEEE 754:n mukaisissa tietokoneissa) voidaan kuitenkin käytännössä turvallisesti olettaa, että liukulukujen endiannessi on sama kuin kokonaislukujen endiannessi, jolloin muuntaminen on suoraviivaista tietotyypistä riippumatta. (Pienet sulautetut järjestelmät, jotka käyttävät erityisiä liukulukuformaatteja, voivat kuitenkin olla eri asia.)
Muuttuvan pituiset tiedotEdit
Useimmat tähän mennessä tarkastellut käskyt sisältävät operandiensa koon (pituudet) operaatiokoodin sisällä. Usein käytettävissä olevat operandin pituudet ovat 1, 2, 4, 8 tai 16 tavua, mutta on myös arkkitehtuureja, joissa operandin pituus voidaan pitää erillisessä kentässä käskyssä tai itse operandin mukana, esim. sanamerkin avulla. Tällainen lähestymistapa mahdollistaa operandin pituudet jopa 256 tavuun tai jopa koko muistin kokoon asti.Tällaisten operandien tietotyyppejä ovat merkkijonot tai BCD.
Koneet, jotka pystyvät käsittelemään tällaista dataa yhdellä käskyllä (esim. vertaa, lisää), ovat esim. IBM 1401, 1410, 1620, System/3×0, ESA/390 ja z/Arkkitehtuuri, jotka kaikki ovat tyypiltään big-endian.
OptimizationEdit
Little-endian-järjestelmällä on se ominaisuus, että sama arvo voidaan lukea muistista eri pituisena käyttämättä eri osoitteita (vaikka kohdistamisrajoituksia asetettaisiinkin). Esimerkiksi 32-bittinen muistipaikka, jonka sisältö on 4A 00 00 00 00
, voidaan lukea samasta osoitteesta joko 8-bittisenä (arvo = 4A), 16-bittisenä (004A), 24-bittisenä (00004A) tai 32-bittisenä (0000004A), joissa kaikissa säilyy sama numeerinen arvo. Vaikka korkean tason ohjelmoijat käyttävät tätä little-endian-ominaisuutta harvoin suoraan, koodin optimoijat sekä assembler-kielen ohjelmoijat käyttävät sitä usein.
Konkreettisemmin ilmaistuna tällaiset optimoinnit vastaavat sitä, että seuraava C-koodi palaa true-arvona useimmissa little-endian-järjestelmissä:
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");
Vaikkakaan C++ ei salli tällaista tyypin punnituskoodia, se sallitaan kuitenkin ”implementaatiomääriteltynä” C11-standardissa, ja se on yleisessä käytössä koodissa, joka on vuorovaikutuksessa laitteiston kanssa.
Toisaalta joissakin tilanteissa voi olla hyödyllistä saada approksimaatio usean tavun tai sanan arvosta lukemalla vain sen merkittävin osa koko esityksen sijasta; big-endian-prosessori voi lukea tällaisen approksimaation käyttäen samaa perusosoitetta, jota käytettäisiin koko arvolle.
Tämmöiset approksimoinnit eivät ole siirrettävissä eri endianssin omaaviin järjestelmiin.
LaskentajärjestysMuokkaa
Joillain operaatioilla kantalukujärjestelmissä on luonnollinen tai suositeltava järjestys, jossa alkeisaskeleet on suoritettava.Tämä järjestys voi vaikuttaa niiden suorituskykyyn pienikokoisissa tavuilla osoitettavissa prosessoreissa ja mikrokontrollereissa.
Suorituskykyiset prosessorit hakevat kuitenkin yleensä tyypilliset usean tavun operandit muistista samassa ajassa kuin ne olisivat hakeneet yhden tavun, joten tavujärjestys ei vaikuta laitteiston monimutkaisuuteen.
Vähiten merkitsevästä numerosta alkavat operaatiotEdit
Lisäys, vähennys ja kertolasku alkavat vähiten merkitsevän numeron kohdalta ja siirto etenee seuraavaan merkitsevämpään kohtaan.Moninumeroisen datan osoitteistaminen sen ensimmäisestä (= pienimmän osoitteen) tavusta on vallitseva osoitteistusjärjestelmä.Kun tämä ensimmäinen tavu sisältää vähiten merkitsevän numeron – mikä vastaa little-endiannessia – niin näiden operaatioiden toteutus on marginaalisesti yksinkertaisempi.
Operaatioita, jotka alkavat merkitsevimmästä numerostaEdit
Vertailu ja jakolasku alkavat merkitsevimmästä numerosta ja etenevät mahdollisen siirron kanssa sitä seuraaviin vähemmän merkitseviin numeroihin. Kiinteäpituisille lukuarvoille (tyypillisesti pituudet 1,2,4,8,16) näiden operaatioiden toteutus on marginaalisesti yksinkertaisempaa big-endian-koneissa.
Operandit, joiden pituus vaihteleeEdit
Monissa big-endian-prosessoreissa on laitteistokäskyjä, joilla voidaan verrata leksikografisesti eri pituisia merkkijonoja (esim. IBM System/360 ja sen seuraajat).
Operaatioita, joilla ei ole vaikutustaEdit
Normaalin datan kuljetus assignment-lausekkeella on periaatteessa riippumaton prosessorin endiaanisuudesta.
Keski-endiaaninenEdit
Lukuisia muitakin järjestysmuotoja, joita kutsutaan yleisnimellä keski-endiaaninen tai seka-endiaaninen, on mahdollista. Yksi tällainen esimerkki tietojenkäsittelytieteen ulkopuolelta on tavallinen amerikkalainen päivämäärän muotoilu kuukausi/päivä/vuosi.
PDP-endianEdit
PDP-11 on periaatteessa 16-bittinen little-endian järjestelmä. PDP-11/45:n, PDP-11/70:n ja joidenkin myöhempien prosessoreiden valinnaisessa liukulukuprosessorissa olevat liukulukuarvojen ja kokonaislukuarvojen väliset muunnosohjeet tallensivat 32-bittiset ”double precision integer long” -arvot siten, että 16-bittiset puolikkaat oli vaihdettu odotettuun little-endian-järjestykseen. UNIXin C-kääntäjä käytti samaa muotoa 32-bittisille pitkille kokonaisluvuille. Tämä järjestys tunnetaan nimellä PDP-endian.
Tapa tulkita tämä endiaanisuus on, että se tallentaa 32-bittisen kokonaisluvun kahtena 16-bittisenä sanana big-endian, mutta itse sanat ovat little-endian (E.esim. ”jag cog sin” olisi ”gaj goc nis”):
kasvaviin osoitteisiin → | |||||
0Bh | 0Ah | 0Dh | 0Ch | ||
0A0Bh | 0C0Dh |
Tässä esitetyt 16-bittiset arvot viittaavat niiden numeerisiin arvoihin, eivät niiden todelliseen asetteluun.
Honeywell Series 16Edit
Honeywell Series 16 16-bittiset tietokoneet, mukaan lukien Honeywell 316, ovat PDP-11:n vastakohta 32-bittisten sanojen tallentamisessa C:hen. Se tallentaa jokaisen 16-bittisen sanan big-endian-järjestyksessä, mutta liittää ne toisiinsa little-endian-järjestyksessä:
kasvaviin osoitteisiin → | |||||
0Ch | 0Dh | 0Ah | 0Bh | ||
0C0Dh | 0A0Bh |
Intel IA-32:n segmenttikuvaajatEdit
IA-32:n ja yhteensopivien prosessoreiden segmenttikuvaajat säilyttävät 32-bittisen segmentin perusosoitteen, joka on tallennettu little-endian-järjestyksessä, mutta neljänä ei-peräkkäisenä tavuna suhteellisiin sijainteihin 2, 3, 4 ja 7 kuvaajan alkupäästä.