Endian

HistoryEdit

många historiska och bevarade processorer använder en stor endian minnesrepresentation, antingen uteslutande eller som ett designalternativ. Big-endian minnesrepresentation kallas vanligtvis nätverksorder, som används i Internet protocol suite. Andra processortyper använder liten endisk minnesrepresentation; andra använder ännu ett system som heter ”middle-endian”, ”mixed-endian”eller” PDP-11-endian”.

IBM-systemet/360 använder big-endian byte order, liksom dess efterträdare System/370, ESA/390 och z / arkitektur., PDP-10 använder också big-endian adressering för byte-orienterade instruktioner. IBM-serien / 1 minidator använder också big-endian byte order.

hantera data av olika endian kallas ibland NUXI-problemet. Denna terminologi anspelar på byte orderkonflikter som uppstod vid anpassning av UNIX, som sprang på den blandade endian PDP-11, till en stor endian IBM Series/1-dator. Unix var ett av de första systemen för att göra det möjligt att sammanställa samma kod för plattformar med olika interna representationer., Ett av de första programmen som konverterades skulle skriva ut Unix, men på serien/1 skrivs det ut nUxi istället.

Datapoint 2200 använder enkel bit-seriell logik med liten endian för att underlätta bärförökning. När Intel utvecklade 8008 mikroprocessorn för datapunkt använde de little-endian för kompatibilitet., Men eftersom Intel inte kunde leverera 8008 i tid använde Datapoint en medelskala integrationsekvivalent, men den lilla endian behölls i de flesta Intel-mönster, inklusive MCS-48 och 8086 och dess x86-efterträdare. Den DEC Alpha, Atmel AVR, VAX, MOS Technology 6502-familjen (inklusive Västra Design Center 65802 och 65C816), Zilog Z80 (inklusive Z180 och eZ80), Altera Nios II, och många andra processorer och processor familjer är också little-endian.

Motorola 6800 / 6801, 6809 och 68000-serien av processorer använde det stora endiska formatet.,

Intel 8051, i motsats till andra Intel-processorer, förväntar sig att 16-bitars adresser för LJMP och LCALL i big-endian-format, men xCALL instruktioner lagra returadress på stacken i little-endian-format.

SPARC historiskt använt big-endian fram till version 9, som är bi-endian; liknande tidiga IBM Power processorer var big-endian, men PowerPC och Power Isa Ättlingar är nu bi-endian. ARM-arkitekturen var liten endian före version 3 när den blev bi-endian.,

nuvarande architecturesEdit

Intel x86 och AMD64 / x86-64-serien processorer använder det lilla endiska formatet. Andra instruktionsuppsättningsarkitekturer som följer denna konvention, som endast tillåter lite endian-läge, inkluderar Nios II, Andes Technology NDS32 och Qualcomm Hexagon.

vissa instruktionsuppsättningsarkitekturer gör det möjligt att köra programvara av endera endian på en bi-endian-arkitektur. Detta inkluderar ARM AArch64, C-Sky, Makt ISA, och RISC-V.,

Endast big-endian arkitekturer inkluderar IBM z/Architecture, Freescale ColdFire (som är Motorola 68000-serien baserad), Atmel AVR32, och OpenRISC. IBM AIX och Oracle Solaris operativsystem på bi-endian Power Isa och SPARC körs i big-endian läge; vissa distributioner av Linux på makten har flyttat till little-endian läge.,

Bi-endiannessEdit

vissa arkitekturer (inklusive ARM-versioner 3 och senare, PowerPC, Alpha, SPARC V9, MIPS, PA-RISC, SuperH sh-4 och IA-64) har en inställning som möjliggör omkopplingsbar endian i datahämtningar och butiker, instruktionshämtningar, eller båda. Denna funktion kan förbättra prestanda eller förenkla logiken i nätverksenheter och programvara. Ordet bi-endian, när det sägs om hårdvara, betecknar maskinens förmåga att beräkna eller skicka data i antingen endian-format.,

många av dessa arkitekturer kan växlas via programvara till standard till ett specifikt endian-format( vanligtvis gjort när datorn startar); men på vissa system är standard endian vald av hårdvara på moderkortet och kan inte ändras via programvara (t.ex. Alpha, som endast körs i big-endian-läge på Cray T3E).

