Endianness (Română)

HistoryEdit

Multe și istorice existente procesoare folosesc un big-endian memorie reprezentare, fie exclusiv, fie ca o opțiune de design. 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 schemă numită „middle-endian”, „mixed-endian” sau „PDP-11-endian”.

IBM System/360 folosește ordinea octetului big-endian, la fel ca succesorii săi System/370, ESA/390 și z / Architecture., PDP-10 folosește, de asemenea, adresarea big-endian pentru instrucțiuni orientate pe octet. MINICOMPUTERUL IBM Series / 1 utilizează, de asemenea, comanda big-endian byte.

care se ocupă cu date de endianness diferite este uneori numit problema NUXI. Această terminologie face aluzie la conflictele de ordine octet întâlnite în timpul adaptării UNIX, care a rulat pe PDP-11 mixt-endian, la un computer 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 de convertit trebuia să imprimați Unix, dar pe Seria/1 tipărite nUxi în loc.

Datapoint 2200 utilizează logica simplă bit-serial cu little-endian pentru a facilita propagarea transporta. Când Intel a dezvoltat microprocesorul 8008 pentru Datapoint, au folosit little-endian pentru compatibilitate., Cu toate acestea, ca Intel a fost în imposibilitatea de a livra 8008 în timp, Datapoint folosit un medium scale integration echivalent, dar puțin endianness fost reținute în majoritatea Intel modele, inclusiv MCS-48 și 8086 și x86 succesorii. DEC Alpha, Atmel AVR, VAX, la MOS Technology 6502 familie (inclusiv Vest Centru de Design 65802 și 65C816), la Zilog Z80 (inclusiv Z180 și eZ80), Altera Nios II, și multe alte procesoare și familii de procesoare sunt, de asemenea, little-endian.

Motorola 6800 / 6801, seria de procesoare 6809 și 68000 au folosit formatul big-endian.,

Intel 8051, spre deosebire de alte procesoare Intel, se așteaptă 16-bit adrese pentru LJMP și LCALL în big-endian format; cu toate acestea, xCALL instrucțiuni magazin adresa de returnare de pe stiva în little-endian format.SPARC a folosit istoric big-endian până la versiunea 9, care este bi-endian; în mod similar procesoarele IBM POWER timpurii au fost big-endian, dar descendenții PowerPC și Power ISA sunt acum bi-endian. Arhitectura ARM a fost little-endian înainte de versiunea 3 Când a devenit bi-endian.,

arhitecturi Curenteedit

seria de procesoare Intel x86 și AMD64 / x86-64 utilizează 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.

unele arhitecturi set de instrucțiuni permit rularea software-ului fie endianness pe o arhitectură bi-endian. Acestea includ ARM AArch64, C-Sky, Power ISA și RISC-V.,

numai arhitecturile big-endian includ IBM z / Architecture, Freescale ColdFire (care este bazat pe seria Motorola 68000), Atmel AVR32 și OpenRISC. Sistemele de operare IBM AIX și Oracle Solaris de pe Bi-endian Power ISA și SPARC rulează în modul big-endian; unele distribuții de Linux pe Power s-au mutat în modul little-endian.,

Bi-endiannessEdit

Unele arhitecturi (inclusiv BRAȚUL versiunile 3 și mai sus, PowerPC, Alfa, SPARC V9, MIPS, PA-RISC, SuperH SH-4 și IA-64) au o setare care vă permite pentru comutare endianness în date preia și magazine, instrucțiuni preia, sau ambele. Această caracteristică poate îmbunătăți performanța sau simplifica logica dispozitivelor de rețea și a software-ului. Cuvântul bi-endian, când se spune despre hardware, denotă capacitatea mașinii de a calcula sau de a transmite date în format endian.,

Multe dintre aceste arhitecturi pot fi comutate prin intermediul software-to-default pentru un anumit endian format (face de obicei atunci când computerul pornește în sus); cu toate acestea, în unele sisteme de default endianness este selectat de către hardware-ul de pe placa de baza si nu poate fi schimbat prin intermediul software-ului (de exemplu, Alpha, care se execută 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ă accesul la date., Instrucțiuni de accesări (preia de instruire cuvinte) pe un anumit procesor poate presupune, totuși, un fix endianness, chiar dacă accesează date sunt complet bi-endian, deși acest lucru nu este întotdeauna cazul, astfel ca pe Intel IA-64 bazate pe Itanium CPU, ceea ce permite atât.

rețineți, de asemenea, că unele procesoare nominal bi-endian necesită ajutor pentru placa de bază pentru a comuta complet endianness., De exemplu, 32-bit orientat spre desktop procesoare PowerPC în little-endian acționa ca little-endian din punct de vedere a executa programe, dar au nevoie de o placa de baza pentru a efectua un 64-bit swap pe toate 8 octet benzi pentru a se asigura că little-endian de a vedea lucrurile se vor aplica de I/O dispozitive. În absența acestui hardware neobișnuit al plăcii de bază, software-ul driverului de dispozitiv trebuie să scrie la diferite adrese pentru a anula transformarea incompletă și, de asemenea, trebuie să efectueze un schimb normal de octeți.,unele procesoare, cum ar fi multe procesoare PowerPC destinate utilizării încorporate și aproape toate procesoarele SPARC, permit alegerea endianness pe pagină.procesoarele SPARC de la sfârșitul anilor 1990 (procesoarele compatibile” SPARC v9″) permit alegerea endiannessului de date cu fiecare instrucțiune individuală care se încarcă sau se stochează în memorie.arhitectura ARM suportă două moduri big-endian, numite BE-8 și BE-32. Procesoarele până la ARMv5 acceptă numai modul BE-32 sau Word-Invariant., Aici orice acces aliniat natural pe 32 de biți funcționează ca în modul little-endian, dar accesul la un octet sau un cuvânt pe 16 biți este redirecționat către adresa corespunzătoare și accesul nealiniat nu este permis. ARMv6 introduce modul be-8 sau Byte-Invariant, unde accesul la un singur octet funcționează ca în modul little-endian, dar accesarea unui cuvânt pe 16 biți, 32 biți sau (începând cu ARMv8) pe 64 de biți duce la o schimbare de octet a datelor. Acest lucru simplifică accesul nealiniat la memorie, precum și accesul mapat la alte registre decât 32 bit.,multe procesoare au instrucțiuni pentru a converti un cuvânt într-un registru în endianitatea opusă, adică schimbă ordinea octeților într – un cuvânt de 16, 32 sau 64 de biți. Toate biți individuale nu sunt inversate, deși.procesoarele de arhitectură Intel X86 și x86-64 recente au o instrucțiune MOVBE (Intel Core din generația 4, După Atom), care preia un cuvânt în format big-endian din memorie sau scrie un cuvânt în memorie în format big-endian. Aceste procesoare sunt altfel bine puțin endian., De asemenea, ei au avut deja o serie de swap instrucțiuni pentru a inversa ordinea octet a conținutului registrelor, cum ar fi atunci când cuvintele au fost deja preluat de la locații de memorie în cazul în care acestea au fost în „greșit” endianness.deși procesoarele omniprezente x86 din ziua de azi folosesc stocarea little-endian pentru toate tipurile de date (integer, floating point), există o serie de arhitecturi hardware în care numerele în virgulă mobilă sunt reprezentate în formă big-endian, în timp ce numerele întregi sunt reprezentate în formă little-endian., Există procesoare ARM care au jumătate little-endian, jumătate big-endian reprezentare în virgulă mobilă pentru numere cu dublă precizie: ambele cuvinte pe 32 de biți sunt stocate în registrele întregi little-endian, dar cel mai semnificativ mai întâi. Deoarece au existat multe formate în virgulă mobilă fără reprezentare standard „rețea” pentru ele, standardul XDR folosește big-endian IEEE 754 ca reprezentare. Prin urmare, poate părea ciudat faptul că standardul larg răspândit IEEE 754 în virgulă mobilă nu specifică endianitatea., Teoretic, acest lucru înseamnă că chiar și datele standard în virgulă mobilă IEEE scrise de o mașină ar putea să nu poată fi citite de alta. Cu toate acestea, pe computerele standard moderne (adică implementarea IEEE 754), se poate presupune în practică că endianness este aceeași pentru numerele în virgulă mobilă ca și pentru numere întregi, făcând conversia simplă indiferent de tipul de date. (Sisteme încorporate mici, folosind formate speciale în virgulă mobilă poate fi o altă problemă cu toate acestea.,)

date cu lungime Variabilăedit

majoritatea instrucțiunilor considerate până acum conțin dimensiunea (lungimile) operanzilor săi în codul de operare. Lungimile operandului disponibile frecvent sunt 1, 2, 4, 8 sau 16 octeți.Dar există și arhitecturi în care lungimea unui operand poate fi ținută într-un câmp separat al instrucțiunii sau cu operandul însuși, de exemplu prin intermediul unei mărci verbale. O astfel de abordare permite operand lungimi de până la 256 octeți sau chiar dimensiunea memoriei complete.Tipurile de date ale acestor operanzi sunt șiruri de caractere sau BCD.,sistemul little-endian are proprietatea că aceeași valoare poate fi citită din memorie la lungimi diferite fără a utiliza adrese diferite (chiar și atunci când sunt impuse restricții de aliniere). De exemplu, un 32-bit locație de memorie cu conținut 4A 00 00 00 poate fi citit la aceeași adresă, fie ca 8-bit (valoarea = 4A), 16-bit (004A), 24-bit (00004A), sau 32-bit (0000004A), toate din care păstrează aceeași valoare numerică., Deși această proprietate puțin endiană este rar utilizată direct de programatorii de nivel înalt, este adesea folosită de optimizatori de cod, precum și de programatori de limbaj de asamblare.

În termeni mai concreți, cum ar optimizări sunt echivalentul următorul cod C se întoarce adevărat pe cel mai little-endian sisteme:

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

în Timp ce nu este permis de C++, astfel de tip de joc de cuvinte de cod este permis ca „punerea în aplicare definit” prin C11 standard și frecvent utilizate în cod care interacționează cu hardware-ul.,

Pe de altă parte, în unele situații, poate fi util să se obțină o aproximare a unei valori multi-octet sau multi-cuvânt prin citirea numai porțiunea sa cea mai semnificativă în loc de reprezentarea completă; un procesor big-endian poate citi o astfel de aproximare folosind aceeași adresă de bază care ar fi utilizată pentru valoarea completă.

optimizările de acest tip nu sunt portabile între sisteme de endianness diferite.

calcul orderEdit

unele operații în sistemele de numere poziționale au o ordine naturală sau preferată în care pașii elementari trebuie executați.,Această comandă poate afecta performanța acestora pe procesoare și microcontrolere adresabile cu octeți la scară mică.cu toate acestea, procesoarele de înaltă performanță aduc de obicei operanzi tipici multi-octet din memorie în același timp în care ar fi preluat un singur octet, astfel încât complexitatea hardware-ului nu este afectată de ordonarea octetului.

Operațiuni, începând de la cel mai puțin semnificativ digitEdit

învățate în școală, plus, scădere, înmulțire și începe de la cea mai puțin semnificativă cifră de poziție și propaga transporta ulterioare poziții cât mai importante.,Abordarea datelor din mai multe cifre la primul său octet (= cea mai mică adresă) este schema predominantă de adresare.Când acest prim octet conține cea mai puțin semnificativă cifră – care este echivalentă cu puțin endianness, atunci implementarea acestor operațiuni este marginal mai simplă.

operațiunile care încep de la cea mai semnificativă digitEdit

comparația și diviziunea încep de la cea mai semnificativă cifră și propagă o posibilă transportare la cifrele ulterioare mai puțin semnificative., Pentru valorile numerice cu lungime fixă (de obicei de lungime 1,2,4,8,16), punerea în aplicare a acestor operațiuni este marginal mai simplă pe mașinile big-endian.

Operanzi de diferite lengthEdit

În limbajul de programare C lexicografic comparare de șiruri de caractere trebuie să fie făcut de subrutine, care este frecvent oferit și implementat ca o subrutină (e. g. strcmp).multe procesoare big-endian conțin instrucțiuni hardware pentru compararea lexicografică a șirurilor de caractere de diferite lungimi (de exemplu, IBM System/360 și succesorii săi).,

Operațiuni fără impactEdit

normale de transport de date printr-o declarație de atribuire este în principiu independentă de endianness de procesor.sunt posibile numeroase alte ordine, numite generic middle-endian sau mixed-endian. Un astfel de exemplu în afara informaticii este formatarea standard a datei Americane a lunii/zilei/anului.

PDP-endianEdit

PDP-11 este, în principiu, un sistem mic-endian pe 16 biți., Instrucțiunile pentru a converti intre în virgulă mobilă și valori în opțional floating-point processor PDP-11/45, PDP-11/70, iar în unele mai târziu procesoare, stocate 32-bit „dubla precizie întreg lung” valorile cu 16-bit jumătăți a schimbat de așteptat little-endian. Compilatorul UNIX C a folosit același format pentru numere întregi lungi pe 32 de biți. Această comandă este cunoscută sub numele de PDP-endian.

Un mod de a interpreta acest endianness este că stochează un 32-bit integer ca două 16-bit cuvinte în big-endian, dar cuvintele ei înșiși sunt little-endian (E. g., „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-bit valorile se referă la valori numerice, nu lor reale layout.

Honeywell Series 16edit

calculatoarele Honeywell Series 16 pe 16 biți, inclusiv Honeywell 316, sunt opusul PDP-11 în stocarea cuvintelor pe 32 de biți în 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.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *