Newsgroup: it.comp.os.linux.development
Titolo: little endian e big endian

scusate se forse non è proprio IT il messaggio, ma avrei una domanda da
porvi sui processori little e big endian.
I processori big endian se voglio scrivere una stringa in memoria me la
scrivono "dritta", giusto? E i little endian la rovesciano? E come
funziona per i numeri?
Sto entrando in una crisi mistica senza destra nè sinistra. Aiutatemi
per piacere.
-- 
Non c'è più forza nella normalità, c'è solo monotonia.

 funziona per i numeri?
Il problema si pone coi numeri (interi), non con le stringhe: di un
intero a 16 bit un'architettura big endian scrive in memoria il byte
piu` significativo in una cella e quello meno significativo nella cella
successiva, mentre una little endian fa il contrario. Similmente per gli
interi piu` lunghi di 16 bit.
Ciao
 David
-- 
<d.santinoli presso mi. flashnet. it>

I processori Intel sono little endian( col nuovo processore a 64 bit
dovrebbe essere possibile usare entrambi i metodi), i MIPS big endian.....
Comunque, a meno di fare opeazioni byte a byte, non devi startene a
preroccupare molto...
--
Marco Iannaccone     
marc...@tin.it
ICQ: 18748121           Tolkien
"I've... seen things you people wouldn't believe. Attack ships on fire off
the shoulder of Orion.
I watched C-beams... glitter in the dark near the Tanhauser Gate. All
those... moments will be lost... in time..., like... tears... in... rain."
"David Santinoli" <sant...@aidi.milano> ha scritto nel messaggio
news:3A0D9501...@aidi.milano...


 preroccupare molto...
peccato che devo capirlo bene per l'università.....


 
Da un estratto di un "pippone" che ho scritto tempo fa:
L'endianess si riferisce all'ordinamento dei bit, si dicono big-endian
quei
processori che (indipendentemente dal numero di bit) mettono il bit piu'
significativo in "alto", little-endian se lo mettono in "basso"; alto e
basso
qui stanno a significare che in genere, rispetto a come scrivereste un
numero
binario su un foglio di carta, i big-endian lo fanno come voi, i
little-endian
lo scrivono alla rovescia.
Per informazione ulteriore sono big-endian i processori motorola, sparc,
HP
(in sostanza tutti eccetto i processori Digital e quelli compatibili
Intel). E' big-endian anche il modo in cui i bit vengono inviati sulla
rete
(cioe' vi arriva prima il bit piu' significativo); invece e'
little-endian il
modo in cui i bit girano sul bus PCI (mentre e' big-endian sul VME).
Cosa comporta tutto questo nel campo dei processori? Fintanto che si
usano
processori e bus che usano lo stesso ordinamento un bel niente, tutto
viene
visto allo stesso modo e la rappresentazione e' puramente interna, i
problemi
saltano fuori quando si fanno dialogare ordinamenti diversi.
In realta' comunque quando avete un PC collegato in rete (poiche' la
rete e'
big-endian) gia' ve ne accorgete, per cui ad esempio se volete indicare
una
porta a un socket dovete usare una funzione di conversione come htons.
Questo perche' l'intel essendo little-endian, quando scrive un intero
mette
prima i bit meno significativi; quindi quando trasferisce i 15 bit di
uno
short manda prima il byte meno significativo e poi il piu'
significativo, ma
nei pacchetti TCP e UDP l'ordinamento dei bytes e' big-endian e quindi
ci
vuole prima il byte piu' significativo e poi il meno significativo (l'ho
scoperto a mie spese quando ho scritto il server per la visualizzazione
degli
eventi).
Lo stesso accade se scrivete un file binario su un PC e lo rileggete su
un MAC
(o una sparc); gli ascii non han problemi dato che sono bytes, ma se ad
esempio avere un waw (che contiene campionamenti a 16 bit) vi trovereste
i
bytes arrovesciati (un esadecimale ABCD diventerebbe CDAB, coi 32 bit
avreste
ancora piu' casino del tipo 0123ABCD->CDAB2301). La cosa la potete
toccare con
mano se salvate un file binario su intel scrivendo short e andate a
rileggere
char.
Pardon per la lunghezza.
Ciao
-- 
Simone Piccardi
Microsoft is NOT the answer. Microsoft is the Question.
The answer is: "NO!"

funziona per i numeri?
La cpu intel scrive le word (numeri, siamo a livello di cpu;-) ) cosi`:
numero che si vuole immettere:
a1 b2 = 1010 0001  1100 0010 (=41394)
numero scritto in memoria, anche disco fisso:
b2 a1 = 1100 0010  1010 0001
Analogamente le dword:
a1 b2 c3 d4 --> d4 c3  b2 a1
Attento che se non fosse dword, allora sarebbe:
a1 b2 c3 d4 --> b2 a1 d4 c3 !!;-))
sempre che fossero word;-))) se no, se i dati fossero byte, sarebbero
tali e quali:
a1 b2 c3 d4 --> a1 b2 c3 d4 :-))))))))))))
le cifre dei byte infatti non vengono mai invertite (registri a byte). 
Infatti ti prendi fregature leggendo ad esempio i boot record del dos:
per il numero di byte per settore (word): 00 02-->0x200=512, all'offset
0x0b del settore zero (BPB). Altro esempio e` il magic number aa 55 che
invece, essendo word, e` scritto 55 aa alla fine di ogni boot record.
Spero di non aver detto troppe cavolate perche' e` facile andare in
tilt, cmq guarda /usr/include/endian.h, ma trovi molto nei doc di nasm
e penso (ma non ricordo) di gcc, sempre per l'assembly.
-- 
Ci sentiamo  |  Remigio Zedda    
remi...@tiscalinet.it
ciao Remigio |
-------------|      ..si` d'accordo.. ma con la Deb e` un'altra cosa!
/* Linux 2.2.17 su Debian 2.2 Potato */

 lo scrivono alla rovescia.