Observera att termen ”bi-endian”främst avser hur en processor behandlar dataåtkomst., Instruktion åtkomst (hämtar instruktionsord) på en given processor kan fortfarande anta en fast endian, även om dataåtkomst är helt bi-endian, även om detta inte alltid är fallet, till exempel på Intels IA-64-baserade Itanium CPU, vilket tillåter båda.

Observera också att vissa nominellt bi-endian processorer kräver moderkort hjälp att helt byta endian., Till exempel fungerar 32-bitars skrivbordsorienterade PowerPC-processorer i little-endian-läge som lite endian ur de verkställande programmens synvinkel, men de kräver att moderkortet utför en 64-bitars swap över alla 8 byte-körfält för att säkerställa att den lilla endiska syn på saker kommer att gälla för I/O-enheter. I avsaknad av denna ovanliga moderkort hårdvara, drivrutin programvara måste skriva till olika adresser för att ångra den ofullständiga omvandlingen och måste också utföra en normal byte swap.,

vissa processorer, såsom många PowerPC-processorer avsedda för inbäddad användning och nästan alla SPARC-processorer, tillåter per sida val av endian.

SPARC-processorer sedan slutet av 1990-talet (”SPARC v9” – kompatibla processorer) tillåter att data endian väljs med varje enskild instruktion som laddas från eller lagrar till minne.

ARM-arkitekturen stöder två stora endiska lägen, BE-8 och BE-32. Processorer upp till ARMv5 stöder endast be-32 eller Word-Invariant läge., Här fungerar någon naturligt inriktad 32-bitars åtkomst som i little-endian-läge, men åtkomst till en byte eller 16-bitars ord omdirigeras till motsvarande adress och ojusterad åtkomst är inte tillåten. ARMv6 introducerar VARA-8 eller Byte-Invariant-läge, där det finns tillgång till en enda byte fungerar som i läget för little-endian, men att få åtkomst till en 16-bitars, 32-bitars eller (från och med ARMv8) 64-bitars ord resulterar i ett byte byte av data. Detta förenklar oanpassat minne tillgång samt minne mappade tillgång till andra register än 32 bitars.,

många processorer har instruktioner för att konvertera ett ord i ett register till motsatt endian, det vill säga de byter bytesordningen i ett 16 -, 32 – eller 64-bitars ord. Alla enskilda bitar är dock inte omvända.

de Senaste Intel x86-och x86-64-arkitektur Processorer har en MOVBE instruktion (Intel Core eftersom generation 4, efter Atom), som hämtar en big-endian format ord från minnet eller skriver ett ord i minnet i big-endian-format. Dessa processorer är annars grundligt lite endian., De hade också redan en rad swappinstruktioner för att vända byte-ordningen för innehållet i register, till exempel när ord redan har hämtats från minnesplatser där de var i ” fel ” endian.

Flyttal

även om de allestädes närvarande x86-processorerna i dag använder liten endisk lagring för alla typer av data (heltal, flyttal), finns det ett antal hårdvaruarkitekturer där flyttal representeras i stor endisk form medan heltal representeras i liten endisk form., Det finns ARM-processorer som har halv liten endian, halv stor endian flyttal representation för dubbel precision nummer: båda 32-bitars ord lagras i little-endian som heltal register, men den mest betydande först. Eftersom det har funnits många flytande punktformat utan ”nätverk” standardrepresentation för dem, använder XDR-standarden big-endian IEEE 754 som sin representation. Det kan därför verka konstigt att den utbredda IEEE 754 flyttalsstandarden inte anger endian., Teoretiskt innebär detta att även standard IEEE flyttal data skrivna av en maskin inte kan läsas av en annan. Men på moderna standarddatorer (dvs. implementera IEEE 754) kan man i praktiken säkert anta att endian är densamma för flyttal som för heltal, vilket gör konverteringen okomplicerad oavsett datatyp. (Små inbyggda system som använder speciella flyttal format kan dock vara en annan sak.,)

variabel längd dataEdit

de flesta instruktioner som hittills övervägts innehåller storleken (längderna) av dess operander inom driftskoden. Ofta tillgängliga operandlängder är 1, 2, 4, 8 eller 16 byte.Men det finns också arkitekturer där längden på en operand kan hållas i ett separat fält i instruktionen eller med operanden själv, t. ex. med hjälp av ett ordmärke. Ett sådant tillvägagångssätt tillåter operand längder upp till 256 byte eller till och med full minnesstorlek.Datatyperna för sådana operander är teckensträngar eller BCD.,

