# Assembly/Rappresentazione 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

## Introduzione

Probabilmente il più grande ostacolo che la maggior parte dei principianti incontra quando prova ad imparare l'Assembly è l'uso comune del sistema binario ed esadecimale. È vero che i numeri hex (esadecimali) sono un po' differenti da quelli che utilizziamo comunemente (decimale), i loro vantaggi superano largamente i loro svantaggi. Tuttavia, bisogna capire questi sistemi di numerazione perché sono importanti nell'informatica.

## Sistemi di Numerazione

I moderni computer non rappresentano i valori numerici usando il sistema decimale. Generalmente, usano il sistema binario. Per capire le limitazioni dell'aritmetica informatica, devi capire come un computer rappresenta i numeri.

## Il sistema decimale

Hai usato il sistema decimale (in base 10) così a lungo che probabilmente lo hai preso per definitivo. Quando vedi un numero come "123", non pensi al valore 123; generalmente, generi un'immagine mentale di quanti elementi rappresenta il numero. In realtà, comunque, il numero 123 rappresenta: 1 * 10$^2$ + 2 * 10$^1$ + 3 * 10$^0$ Oppure: 100 + 20 + 3 Ciascuna cifra a sinistra della virgola, rappresenta un valore compreso tra 0 e 9 moltiplicato per una potenza di 10 il cui esponente aumenta man mano che ci si allontana dalla virgola. Ciascuna cifra a destra della virgola, rappresenta un valore compreso tra 0 e 9 moltiplicato per una potenza di 10 il cui esponente (negativo) diminuisce man mano che ci si allontana dalla virgola. Per esempio, il numero 123,456 indica: 1 * 10$^2$ + 2 * 10$^1$ + 3 * 10$^0$ + 4 * 10$^{-1}$ + 5 * 10$^{-2}$ + 6 * 10$^{-3}$ Oppure: 100 + 20 + 3 + 0.4 + 0.05 + 0.006

## Il sistema di numerazione binario

I computer moderni (tra cui i PC IBM) operano usando la logica binaria. Il computer rappresenta i valori utilizzando due tensioni (generalmente 0 V e 5 V); due tensioni perché ogni bit rappresenta un passaggio di corrente all'interno del computer. Con due tensioni possiamo rappresentare due valori differenti. Questi possono essere qualunque valori diversi, ma per convenzione si utilizzano i valori 0 e 1. Questi due valori, casualmente, corrispondono alle due cifre usate nel sistema binario.

## Come funziona il sistema binario

Il sistema binario lavora esattamente come quello decimale, con due eccezioni: il binario accetta solo le cifre 0 e 1 (diversamente dal decimale le cui cifre vanno dallo 0 al 9), e il binario utilizza per rappresentare i numeri, potenze di 2 anziché di 10. È quindi molto facile trasformare cifre binarie in decimale. Per ciascun "1" nel numero binario, sommare 2$^n$ dove "n" è la posizione della cifra partendo da destra. Per esempio, il valore binario 11001010$_2$ rappresenta: 1 * 2$^7$ + 1 * 2$^6$ + 0 * 2$^5$ + 0 * 2$^4$ + 1 * 2$^3$ + 0 * 2$^2$ + 1 * 2$^1$ + 0 * 2$^0$ = 128 + 64 + 8 + 2 = 202$_{10}$ Convertire da decimale a binario è più difficile. Si devono trovare le potenze di due, che sommate, producono il risultato decimale. Consideriamo il valore decimale 1359:
* 2$^{10}$ = 1024, 2$^{11}$ = 2048. Quindi 1024 è la potenza di due più grande minore di 1359. Sottraiamo 1024 da 1359 e scriviamo a sinistra del valore binario "1". Risultati: binario = "1" decimale = 1359 - 1024 = 335.
* La seconda potenza di due minore di 1359 è 2$^9$. Siccome 2$^9$ è maggiore di 355 (2$^9$ = 512) scriviamo 0 alla seconda cifra del numero binario. Risultati: binario = "10" decimale = ancora 335
* La successiva potenza è 2$^8$ (256), ed è minore di 335. Eseguiamo la sottrazione 335 - 256 = 79 e aggiungiamo 1 al valore binario. Risultati: binario = "101" decimale = 79
* 128 (2$^7$) è maggiore di 79, quindi aggiungiamo 0 al binario e il decimale resta uguale. Risultati: binario = "1010" decimale = ancora 79
* 64 (2$^6$) è minore di 79, quindi aggiungiamo 1 al binario e il decimale diventa 79 - 64 = 15. Risultati: binario = "10101" decimale = 15
* 32 (2$^5$) è maggiore di 15, quindi aggiungiamo 0 al binario e il decimale resta uguale. Risultati: binario = "101010" decimale = 15
* 16 (2$^4$) è maggiore di 15, quindi aggiungiamo 0 al binario e il decimale resta uguale. Risultati: binario = "1010100" decimale = 15
* 8 (2$^3$) è minore di 15, quindi aggiungiamo 1 al binario e il decimale diventa 15 - 8 = 7. Risultati: binario = "10101001" decimale = 7
* 4 (2$^2$) è minore di 7, quindi aggiungiamo 1 al binario e il decimale diventa 7 - 4 = 3. Risultati: binario = "101010011" decimale = 3
* 2 (2$^1$) è minore di 4, quindi aggiungiamo 1 al binario e il decimale diventa 4 - 2 = 2. Risultati: binario = "1010100111" decimale = 2
* 1 (2$^0$) è minore di 2, quindi aggiungiamo 1 al binario e il decimale diventa 2 - 1 = 1. Risultati: binario = "1010100111" decimale = 1
* Se il numero decimale di partenza è pari aggiungere 0 al binario "10101001110", nel nostro caso è dispari quindi diventa "10101001111" aggiungendo un 1 al binario.
Il sistema binario ha poca importanza negli HLLs, ma nell'Assembly è ovunque.