alora, vediamo se ho capito giusto:
Supponiamo che a partire dall'indirizzo 0x1000 io ho la stringa "Io"
(due byte)
Poi con un motorla mi faccio
MOVE.W 1000, D0
e mi trovo con in mezzo registo i bit 0100100101101111 giusto?
e  se inceve  io  lo  faccio andare  su  un  intel ho  1111011010010010 
(cioč  tutto storto  come se  fosse allo  specchio)? Oppure  mi ritrovo 
con  1001001011110110(con solo  i contenuti  dei singoli  byte girati)? 
Oppure  con i  byte che  hanno i  bit "dritti  ma scritti  storti, cioč 
0110111101001001? (che bello dare i numeri..... :-) )
Inoltre, dubbio  idiota, nei little  endian č tuto scritto  storto, sia 
registri che ram?  O ci sono delle cose dritte  e delle altre rovescie. 
Lo so, la domanda č idiota, ma  non riesco a capire come si scrivono le 
stringhe coi little endian, e giovedě ho il compitino....               
Il problema  č che danno  degli esercizi in  cui dicono che  da qualche 
parte in memoria c'č una stringa. Poi se ne spostano dei pezzi nei vari 
registri e poi  iniziano a fare dei giochini con  le varie istruzioni e 
alla fine chiedono cosa c'č in  un registro. Ora, nel motorla ho capito 
come funziona la cosa, ma con i little endian non tanto....             
-- 
Non c'č piů forza nella normalitŕ, c'č solo monotonia.


lo stesso vale anche per i float e i double
ciao

 --
dal punto di vista di un processore un carattere č solo e soltanto un
byte.... cioč, il fatto che qualcosa del tipo 0x41 sia un carattere (la "A"
del codice ASCII) č solo e soltanto una nostra (nel senso di esseri
umani...) convenzione;
va da se che la stringa "AB" (sequenza di 2 byte 0x41 e 0x42) viene vista
come una word;
se tale stringa č memorizzata in memoria a partire da un indirizzo
specifico, come nella tabellina qui sotto
0x80000000: 0x41
0x80000001: 0x42
secondo un processore little endian (es intel pentium), se carico in un
registro la word in 0x80000000 ottengo di aver caricato il numero 0x4241; se
invece lo stesso lavoro lo faccio con un processore big endian (es. motorola
68k) caricherň nel registro il valore 0x4142;
in altre parole, il big/little endian č solo una convenzione di come leggere
una grandezza su piů bytes: c'č chi ritiene opportuno di leggere dal byte
meno significativo e chi invece ritiene giusto iniziare a trattare il byte
piů siginificativo (un po come fanno gli arabi che, a differenza di noi,
leggono da destra a sinistra....)
all'interno del processore, trattandosi di registri, non esiste piů alcun
concetto di big/little endian, dal momento che il registro non č
scomponibile in sotto-indirizzi (se mi passi il gioco di parole...) a meno
di istruzioni specifiche (es. i registri AX, AL, AH dei processori x86
intel) ma in quel caso il significato di quello che si vuole ottenere č
chiaro;
spero di non averti confuso troppo le idee...
ciao

 Per informazione ulteriore sono big-endian i processori motorola
Non tutti. I PowerPC sono configurabili via software.


 lo stesso vale anche per i float e i double
Vero, ma per i floating point oltre a LE/BE vanno considerate le
differenze nei formati binari. Un'architettura BE potrebbe trovare
illeggibile un float di un'altra BE perche' la prima usa la codifica
IEEE e la seconda no.


 IEEE e la seconda no.
ah sì? lo standard ieee non è lo stesso?


 ah sě? lo standard ieee non č lo stesso?
E` assai diffuso, ma non e` detto che tutti lo seguano.
