Endianness
- HistoryEdit
- Arhitecturi actualeEdit
- Bi-endiannessEdit
- Floating pointEdit
- Date de lungime variabilăEdit
- OptimizareEdit
- Ordinea de calculEdit
- Operații care încep de la cea mai puțin semnificativă cifrăEdit
- Operații care încep de la cea mai semnificativă cifrăEdit
- Operanzi de lungime variabilăEdit
- Operații fără impactEdit
- Middle-endianEdit
- PDP-endianEdit
- Honeywell Series 16Edit
- Descriptori de segment Intel IA-32Edit
HistoryEdit
Multe procesoare istorice și existente folosesc o reprezentare de memorie big-endian, fie exclusiv, fie ca opțiune de proiectare. Reprezentarea memoriei big-endian este denumită în mod obișnuit ordine de rețea, așa cum este utilizată în suita de protocoale Internet. Alte tipuri de procesoare folosesc reprezentarea memoriei little-endian; altele folosesc încă o altă schemă numită „middle-endian”, „mixed-endian” sau „PDP-11-endian”.
Procesorul IBM System/360 folosește ordinea big-endian a octeților, la fel ca și succesorii săi System/370, ESA/390 și z/Architecture. PDP-10 utilizează, de asemenea, adresarea big-endian pentru instrucțiunile orientate pe octeți. Minicomputerele IBM Series/1 folosesc, de asemenea, ordinea big-endian a octeților.
Tratarea datelor cu endianitate diferită este uneori denumită problema NUXI. Această terminologie face aluzie la conflictele de ordine a octeților întâlnite în timpul adaptării UNIX, care rula pe PDP-11 mixed-endian, la un calculator IBM Series/1 big-endian. Unix a fost unul dintre primele sisteme care a permis compilarea aceluiași cod pentru platforme cu reprezentări interne diferite. Unul dintre primele programe convertite trebuia să tipărească Unix
, dar pe Series/1 a tipărit în schimb nUxi
.
Datapoint 2200 folosește o logică bit-serial simplă cu little-endian pentru a facilita propagarea carry-ului. Când Intel a dezvoltat microprocesorul 8008 pentru Datapoint, a folosit little-endian pentru compatibilitate. Cu toate acestea, deoarece Intel nu a fost în măsură să livreze 8008 la timp, Datapoint a folosit un echivalent de integrare la scară medie, dar little-endian-ul a fost păstrat în majoritatea proiectelor Intel, inclusiv MCS-48 și 8086 și succesorii săi x86. DEC Alpha, Atmel AVR, VAX, familia MOS Technology 6502 (inclusiv Western Design Center 65802 și 65C816), Zilog Z80 (inclusiv Z180 și eZ80), Altera Nios II și multe alte procesoare și familii de procesoare sunt, de asemenea, little-endian.
Procesoarele Motorola 6800 / 6801, 6809 și seria de procesoare 68000 au folosit formatul big-endian.
Procesorul Intel 8051, spre deosebire de alte procesoare Intel, se așteaptă la adrese pe 16 biți pentru LJMP și LCALL în format big-endian; cu toate acestea, instrucțiunile xCALL stochează adresa de întoarcere pe stivă în format little-endian.
SPARC a folosit istoric big-endian până la versiunea 9, care este bi-endian; în mod similar, primele procesoare IBM POWER au fost big-endian, dar PowerPC și descendenții Power ISA sunt acum bi-endian. Arhitectura ARM a fost little-endian înainte de versiunea 3, când a devenit bi-endian.
Arhitecturi actualeEdit
Seriile de procesoare Intel x86 și AMD64 / x86-64 folosesc formatul little-endian. Alte arhitecturi de seturi de instrucțiuni care urmează această convenție, permițând doar modul little-endian, includ Nios II, Andes Technology NDS32 și Qualcomm Hexagon.
Câteva arhitecturi de seturi de instrucțiuni permit rularea de software de oricare dintre cele două tipuri de endian pe o arhitectură bi-endian. Aceasta include ARM AArch64, C-Sky, Power ISA și RISC-V.
Arhitecturile exclusiv big-endian includ IBM z/Architecture, Freescale ColdFire (care se bazează pe seria Motorola 68000), Atmel AVR32 și OpenRISC. Sistemele de operare IBM AIX și Oracle Solaris pe bi-endian Power ISA și SPARC rulează în modul big-endian; unele distribuții de Linux pe Power au trecut la modul little-endian.
Bi-endiannessEdit
Câteva arhitecturi (inclusiv versiunile ARM 3 și superioare, PowerPC, Alpha, SPARC V9, MIPS, PA-RISC, SuperH SH-4 și IA-64) dispun de o setare care permite comutarea endianness-ului în preluările și stocările de date, în preluările de instrucțiuni sau în ambele. Această caracteristică poate îmbunătăți performanța sau simplifica logica dispozitivelor de rețea și a software-ului. Cuvântul bi-endian, atunci când se spune despre hardware, denotă capacitatea mașinii de a calcula sau de a transmite date în oricare dintre cele două formate endiene.
Multe dintre aceste arhitecturi pot fi comutate prin software pentru a se trece implicit la un anumit format endian (de obicei, acest lucru se face la pornirea calculatorului); cu toate acestea, la unele sisteme, endianitatea implicită este selectată de hardware pe placa de bază și nu poate fi schimbată prin software (de ex.ex. Alpha, care rulează numai în modul big-endian pe Cray T3E).
Rețineți că termenul bi-endian se referă în primul rând la modul în care un procesor tratează accesările de date. Accesele la instrucțiuni (fetch-uri ale cuvintelor de instrucțiuni) pe un anumit procesor pot să presupună în continuare un endian fix, chiar dacă accesele la date sunt complet bi-endian, deși acest lucru nu este întotdeauna cazul, cum ar fi la procesorul Intel Itanium bazat pe IA-64, care le permite pe amândouă.
Rețineți, de asemenea, că unele procesoare nominal bi-endian necesită ajutorul plăcii de bază pentru a comuta complet endianul. De exemplu, procesoarele PowerPC pe 32 de biți orientate spre desktop în modul little-endian acționează ca little-endian din punctul de vedere al programelor în execuție, dar necesită ca placa de bază să efectueze un swap pe 64 de biți pe toate cele 8 benzi de octeți pentru a se asigura că viziunea little-endian a lucrurilor se va aplica dispozitivelor I/O. În absența acestui hardware neobișnuit al plăcii de bază, software-ul driverului de dispozitiv trebuie să scrie la adrese diferite pentru a anula transformarea incompletă și, de asemenea, trebuie să efectueze un schimb normal de octeți.
Câteva unități centrale de procesare, cum ar fi multe procesoare PowerPC destinate utilizării încorporate și aproape toate procesoarele SPARC, permit alegerea per pagină a endianității.
Procesoarele SPARC de la sfârșitul anilor 1990 (procesoarele compatibile SPARC v9) permit alegerea endianității datelor cu fiecare instrucțiune individuală care încarcă din sau stochează în memorie.
Arhitectura ARM suportă două moduri big-endian, numite BE-8 și BE-32. Procesoarele până la ARMv5 suportă doar modul BE-32 sau modul word-invariant. Aici, orice acces pe 32 de biți aliniați în mod natural funcționează ca în modul little-endian, dar accesul la un octet sau la un cuvânt pe 16 biți este redirecționat către adresa corespunzătoare și nu este permis accesul nealiniat. ARMv6 introduce modul BE-8 sau modul byte-invariant, în care accesul la un singur octet funcționează ca în modul little-endian, dar accesul la un cuvânt de 16, 32 sau (începând cu ARMv8) 64 de biți are ca rezultat un schimb de octeți al datelor. Acest lucru simplifică accesul la memoria nealiniată, precum și accesul la memoria mapată în registre, altele decât cele pe 32 de biți.
Multe procesoare au instrucțiuni pentru a converti un cuvânt dintr-un registru în regimul endian opus, adică schimbă ordinea octeților într-un cuvânt pe 16, 32 sau 64 de biți. Totuși, toți biții individuali nu sunt inversați.
Procesoarele cu arhitectură Intel x86 și x86-64 recente au o instrucțiune MOVBE (Intel Core începând cu generația 4, după Atom), care preia din memorie un cuvânt în format big-endian sau scrie în memorie un cuvânt în format big-endian. În rest, aceste procesoare sunt complet little-endian. De asemenea, acestea dispuneau deja de o serie de instrucțiuni swap pentru a inversa ordinea octeților din conținutul registrelor, cum ar fi atunci când cuvintele au fost deja preluate din locații de memorie în care se aflau în format „greșit”.
Floating pointEdit
Deși omniprezentele procesoare x86 de astăzi folosesc stocarea little-endian pentru toate tipurile de date (întregi, virgulă mobilă), există o serie de arhitecturi hardware în care numerele în virgulă mobilă sunt reprezentate în forma big-endian, în timp ce numerele întregi sunt reprezentate în forma little-endian. Există procesoare ARM care au o reprezentare în virgulă mobilă jumătate little-endian, jumătate big-endian pentru numere de precizie dublă: ambele cuvinte de 32 de biți sunt stocate în registre little-endian ca și în cazul numerelor întregi, dar primul este cel mai semnificativ. Deoarece au existat multe formate de virgulă mobilă fără o reprezentare standard „de rețea” pentru acestea, standardul XDR folosește ca reprezentare big-endian IEEE 754. Prin urmare, poate părea ciudat faptul că standardul larg răspândit pentru virgulă mobilă IEEE 754 nu specifică caracterul endian. Teoretic, acest lucru înseamnă că chiar și datele în virgulă mobilă IEEE standard scrise de o mașină ar putea să nu poată fi citite de o altă mașină. Cu toate acestea, pe computerele moderne standard (adică cele care implementează IEEE 754), în practică se poate presupune în mod sigur că natura de endiență este aceeași pentru numerele în virgulă mobilă ca și pentru numere întregi, ceea ce face ca conversia să fie simplă, indiferent de tipul de date. (Cu toate acestea, sistemele mici încorporate care utilizează formate speciale în virgulă mobilă pot fi o altă problemă.)
Date de lungime variabilăEdit
Majoritatea instrucțiunilor luate în considerare până acum conțin dimensiunea (lungimile) operanzilor săi în cadrul codului operației. Lungimile operanzilor disponibile în mod frecvent sunt de 1, 2, 4, 8 sau 16 octeți. dar există și arhitecturi în care lungimea unui operand poate fi reținută într-un câmp separat al instrucțiunii sau împreună cu operandul însuși, de exemplu, prin intermediul unui semn de cuvânt. O astfel de abordare permite lungimi de operand de până la 256 de octeți sau chiar întreaga dimensiune a memoriei.Tipurile de date ale unor astfel de operanzi sunt șiruri de caractere sau BCD.
Mașinile care sunt capabile să manipuleze astfel de date cu o singură instrucțiune (de exemplu, comparare, adăugare) sunt de ex. IBM 1401, 1410, 1620, System/3×0, ESA/390 și arhitectura z/Architecture, toate de tip big-endian.
OptimizareEdit
Sistemul little-endian are proprietatea că aceeași valoare poate fi citită din memorie la lungimi diferite fără a folosi adrese diferite (chiar și atunci când sunt impuse restricții de aliniere). De exemplu, o locație de memorie pe 32 de biți cu conținutul 4A 00 00 00 00 00
poate fi citită la aceeași adresă fie pe 8 biți (valoare = 4A), fie pe 16 biți (004A), fie pe 24 de biți (00004A), fie pe 32 de biți (0000004A), toate acestea păstrând aceeași valoare numerică. Deși această proprietate little-endian este rareori folosită direct de programatorii de nivel înalt, ea este adesea folosită de optimizatorii de cod, precum și de programatorii de limbaj de asamblare.
În termeni mai concreți, astfel de optimizări sunt echivalentul următorului cod C care returnează true pe majoritatea sistemelor little-endian:
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");
Deși nu este permis de C++, un astfel de cod de tip punning este permis ca fiind „definit de implementare” de către standardul C11 și utilizat în mod obișnuit în codul care interacționează cu hardware-ul.
Pe de altă parte, în unele situații poate fi utilă obținerea unei aproximări a unei valori de mai mulți octeți sau mai mulți cuvinte prin citirea doar a porțiunii sale cele mai semnificative în loc de reprezentarea completă; un procesor big-endian poate citi o astfel de aproximare folosind aceeași adresă de bază care ar fi folosită pentru valoarea completă.
Optimizările de acest tip nu sunt portabile între sisteme cu endianitate diferită.
Ordinea de calculEdit
Câteva operații în sistemele de numere poziționale au o ordine naturală sau preferată în care trebuie executate etapele elementare.Această ordine poate afecta performanța lor pe procesoarele și microcontrolerele de mici dimensiuni cu adresabilitate pe octeți.
Cu toate acestea, procesoarele de înaltă performanță extrag de obicei operanzi tipici de mai mulți octeți din memorie în același timp în care ar fi extras un singur octet, astfel încât complexitatea hardware-ului nu este afectată de ordinea octeților.
Operații care încep de la cea mai puțin semnificativă cifrăEdit
Aducerea, scăderea și înmulțirea încep de la poziția celei mai puțin semnificative cifre și propagă reportul la poziția următoare mai semnificativă.Adresarea datelor cu mai multe cifre la primul octet (= cea mai mică adresă) este schema de adresare predominantă. atunci când acest prim octet conține cea mai puțin semnificativă cifră – ceea ce este echivalent cu little-endianness, atunci implementarea acestor operații este marginal mai simplă.
Operații care încep de la cea mai semnificativă cifrăEdit
Compararea și împărțirea încep de la cea mai semnificativă cifră și propagă un eventual transport la următoarele cifre mai puțin semnificative. Pentru valorile numerice de lungime fixă (de obicei de lungime 1,2,4,8,16), implementarea acestor operații este marginal mai simplă pe mașinile big-endian.
Operanzi de lungime variabilăEdit
Multe procesoare big-endian conțin instrucțiuni hardware pentru compararea lexicografică a șirurilor de caractere de lungime variabilă (de ex. IBM System/360 și succesoarele sale).
Operații fără impactEdit
Transportul normal al datelor de către o instrucțiune de atribuire este în principiu independent de endianitatea procesorului.
Middle-endianEdit
Sunt posibile numeroase alte ordonări, denumite generic middle-endian sau mixed-endian. Un astfel de exemplu din afara domeniului informaticii este formatarea standard a datei americane de lună/zi/an.
PDP-endianEdit
PDPP-11 este în principiu un sistem little-endian pe 16 biți. Instrucțiunile de conversie între valorile în virgulă mobilă și cele întregi din procesorul opțional în virgulă mobilă al PDP-11/45, PDP-11/70 și în unele procesoare ulterioare, stocau valori de 32 de biți „double precision integer long” cu jumătățile de 16 biți schimbate față de ordinea little-endian așteptată. Compilatorul UNIX C folosea același format pentru numerele întregi lungi pe 32 de biți. Această ordonare este cunoscută sub numele de PDP-endian.
Un mod de a interpreta această ordonare endiană este că stochează un întreg de 32 de biți ca două cuvinte de 16 biți în big-endian, dar cuvintele în sine sunt little-endian (E.g. „jag cog sin” ar fi „gaj goc nis”):
adrese crescânde → | |||||
0Bh | 0Ah | 0Dh | 0Ch | ||
0A0Bh | 0C0Dh |
Valorile pe 16 biți se referă aici la valorile lor numerice, nu la dispunerea lor reală.
Honeywell Series 16Edit
Computerele Honeywell Series 16 pe 16 biți, inclusiv Honeywell 316, sunt opusul lui PDP-11 în ceea ce privește stocarea cuvintelor pe 32 de biți în C. Acesta stochează fiecare cuvânt pe 16 biți în ordine big-endian, dar le unește în mod little-endian:
adrese crescânde → | |||||
0Ch | 0Dh | 0Ah | 0Bh | ||
0C0Dh | 0A0Bh |
Descriptori de segment Intel IA-32Edit
Descriptorii de segment ai procesoarelor IA-32 și ai procesoarelor compatibile păstrează o adresă de bază de 32 de biți a segmentului stocată în ordine little-endian, dar în patru octeți neconsecutivi, în pozițiile relative 2, 3, 4 și 7 ale startului descriptorului.
.