## Sistema di numerazione esadecimale

Un gran problema con il sistema binario è la lunghezza. Per rappresentare il valore 202$_{10}$ abbiamo bisogno di 8 cifre. Con il sistema decimale invece abbiamo bisogno di solo 3 cifre decimali e, quindi, con il sistema decimale, possiamo rappresentare numeri molto complessi con un minor numero di cifre, più compatti. Quando si lavora con numeri complessi, il sistema binario diventa subito poco facile da usare. Sfortunatamente, i computer pensano solo in binario, quindi, la maggior parte delle volte è utile usare il binario. Anche se possiamo convertire decimali in binari e viceversa, la conversione è un'operazione insignificante. Il sistema esadecimale (base 16) risolve questo problema. Il sistema esadecimale ci offre due funzionalità che stavamo cercando: i suoi numeri sono molto compatti, e sono semplici da convertire in binari e viceversa. Per questo motivo, molti computer utilizzano anche il sistema esadecimale. Siccome la base del sistema esadecimale è 16, ciascuna cifra esadecimale, ogni numero a sinistra della virgola rappresenta un valore moltiplicato per una potenza di 16. Per esempio, il numero 1234$_{16}$ è uguale a:
1 * 16$^3$ + 2 * 16$^2$ + 3 * 16$^1$ + 4 * 16$^0$
Oppure:
4096 + 512 + 48 + 4 = 4660$_{10}$ rappresenta:
Ogni cifra esadecimale può rappresentare uno dei sedici valori tra 0$_{10}$ e 15$_{10}$. Siccome esistono solo 10 cifre decimali, abbiamo bisogno di inventare 6 cifre addizionali per rappresentare i valori da 10$_{10}$ a 15$_{10}$. Così abbiamo creato altri simboli per queste cifre, usiamo le lettere da A a F. Questi sono esempi di numeri esadecimale validi:
| 1234$_{16}$ | DEAD$_{16}$ | BEEF$_{16}$ | 0AFB$_{16}$ | FEED$_{16}$ | DEAF$_{16}$ |
Siccome abbiamo spesso bisogno di inserire numeri esadecimali nei computer, abbiamo bisogno di meccanismi diversi per rappresentare i numeri esadecimale. Dopotutto, i computer non possono capire che base stiamo usando dal valore. Si usa questa convenzione:
* Tutti i numeri (qualunque sia la base), cominciano con una cifra decimale. (nel caso il numero dovesse cominciare con una lettera, si antepone "0" per non alterare il valore del numero)
* Tutti i numeri esadecimali finiscono con la lettera "h", per esempio 0B7A4h.
* Tutti i numeri binari finiscono con la lettera "b", per esempio 10001011b
* Tutti i numeri decimali dovrebbero terminare con "t" o "d", generalmente d, per esempio 125d. Quest'ultima regola è opzionale. La maggior parte degli assemblatori, se non trovano l'identificatore, rendono il numero come decimale
Esempi di numeri esadecimali validi:
| 1234h | 0DEADh | 0BEEDh | 0AFBh | 0FEEDh | 0DEAFh |
Come puoi notare, I numeri esadecimali sono compatti e facili da leggere. Inoltre, si possono convertire facilmente in binario e decimale. Guarda questa tabella:
Questa tabella fornisce tutte le informazioni di cui hai bisogno per convertire un esadecimale in binario e viceversa. Per convertire un numero esadecimale in binario, devi semplicemente sostituire ogni cifra con il suo corrispondente binario. Per esempio, per convertire 0ABCDh in binario, dobbiamo semplicemente scambiare ogni cifra con il suo corrispondente nella tabella:
Il risultato della conversione è: 0ABCDh = 1010101111001101b. Da qui possiamo trasformarlo semplicemente in decimale. Per convertire un numero binario in esadecimale è altrettanto facile. Il primo passo è riempire l'estrema sinistra di 0 finché il numero di cifre non sarà divisibile per 4. Per esempio 1011001010b (10 cifre), deve diventare 001011001010 (12 cifre, divisibile per 4). Il prossimo passo e separare le cifre in gruppi di 4 bits. Quindi continuando il nostro esempio diventa 0010 1100 1010. Infine dobbiamo sostituire ogni gruppo con il suo corrispondente esadecimale nella tabella. Quindi il nostro binario diventerà 2CAh. Nota la differenza di difficoltà rispetto alla conversione tra binario e decimale e tra decimale e esadecimale! Siccome la conversione tra binario e esadecimale è un'operazione che dovremo svolgere molte volte, è bene memorizzare la tabella sopra. Se hai una calcolatrice che effettua la conversione (come quella di Windows), troverai che la conversione manuale è molto conveniente e più veloce quando si trasformano binari e esadecimali