OptimizationEdit

det lilla endiska systemet har egenskapen att samma värde kan läsas från minnet vid olika längder utan att använda olika adresser (även när justeringsbegränsningar införs). Till exempel kan en 32-bitars minnesplats med innehåll 4A 00 00 00 läsas på samma adress som antingen 8-bitars (value = 4A), 16-bitars (004A), 24-bitars (00004A) eller 32-bitars (0000004A), som alla behåller samma numeriska värde., Även om denna lilla endian egendom sällan används direkt av högnivåprogrammerare, används den ofta av kodoptimerare samt av samlingsspråksprogrammerare.

i mer konkreta termer motsvarar sådana optimeringar följande C-kod som returnerar sant på de flesta little-endian-system:

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

Även om det inte är tillåtet av C++, är sådan typ punning kod tillåten som ”implementation-definierad” av C11-standarden och vanligen används i kod som interagerar med hårdvara.,

å andra sidan kan det i vissa situationer vara användbart att få en approximation av ett multi-byte eller multi-word-värde genom att bara läsa dess viktigaste del istället för den fullständiga representationen. en stor endian-processor kan läsa en sådan approximation med samma basadress som skulle användas för det fulla värdet.

optimeringar av detta slag är inte bärbara över system av olika endian.

beräkning orderEdit

vissa operationer i positionsnummersystem har en naturlig eller föredragen ordning där de elementära stegen ska utföras.,Denna order kan påverka deras prestanda på småskaliga byte-adresserbara processorer och mikrokontroller.

högpresterande processorer hämtar vanligtvis typiska multi-byte-operander från minnet under samma tid som de skulle ha hämtat en enda byte, så hårdvarans komplexitet påverkas inte av byte-beställningen.

operationer som startar minst signifikant digitEdit

som lärt sig i skolan, addition, subtraktion och multiplikation startar minst signifikant sifferposition och propagerar bärningen till den efterföljande mer signifikanta positionen.,Att ta itu med flersiffriga data vid sin första (=minsta adress) byte är det dominerande adresseringssystemet.När denna första byte innehåller den minst signifikanta siffran – vilket motsvarar liten endian, är genomförandet av dessa operationer marginellt enklare.

operationer som börjar vid den mest signifikanta digitEdit

jämförelse och division startar vid den mest signifikanta siffran och sprider en möjlig överföring till de efterföljande mindre signifikanta siffrorna., För numeriska värden med fast längd (typiskt längd 1,2,4,8,16) är genomförandet av dessa operationer marginellt enklare på big-endian-maskiner.

operander av varierande längd

i programmeringsspråket C måste lexikografisk jämförelse av teckensträngar göras av subrutiner, som ofta erbjuds och implementeras som en subrutin (t. ex. strcmp).

många stora endian processorer innehåller hårdvaruinstruktioner för lexikografiskt jämföra varierande längd teckensträngar (t. ex. IBM System/360 och dess efterträdare).,

operationer utan påverkandedit

den normala datatransporten genom en uppdragsbeskrivning är i princip oberoende av processorns endian.

Middle-endianEdit

många andra ordningar, allmänt kallade middle-endian eller mixed-endian, är möjliga. Ett sådant exempel utanför datavetenskap är standard amerikansk datumformatering av Månad/Dag / år.

PDP-endianEdit

PDP-11 är i princip ett 16-bitars litet endiskt system., Instruktionerna för att konvertera mellan flyttal och heltal värden i valfri flyttal processor av PDP-11/45, PDP-11/70, och i vissa senare processorer, lagrade 32-bitars ”dubbel precision heltal långa” värden med 16-bitars halvor bytte från den förväntade lilla endian ordning. Unix C-kompilatorn använde samma format för 32-bitars långa heltal. Denna beställning kallas PDP-endian.

ett sätt att tolka denna endian är att den lagrar ett 32-bitars heltal som två 16-bitars ord i big-endian, men orden själva är lite endian (t.ex., ”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 …,

16-bitarsvärdena här hänvisar till deras numeriska värden, inte deras faktiska layout.

Honeywell Series 16Edit

Honeywell Series 16 16-bitars datorer, inklusive Honeywell 316, är motsatsen till PDP-11 för att lagra 32-bitars ord i 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.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *