PROGRAMMAZIONE IN ASSEMBLY

Sistemi di Numerazione & Elementi di Logica


Questi file sono protetti dal diritto d'autore e sono liberamente
riproducibili a condizione di non farne uso comemrciale o economico o per
fine di lucro senza la preventiva autorizzazione dell'autore. In ogni caso
deve sempre essere indicato il nome dell'autore e il suo indirizzo. Ogni
altra modalita' di utilizzo deve considerarsi contraria alla volonta'
dell'Autore.


Ogni buon programmatore dovrebbe conoscere almeno 2 sistemi di numerazione oltre
quello decimale imparato (?) alle scuole elementari.
Bene gli altri due sono il sistema BINARIO e quello ESADECIMALE.
Il sistema di numerazione binario è particolarmente legato ai calcolatori in
quanto essi possono riconoscere solo segnali aventi due valori : uno alto e uno
basso ; per cui si associa al valore alto la cifra binaria 1 e a quello basso la
cifra binaria 0.
Infatti nel sistema binario esistono solo due cifre 0 e 1 appunto e i numeri ma
anche tutte le altre informazioni vengono rappresentati con sequenze di Zeri e
di Uni.
Il sistema di numerazione binario è ancora un sistema posizionale come quello
decimale, cosa vuol dire: consideriamoli numero decimale 237 , esso può essere
scomposto in questo modo:

237 = 2 * 10^2 + 3 * 10^1 + 7 * 10^0

ossia le cifre del numero vengono moltiplicate per le potenze di dieci (da cui
decimale) crescenti da destra verso sinistra. I numeri binari vengono costruiti
nello stesso modo solo che invece di potenze di 10 si usano le potenze di 2,
quindi considerando il seguente numero binario, scomponendolo ed effettuando i
calcoli si ottiene il corrispondente numero decimale :

11010010 = 1*2^7 + 0*2^6 + 1*2^5 + 0*2^4 + 0*2^3 + 0*2^2 + 1*2^1 + 0*2^0
= 210

Ora che abbiamo visto la conversione Base 10 --> Base 2 vediamo come si
effettua l'operazione inversa.
L'algoritmo è abbastanza semplice :

1 - Si divide la cifra decimale per 2
2 - Se il quoziente è pari si scrive 0 se è dispari 1
3 - Si divide il quoziente ancora per 2 e si ripete il passo 3
4 - La sequenza ottenuta RIBALTATA è la rappresentazione binaria del
numero decimale

Vediamolo applicato al numero decimale 145 (questo S lo schema che di solito si
utilizza):
145 |
72 | 1 ( cifra - significativa )
36 | 0
18 | 0
9 | 0
4 | 1
2 | 0
1 | 0
0 | 1 (cifra + significativa )

Quindi 145 in base 10 equivale a 10010001 in base 2. Semplice vero ??
NOTA: Una cosa da notare è che con N cifre binarie possiamo rappresentare tutti
i numeri da 0 fino a 2^N-1.

Ora che abbiamo conosciuto i numeri in base 2 andiamo a conoscere i numeri in
base 16 che risultano utili in quanto ogni cifra esadecimale corrisponde a 4
cifre binarie e il passaggio da una base all'altra risulta facile.
Tanto per cominciare le cifre del Sistema esadecimale sono 16, direte 10 le
conosciamo ma le altre 6 ?? Beh si usano anche le prime sei lettere
dell'alfabeto :

DEC 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
HEX 0 1 2 3 4 5 6 7 8 9 A B C D E F

Anche il sistema esadecimale è posizionale e quindi la conversione Hex .Dec si
nello stesso modo visto prima ( naturalmente si usano le potenze di 16).
Un'altra conversione che serve spesso è quella da Esadecimale a Binario e
viceversa.
Sono entrambe molto semplici in quanto come dicevamo prima tutte le cifre
esadecimali si possono codificare con quattro cifre binarie :

Hex Bin
0 0000
1 0001
2 0010
3 0011
4 0100
5 0101
6 0110
7 0111
8 1000
9 1001
A 1010
B 1011
C 1100
D 1101
E 1110
F 1111

Quindi il numero esadecimale 3F5 corrisponde. al 001111110101
3 F 5
Per il viceversa basta prendere il numero binario a blocchi di 4 cifre
(partendo dalla meno significativa) e convertirli in cifre esadecimali:

10 0101 1101 0101 0010

0010 --> 2
0101 --> 5
1101 --> D
10 --> 2

Quindi corrisponderà al numero 2D52 esadecimale !!

Un altro sistema di numerazione adottato nel campo dei calcolatori fino a
qualche anno fa era quello ottale (base 8), che lascio immaginare a voi come
funzioni !!
In un programma assembly per specificare la base di numerazione si fa
seguire al numero una lettera :

b - Binario
o - Ottale
d - Decimale
h - Esadecimale

