# Assembly/Rappresentazione dati/Struttura binaria e organizzazione dei dati

Assembly
Copertina Tutti i moduli · Sviluppo
* IntroduzioneAssembly/Introduzione
** Perché non studiare l'AssemblyAssembly/Introduzione/Perché non studiare l'Assembly
** Perché studiare l'AssemblyAssembly/Introduzione/Perché studiare l'Assembly
* Rappresentazione datiAssembly/Rappresentazione dati
* Algebra Booleana
* Organizzazione di sistema (tanta noiosa teoria)
** Componenti base di sistema
** Il tempo del Sistema
** La famiglia 80x86
** Input/Output
* Organizzazione e accesso alla memoria
** Introduzione
** Organizzazione della memoria in un x86
** Organizzazione dei segmenti in un x86
** Indirizzi di memoria in un x86
** Registri di segmento in un x86
** Metodi di indirizzamento di un x86
** L'istruzione MOV
** Commenti finali sull'istruzione MOV
* ConvenzioniAssembly/Convenzioni
    Indice
Modifica il sommario
chiudi indice

## Struttura binaria

Matematicamente, ogni numero binario contiene un numero infinito di cifre (o bits che è la riduzione di binary digits). Per esempio il numero 5 (101) può essere rappresentato come:
| 101 | 0000101 | 0000000101 | 0000000101 |
Ecc… Ciascuno zero che precede il valore binario non cambia il valore del numero. Generalmente si ignorano gli zero precedenti il valore effettivo. Ed esempio 101b rappresenta 5, anche senza alcun zero che lo precede. Dal processore 80x86 si lavora con gruppi di 8 bits o 4 bits, quindi 101b diventa 0101b o 00000101b. Negli Stati Uniti, la maggior parte della gente separa i numeri con punti ogni tre cifre, per rendere più leggibile il numero. Per esempio 1.023.435.208 è più facile da leggere e comprendere che 1023435208. Una simile convenzione è utilizzata nel sistema binario. Separiamo ciascun gruppo di 4 bits con uno spazio. Per esempio, il valore binario 1010111110110010 verrà scritto 1010 1111 1011 0010. Per utilità si assegna un numero a ciascun bit che ne assegna la posizione in questo modo:
* Il bit all'estrema destra ha posizione 0.
* La posizione di ciascun bit a sinistra del primo dalla posizione del precedenti + 1
Un numero di 8 bit binario usa i valori da 0 a 7 per identificarne un determinato bit: x$_7$x$_6$x$_5$x$_4$x$_3$x$_2$x$_1$x$_0$ Un numero di 16 bit binario usa i valori da 0 a 15: x$_{15}$x$_{14}$x$_{13}$x$_{12}$x$_{11}$x$_{10}$x$_9$x$_8$x$_7$x$_6$x$_5$x$_4$x$_3$x$_2$x$_1$x$_0$

## Organizzazione dei dati

In matematica, un valore può occupare un numero arbitrario di bits. I Computer invece, lavorano con specifici gruppi di bits. Gruppi di bit comuni sono, gruppi di un solo bit, gruppi di 4 bits (nibbles), gruppi di 8 bit (bytes), gruppi di 16 bit (words), gruppi di 32 bit (double words), gruppi di 64 bit (quad words). Queste dimensioni non sono arbitrarie. C'è una ragione valida per questi valori particolari. Questa sezione descrive i gruppi di bit usati sull'Intel 80x86.

## Bits

La più piccola unità di informazione digitale è il bit. Un solo bit è capace di rappresentare due valori numerici (0 e 1). Potrai pensare che si possono rappresentare solo poche cose con un singolo bit. Non è vero!!! Esistono infiniti oggetti che si possono rappresentare con un solo bit. Con un solo bit, puoi rappresentare due elementi distinti. Per esempio:
Ma non per forza due oggetti distinti ed opposti. Possiamo rappresentare anche i colori rosso e blu, oppure i numeri 723 e 1245 o ancora gli oggetti "penna" e "scrivania". Tutto a nostra scelta.

## Nibbles

Un nibble è un gruppo di 4 bit. Viene utilizzato nel BCD (binary coded decimal) e per rappresentare una cifra esadecimale (ogni cifra esadecimale occupa 4 bit). Con un nibble possiamo rappresentare 16 diversi valori secondo la tabella del capitolo precedente.

## Bytes

Sicuramente, la più importante struttura di dati usata dal 80x86 è il byte. Un byte è composto da 8 bits, ed è la più piccola unità di informazione indirizzabile nel processore 80x86 (vedremo più avanti cosa significa). Le locazioni di memoria e gli indirizzi I/O sono tutti byte addressed. Questo significa che il valore più piccolo a cui si può accedere individualmente è il byte. Per accedere a dati più piccoli bisogna prendere tutto il byte che lo contiene e mascherare i bit che non vogliamo. I bits sono normalmente numerati da 0 a 7 come già detto. La struttura di un byte comprende 8 bits:
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Il bit 0 è il low bit o bit meno significativo, il bit 7 è lo high bit o bit più significativo. Per ogni byte sono inclusi in esso 2 nibble: Lo High Nibble (in azzurro) e il Low Nibble (in arancione). I bit dallo 0 al 3 formano il Low Nibble mentre quelli dal 4 al 7 lo High Nibble. Siccome in un nibble entra una cifra esadecimale, in un byte entreranno 2 cifre esadecimale. Siccome un byte contiene 8 bit, può rappresentare 2$^8$ (256) valori diversi. Generalmente viene utilizzato per rappresentare numeri senza segno (da 0 a 255) o con segno (da -128 a +127) (vedi "Numeri con e senza segno"), per rappresentare codici di carattere ASCII/IBM, o altri dati speciali che non richiedono più di 256 valori. Molti tipi di dati hanno meno valori di 256, quindi spesso un byte è sufficiente.

## Words

Una word è un gruppo di 16 bit (o 2 byte o 4 nibble). I bit vengono numerati da 0 a 15. Come il byte viene diviso in due parti: Low Byte e High Byte. Può essere diviso anche in 4 nibble. Con 16 bit possiamo rappresentare 2$^{16}$ (65536) differenti valori. Quindi numeri da 0 a 65535 o da -32768 a +32767, o qualunque tipo di dati con non più di 65536 valori. L'uso più frequente delle word è la rappresentazione di numeri interi.

## Double Words

Una double word è un gruppo di 32 bit (o 2 word o 4 byte o 8 nibble). I bit vengono numerati da 0 a 31. Può essere diviso in Low Word e High Word, in 4 byte o in 8 nibble. Possiamo rappresentare 2$^{32}$ (4.294.967.296) valori diversi . Possiamo rappresentare numeri da 0 a 4.294.967.295 o da -2.147.483.648 a +2.147.483.647.

## Quad Words

Una quad word è un gruppo di 64 bit (o 2 double word o 4 word o 8 byte o 16 nibble). I bit vengono numerati da 0 a 63. Può essere diviso in Low double word e in High double Word, in 4 Word, in 8 byte o in 16 nibble. Possiamo rappresentare 2$^{64}$ (18.446.744.073.709.551.616) valori. Possiamo rappresentare numeri da 0 a 18.446.744.073.709.551.615 o da -9.223.372.036.854.775.808 a +9.223.372.036.854.775.807