Endianness (Italiano)

HistoryEdit

Molti processori storici ed esistenti utilizzano una rappresentazione di memoria big-endian, esclusivamente o come opzione di progettazione. La rappresentazione della memoria Big-endian è comunemente indicata come ordine di rete, utilizzato nella suite di protocolli Internet. Altri tipi di processore usano la rappresentazione della memoria little-endian; altri usano ancora un altro schema chiamato “middle-endian”, “mixed-endian”o” PDP-11-endian”.

L’IBM System/360 utilizza l’ordine dei byte big-endian, così come i suoi successori System/370, ESA/390 e z / Architecture., Il PDP-10 utilizza anche l’indirizzamento big-endian per istruzioni orientate ai byte. Il minicomputer IBM Series/1 utilizza anche l’ordine dei byte big-endian.

Trattare con dati di diversa endianness è talvolta definito il problema NUXI. Questa terminologia allude ai conflitti di ordine dei byte incontrati durante l’adattamento di UNIX, che funzionava su mixed-endian PDP-11, a un computer big-endian IBM Series/1. Unix è stato uno dei primi sistemi a consentire la compilazione dello stesso codice per piattaforme con diverse rappresentazioni interne., Uno dei primi programmi convertiti doveva stampare Unix, ma sulla Serie/1 stampava invece nUxi.

Il Datapoint 2200 utilizza una semplice logica bit-seriale con little-endian per facilitare la propagazione del carry. Quando Intel ha sviluppato il microprocessore 8008 per Datapoint, hanno usato little-endian per la compatibilità., Tuttavia, poiché Intel non è stata in grado di fornire l ‘8008 in tempo, Datapoint ha utilizzato un equivalente di integrazione su scala media, ma la poca endianness è stata mantenuta nella maggior parte dei progetti Intel, inclusi l’MCS-48 e l’ 8086 e i suoi successori x86. Il DEC Alpha, Atmel AVR, VAX, la famiglia MOS Technology 6502 (tra cui Western Design Center 65802 e 65C816), lo Zilog Z80 (tra cui Z180 e eZ80), l’Altera Nios II, e molti altri processori e famiglie di processori sono anche little-endian.

Il Motorola 6800/6801, il 6809 e la serie di processori 68000 utilizzavano il formato big-endian.,

L’Intel 8051, contrariamente ad altri processori Intel, prevede indirizzi a 16 bit per LJMP e LCALL in formato big-endian; tuttavia, le istruzioni xCALL memorizzano l’indirizzo di ritorno nello stack in formato little-endian.

SPARC utilizzava storicamente big-endian fino alla versione 9, che è bi-endian; allo stesso modo i primi processori IBM POWER erano big-endian, ma i discendenti PowerPC e Power ISA ora sono bi-endian. L’architettura ARM era little-endian prima della versione 3 quando divenne bi-endian.,

Architetture attualimodifica

La serie di processori Intel x86 e AMD64 / x86-64 utilizza il formato little-endian. Altre architetture di set di istruzioni che seguono questa convenzione, consentendo solo la modalità little-endian, includono Nios II, Andes Technology NDS32 e Qualcomm Hexagon.

Alcune architetture di set di istruzioni consentono l’esecuzione di software di endianness su un’architettura bi-endian. Questo include ARM AArch64, C-Sky, Power ISA e RISC-V.,

Solo le architetture big-endian includono IBM z / Architecture, Freescale ColdFire (che è basata sulla serie Motorola 68000), Atmel AVR32 e OpenRISC. I sistemi operativi IBM AIX e Oracle Solaris su bi-endian Power ISA e SPARC funzionano in modalità big-endian; alcune distribuzioni di Linux su Power si sono spostate in modalità little-endian.,

Bi-endiannessEdit

Alcune architetture (incluse le versioni ARM 3 e successive, PowerPC, Alpha, SPARC V9, MIPS, PA-RISC, SuperH SH-4 e IA-64) dispongono di un’impostazione che consente l’endianness commutabile nei recuperi e nei negozi di dati, nei recuperi di istruzioni o entrambi. Questa funzione può migliorare le prestazioni o semplificare la logica dei dispositivi di rete e del software. La parola bi-endian, quando si parla di hardware, indica la capacità della macchina di calcolare o passare dati in entrambi i formati endian.,

Molte di queste architetture possono essere commutati via software per default ad uno specifico formato endian (di solito fatto quando il computer si avvia); tuttavia, su alcuni sistemi l’endianness predefinito è selezionato dall’hardware sulla scheda madre e non può essere modificato via software (ad esempio l’Alpha, che gira solo in modalità big-endian sul Cray T3E).

Si noti che il termine “bi-endian” si riferisce principalmente al modo in cui un processore tratta gli accessi ai dati., Gli accessi alle istruzioni (recuperi di parole di istruzioni) su un determinato processore possono ancora assumere una endianness fissa, anche se gli accessi ai dati sono completamente bi-endiani, anche se questo non è sempre il caso, come sulla CPU Itanium basata su IA-64 di Intel, che consente entrambi.

Si noti, inoltre, che alcune CPU nominalmente bi-endian richiedono l’aiuto della scheda madre per cambiare completamente endianness., Ad esempio, i processori PowerPC orientati al desktop a 32 bit in modalità little-endian agiscono come little-endian dal punto di vista dei programmi in esecuzione, ma richiedono alla scheda madre di eseguire uno swap a 64 bit su tutte le corsie a 8 byte per garantire che la visione little-endian delle cose si applichi ai dispositivi I/O. In assenza di questo insolito hardware della scheda madre, il software del driver di periferica deve scrivere a indirizzi diversi per annullare la trasformazione incompleta e deve anche eseguire un normale scambio di byte.,

Alcune CPU, come molti processori PowerPC destinati all’uso embedded e quasi tutti i processori SPARC, consentono la scelta di endianness per pagina.

I processori SPARC dalla fine degli anni 1990 (processori conformi a”SPARC v9″) consentono di scegliere l’endianness dei dati con ogni singola istruzione che viene caricata o archiviata in memoria.

L’architettura ARM supporta due modalità big-endian, chiamate BE-8 e BE-32. Le CPU fino a ARMv5 supportano solo la modalità BE-32 o Word-Invariant., Qui qualsiasi accesso a 32 bit naturalmente allineato funziona come in modalità little-endian, ma l’accesso a un byte o una parola a 16 bit viene reindirizzato all’indirizzo corrispondente e l’accesso non allineato non è consentito. ARMv6 introduce la modalità BE-8 o Byte-Invariant, in cui l’accesso a un singolo byte funziona come in modalità little-endian, ma l’accesso a una parola a 16 bit, 32 bit o (a partire da ARMv8) a 64 bit produce uno scambio di byte dei dati. Ciò semplifica l’accesso alla memoria non allineato e l’accesso mappato alla memoria a registri diversi da 32 bit.,

Molti processori hanno istruzioni per convertire una parola in un registro alla fine opposta, cioè scambiano l’ordine dei byte in una parola a 16, 32 o 64 bit. Tutti i singoli bit non sono invertiti però.

Le recenti CPU con architettura Intel x86 e x86-64 hanno un’istruzione MOVBE (Intel Core since generation 4, after Atom), che recupera una parola in formato big-endian dalla memoria o scrive una parola in memoria in formato big-endian. Questi processori sono altrimenti completamente little-endian., Avevano anche già una serie di istruzioni di swap per invertire l’ordine dei byte del contenuto dei registri, ad esempio quando le parole sono già state recuperate da posizioni di memoria in cui si trovavano nell’endianness “sbagliato”.

Floating pointEdit

Sebbene gli onnipresenti processori x86 di oggi utilizzino lo storage little-endian per tutti i tipi di dati (integer, floating point), ci sono un certo numero di architetture hardware in cui i numeri in virgola mobile sono rappresentati in forma big-endian mentre gli interi sono rappresentati in forma little-endian., Ci sono processori ARM che hanno metà little-endian, metà big-endian rappresentazione in virgola mobile per i numeri a doppia precisione: entrambe le parole a 32 bit sono memorizzate in little-endian come registri interi, ma il più significativo prima. Poiché ci sono stati molti formati in virgola mobile senza alcuna rappresentazione standard di “rete” per loro, lo standard XDR utilizza big-endian IEEE 754 come sua rappresentazione. Può quindi sembrare strano che il diffuso standard IEEE 754 a virgola mobile non specifichi endianness., Teoricamente, ciò significa che anche i dati in virgola mobile standard IEEE scritti da una macchina potrebbero non essere leggibili da un’altra. Tuttavia, sui moderni computer standard (ad esempio, implementando IEEE 754), si può in pratica supporre con sicurezza che l’endianness sia lo stesso per i numeri in virgola mobile come per gli interi, rendendo la conversione semplice indipendentemente dal tipo di dati. (Piccoli sistemi embedded che utilizzano speciali formati in virgola mobile possono essere un’altra questione tuttavia.,)

Variabile lunghezza dataEdit

La maggior parte delle istruzioni considerate finora contengono la dimensione (lunghezze) dei suoi operandi all’interno del codice operazione. Le lunghezze degli operando frequentemente disponibili sono 1, 2, 4, 8 o 16 byte.Ma ci sono anche architetture in cui la lunghezza di un operando può essere trattenuta in un campo separato dell’istruzione o con l’operando stesso, ad esempio per mezzo di un segno di parola. Tale approccio consente lunghezze di operando fino a 256 byte o anche la dimensione della memoria completa.I tipi di dati di tali operandi sono stringhe di caratteri o BCD.,