Adesso siamo in grado di rappresentare solo i numeri positivi e quelli
negativi?
Per questi i calcolatori utilizzano un metodo abbastanza complesso : il
complemento a 2.
Vediamo subito un esempio per capire come funziona, consideriamo il numero 5 e
rappresentiamolo in binario a 8 bit : 00000101, calcoliamo da questo la
rappresentazione binaria di -5, si procede nel seguente modo :

1 - Si complementano tutti i bit (0-->1 e 1-->0)
00000101
||||||||
11111010
2 - al numero ottenuto si somma 1
11111010 +
1
----------
11111011
3 - Il numero ottenuto è la rappresentazione binaria di -5

Per fare la verifica provate a sommare 5 a -5 e vedrete che otterrete 0
(attenzione : il bit eventuale di overflow viene perso in quanto nel nostro
esempio abbiamo specificato che stiamo usando solo 8 bit; anche in un
calcolatore comunque in numero di bit è limitato dalla dimensione dei registri)
Quindi con n bit possiamo rappresentare i numeri da -2^(n-1) a 2^(n-1)-1
(es. con 4 bit da -8 a 7) e il bit piu' significativo indica il segno : se è 1
vuol dire che il numero è negativo.

Oltre al codice binario normale a volte sono utili altre rappresentazioni
binarie dei numeri decimali (utili come vedremo piu' avanti per le operazioni
algebriche) come ad esempio la notazione BCD (Binary Code Decimal).
In BCD le 10 cifre del codice decimale vengono codificte una ad una con 4 bit
nel seguente modo:

Decimale 0 1 2 3 4 5 6 7 8 9
BCD 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001

Così per rappresentare il numero decimale 145 basta codificare le sue cifre (1,4
e 5) con il rispettivo codice BCD :

145 --> 101000101

Oltre a saper rappresentare i numeri binari bisogna saper fare anche le
operazioni con essi, spendero' solo poche parole ma una volta capito il
meccanismo di base riuscirete benissimo a risolvere complesse operazioni !!!
Per capire come si effettua una somma basta pensare a cosa avviene con i numeri
in base 10 e ricordarsi che in base 2 ci sono solo due cifre.
Quindi (in base 10) se sommo 7 a 6 scrivo 3 con il riporto di 1, sommo il
riporto a 0 e unendo i risultati ottengo (magia) 13.
In decimale il riporto si ha quando la somma supera 10 in binario quando la
somma supera 2, quindi ad esempio :

10100011 +
10100101
----------
101001000

Provate a fare qualche esempio vedrete che è facilissimo, l'importante è aver
capito il meccanismo che sta alla base (se proprio non lo capite andate a
rileggervi i quaderni delle elementari !!!!)

Ora che abbiamo capito come fanno a "contare" i computer vediamo come fanno a
fare altre utili operazioni, guardiamo in particolare le operazioni logiche.
La logica è un ramo della matematica che stabilisce se un predicato è vero o
falso(chiedo scusa ai matematici per la definizione un po'troppo semplicistica),
quindi noi assegneremo il valore 1 a vero e il valore 0 a falso e il gioco è
fatto.
Le principali sono: AND, OR, NOT, XOR.
Noi ci chiederemo cosa risulta 1 and 1 oppure 0 or 1 ecc...
Per brevità e data la semplicità riporto solo le tabelle di verità di queste
operazioni logiche, in ingresso avremo una o due variabili binarie X e Y e in
uscita verrà prodotta la variabile Z che varrà 0 o 1 a seconda dell'operazione
logica; quindi:

AND X Y | Z
0 0 | 0
0 1 | 0 Z = X and Y
1 0 | 0
1 1 | 1


OR X Y | Z
0 0 | 0
0 1 | 1 Z = X or Y
1 0 | 1
1 1 | 1


XOR X Y | Z
0 0 | 0
0 1 | 1 Z = X xor Y ( or esclusivo )
1 0 | 1
1 1 | 0

NOT X | Z
0 | 1 Z= not X ( il NOT a differenza degli altri Š un
1 | 0 operatore unario: opera su una sola
variabile)

Questo è quello che si chiama condensato di logica però è tutto quello che ci
serve sapere sulle operazioni, se volete approfondire il concetto contattatemi e
sarò lieto di darvi altre informazioni su questo campo della matematica 8-)

Beh ora penso di avervi stufato abbastanza con tutta questa matematica ma
ritengo che una buona comprensione di questi argomenti faciliti molto la
comprensione di quello che faremo in futuro, infatti con il linguaggio Assembly
si lavora principalmente con numeri esadecimali, quindi resistete e fate un po'
di esempi per capire se avete capito.

Per richieste, consigli, suggerimenti, aiuti, contributi, ecc..., contattatemi

b0nu$,e-mail : bonus@numerica.it
hAck & c ya :-)

TORNA INDIETRO