# Assembly/Rappresentazione dati/Operazioni aritmetiche

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
Come nel sistema decimale, anche nei sistemi binario ed esadecimale, possiamo svolgere le 4 operazioni aritmetiche di base. Non occorre essere esperti in queste operazioni, basta saperle usare in caso di necessità. Ad ogni modo esiste la calcolatrice predefinita di gNewSense o la calcolatrice di Windows, che impostata in modalità scientifica, ci permetterà di scegliere la base del sistema scelto ed effettuare le operazioni semplicemente.

## Addizione binaria

Quanto fa 11001010b + 01011000b? Come nel sistema decimale, l'operazione si svolge così:
Partendo da destra si sommano i primi due numeri. Se come risultato danno 0, si lascia uno 0. Se come risultato danno 1, resta ancora 1, ma se invece danno come risultato 2, che nel sistema binario non esiste (al limite esiste 10b), il risultato sarà 0, con riporto 1. Semplice no?

## Sottrazione binaria

Come per l'addizione, anche la sottrazione si svolge allo stesso modo.
Partendo da destra si esegue la differenza dei primi due numeri. Se la sottrazione è 0 - 0, si scrive 0, se invece è 1 - 0, si lascia ancora 1, se ancora, 1 - 1, si scrive 0. Altrimenti nel caso di 0 - 1, si chiede prestito alla cifra a sinistra. Proprio come nella sottrazione decimale.
ATTENZIONE: prima di eseguire una sottrazione controllare che il primo membro della sottrazione sia maggiore del secondo.
Esiste tuttavia un metodo semplificato, ed è attualmente il metodo usato dalle ALU dei microprocessori in quanto è più facile da implementare e supporta nativamente il calcolo con interi negativi.
Prima di spiegarlo è utile soffermarsi su una seguente considerazione: Dato un numero x (mettiamo 15) chiameremo "complemento in base 10 di x" la differenza tra la potenza di 10 appena più grande di x (cioè 100) e x, ovvero 100 - 15 = 85. Supponiamo di dover effettuare la differenza tra 74 e 15 (= 59). Anziché effettuare la sottrazione, aggiungiamo a 74 il complemento calcolato poco prima: 74 + 85 (= 159). A questo punto si sottrae al risultato la potenza di 10 all'inizio: 159 - 100 = 59. Si è quindi ottenuto lo stesso risultato che si sarebbe ottenuto con la sottrazione classica.
La dimostrazione algebrica è molto semplice:
Siano dati due numeri $x,y\in N$. Sia $b$ la base del sistema di numerazione considerato, e sia $b^{n}$ il primo numero $\geq y$.
Si calcoli il complemento di $y$: $(b^{n}-y)$.
Perciò: $x+(b^{n}-y)-b^{n}=x-y$
Ci si potrebbe chiedere perché sfruttare il discorso del complemento per la sottrazione, data la apparente difficoltà del calcolo del complemento. La risposta è che, nonostante le apparenze, il metodo del complemento è più semplice.
Supponiamo ancora di voler calcolare 74 (01001010) - 15 (00001111)
Calcolare il complemento, stavolta a 2, di 15 è semplicissima e si può calcolare in vari modi, qui mostriamo il più semplice (che è anche il più veloce).
Il complemento di un numero in base due diventa semplice non appena ci si accorge che per ottenere la potenza successiva basta aggiungere uno zero a destra. Ovvero: un 1 e poi il numero 15 in binario:
Dato che il primo numero è più piccolo del secondo basta aggiungere tanti zeri quanti bastano per superare 15:
Una volta trovata la potenza si dovrebbe fare la differenza col classico metodo: 00010000 - 00001111 (= 00000001). Ma noi non faremo così. In realtà il calcolo è molto più semplice quando ci si accorge che in realtà lo stesso risultato si ottiene invertendo ogni cifra del secondo numero (cioè passare da 0 a 1 e viceversa) a partire dal primo 1, e aggiungere 1:
Non ci si preoccupi del fatto che ci sono tutti quegli 1, saranno utili dopo.
Come ulteriore esempio mostriamo il complemento di 178 (10110010):
1011 0010 -> 0100 1101 -> 0100 1110 256 - 178 = 78 (0100 1110).
Ritornando al calcolo originale, 74 - 15, facciamo 74 + compl2(15):
0 0 1 0 0 1 0 1 0 +
0 1 1 1 1 0 0 0 1 =
1 0 0 1 1 1 0 1 1
Si scartino le ultime due cifre del risultato e si ottiene: 0011 1011 = 59. Quindi si è ottenuto lo stesso risultato.
Sommarizzando:
* Prendere il sottraendo.
* Invertire tutte le sue cifre e aggiungere 1
* Sommare il minuendo al complemento appena calcolato
* Togliere le due cifre più significative se si sa che il risultato è positivo, altrimenti no
Altri due esempi: 110 - 22 = 88
0110 1110 - 0001 0110 ->
11101 1000 -> XX101 1000 (88)
22 - 100 = -88
0001 0110 - 0110 1110 ->
0001 0110 - 1001 0010 =
1010 1000 (sarebbe 328, ma dato che il bit più significativo è impostato a 1 allora il numero è negativo. Calcolo del complemento del risultato)
1010 1000 -> 0101 1000 (88). Ergo, 1010 1000 è uguale a -88

## Moltiplicazione binaria

Anche la moltiplicazione non presenta grandi difficoltà:
Si moltiplica per ogni termine del moltiplicatore, a partire da destra, tutti i termini del moltiplicando, spostando per ciascun termine del primo di una cifra a sinistra. Alla fine si sommano i risultati.

## Divisione binaria

Questa è la più difficile delle operazioni binarie. Per prima cosa, bisogna capire, che in binario, non esistono cifre dopo la virgola. Quindi deve essere sempre una divisione esatta.
Si procede in questo modo:
* Si convertono i valori in decimale.
* Si esegue la divisione decimale.
* Si trasforma il risultato in binario.
In alternativa si può procedere col "vero e proprio" metodo, più complicato
Si provi a dividere 93 per 13. Trascriviamoli in binario, togliendo gli zeri più a sinistra:
Si procede così: si prendono tante cifre del dividendo a partire da sinistra quante sono quelle del divisore (4). Si scrivano sotto quelle cifre il divisore. Se il divisore è più grande di quelle quattro cifre si scrive uno 0 nel quoto e si fa scendere un'altra cifra, altrimenti, come si farebbe per una normale divisione decimale, si faccia la sottrazione. Poi, si fa scendere una cifra e così via:
Si è ottenuto 111 (7) di quoto e 10 (2) di resto. Infatti 93/13 = 7; 13 * 7 = 91; 91 + 2 = 93

## Addizione esadecimale

Su questo tipo di addizione, dovremo farci un po' l'abitudine. Quanto fa:
La vostra risposta sarà immediatamente 10h. Sbagliato!!! Ricordate che in esadecimale, si contà in questo modo:
0 1 2 3 4 5 6 7 8 9 A B C D E F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 ecc... Quindi quando si addizionano 9h e 1h il risultato sarà 0Ah.

## Sottrazione esadecimale

Lo stesso problema lo abbiamo qui:
9h? Sbagliato. 10h - 1h da come risultato 0Fh. Questi sono gli errori più facili da commettere quando si eseguono addizioni e moltiplicazioni esadecimali.

## Moltiplicazione esadecimale

Ovviamente il metodo sarebbe quello delle operazioni in binario e decimale, ma in questo caso, dovrete imparare le tabelline della A, della B della C ecc... Alquanto sconveniente.... La cosa migliore in questo caso è avere una calcolatrice a portata di mano. Così come per la divisione.