OptimizationEdit

Il sistema little-endian ha la proprietà che lo stesso valore può essere letto dalla memoria a lunghezze diverse senza utilizzare indirizzi diversi (anche quando vengono imposte restrizioni di allineamento). Ad esempio, una posizione di memoria a 32 bit con contenuto 4A 00 00 00 può essere letta allo stesso indirizzo di 8 bit (value = 4A), 16 bit (004A), 24 bit (00004A) o 32 bit (0000004A), che mantengono lo stesso valore numerico., Sebbene questa proprietà little-endian sia raramente utilizzata direttamente dai programmatori di alto livello, è spesso impiegata dagli ottimizzatori di codice e dai programmatori in linguaggio assembly.

In termini più concreti, tali ottimizzazioni sono l’equivalente del seguente codice C restituire true sulla maggior parte dei little-endian sistemi:

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

Mentre non è consentito per il C++, questo tipo costruito codice è permesso “attuazione definite” da C11 standard e comunemente utilizzato nel codice di interagire con l’hardware.,

D’altra parte, in alcune situazioni può essere utile ottenere un’approssimazione di un valore multi-byte o multi-parola leggendo solo la sua parte più significativa invece della rappresentazione completa; un processore big-endian può leggere tale approssimazione usando lo stesso indirizzo di base che verrebbe usato per il valore completo.

Ottimizzazioni di questo tipo non sono portabili su sistemi di diversa endianità.

Calcolo orderEdit

Alcune operazioni nei sistemi numerici posizionali hanno un ordine naturale o preferito in cui devono essere eseguiti i passaggi elementari.,Questo ordine può influire sulle loro prestazioni su processori e microcontrollori indirizzabili a byte su piccola scala.

Tuttavia, i processori ad alte prestazioni di solito recuperano gli operandi multi-byte tipici dalla memoria nello stesso periodo di tempo in cui avrebbero recuperato un singolo byte, quindi la complessità dell’hardware non è influenzata dall’ordinamento dei byte.

Operazioni che iniziano con la cifra meno significativamodifica

Come appreso a scuola, addizione, sottrazione e moltiplicazione iniziano con la posizione della cifra meno significativa e propagano il carry nella successiva posizione più significativa.,L’indirizzamento di dati a più cifre al suo primo byte (=indirizzo più piccolo) è lo schema di indirizzamento predominante.Quando questo primo byte contiene la cifra meno significativa-che equivale a poca endianness, allora l’implementazione di queste operazioni è marginalmente più semplice.

Operazioni a partire dalla cifra più significativamodifica

Il confronto e la divisione iniziano dalla cifra più significativa e propagano un possibile carry alle successive cifre meno significative., Per i valori numerici a lunghezza fissa (tipicamente di lunghezza 1,2,4,8,16), l’implementazione di queste operazioni è marginalmente più semplice su macchine big-endian.

Operandi di varia lunghezzamodifica

Nel linguaggio di programmazione C il confronto lessicografico delle stringhe di caratteri deve essere fatto da subroutine, che viene spesso offerto e implementato come subroutine (ad esempio strcmp).

Molti processori big-endian contengono istruzioni hardware per confrontare lessicograficamente stringhe di caratteri di lunghezza variabile (ad esempio IBM System / 360 e i suoi successori).,

Operazioni senza impattomodifica

Il normale trasporto di dati da un’istruzione di assegnazione è in linea di principio indipendente dalla endianness del processore.

Middle-endianEdit

Sono possibili numerosi altri ordini, genericamente chiamati middle-endian o mixed-endian. Uno di questi esempi al di fuori dell’informatica è la formattazione standard della data americana di mese/giorno/anno.

PDP-endianEdit

Il PDP-11 è in linea di principio un sistema little-endian a 16 bit., Le istruzioni per convertire tra valori in virgola mobile e interi nel processore in virgola mobile opzionale del PDP-11/45, PDP-11/70 e in alcuni processori successivi, memorizzavano valori “double precision integer long” a 32 bit con le metà a 16 bit scambiate dall’ordine little-endian previsto. Il compilatore UNIX C utilizzava lo stesso formato per interi lunghi a 32 bit. Questo ordine è noto come PDP-endian.

Un modo per interpretare questa endianness è che memorizza un intero a 32 bit come due parole a 16 bit in big-endian, ma le parole stesse sono little-endian (ad es., “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 …,

I valori a 16 bit qui si riferiscono ai loro valori numerici, non al loro layout effettivo.

Honeywell Series 16modifica

I computer Honeywell Series 16 a 16 bit, incluso l’Honeywell 316, sono l’opposto del PDP-11 nella memorizzazione di parole a 32 bit in 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.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *