Assembly applicato al x86 (introduzione alla logica ke non si addentra nel particolare)
Al giorno d'oggi esistono molti linguaggi di programmazione ad alto livello con i quali è possibile creare programmi complessi, più o meno efficienti e con i quali è possibile programmare ogni parte di un computer, ma se si vuole sfruttare al meglio le risorse messe a disposizione dal PC , se si vuole scrivere routine veloci allora l'unico linguaggio adatto è ancora il buon vecchio ASSEMBLY.
Programmando in Assembly si ha il controllo completo del computer ogni singolo bit di ogni singolo registro è nelle tue mani, hai il potere assoluto sulla macchina, però ...
Però è anche vero che programmare in Assembly non è del tutto facile, si deve tener conto di moltissime cose, un piccolo particolare trascurato ha come conseguenza il CRASH del sistema!! Una prerogativa della programmazione in Assembly è la conoscenza dell'Hardware sottostante , è quindi necessario conoscere la struttura della CPU dei registri delle porte e delle schede presenti per poterle programmare.
Questa serie di tutorial non vuole essere esaustivo in tutti gli aspetti della programmazione Assembly, si tratta di un' introduzione, un punto di partenza per entrare in questo mondo. Cominceremo dalle cose più semplici.
I tools di cui avrete bisogno sono un COMPILATORE e un LINKER , i miei esempi sono scritti per il compilatore della Borland TASM 3.1 ma si possono facilmente adattare ad altri compilatori.
Inoltre dovreste procuravi una documentazione degli interrupt del BIOS e del DOS reperibile via FTP al sito : ftp://x2ftp.oulu.fi/pub/msdos/programming oppure qui.
(Si tratta della famosissima lista di Ralph Brown).
Infine vi serve un editor di testo, va bene anche l'EDIT del DOS
ma vi consiglio un ambiente integrato per programmare in Assembly reperibile anche questo su internet al sito
http://www.inf.tu-dresden.de/~ok3/asmedit.html,
si tratta dell'ASM EDITOR scritto da Olaf Krusche e Tilo Elstner
(questo vi facilita molto il lavoro di compilazione e linkaggio).
Beh ora basta con le chiacchiere cominciamo ad addentrarci nel magnifico mondo della programmazione in ASSEMBLY.... buon lavoro!
1) Sistemi di numerazione ed elementi di logica
Ogni buon programmatore dovrebbe conoscere almeno 2 sistemi di numerazione oltre quello decimale imparato alle scuole elementari: 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 (oppure H e L, o ancora VERO e FALSO).
Infatti nel sistema binario esistono solo due cifre 0 e 1 appunto e i numeri ma anche tutte le altre informazioni vengono rappresentate con sequenze di Zero e di Uno.
Il sistema di numerazione binario è un sistema posizionale come quello decimale, cosa vuol dire: consideriamo il 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 + 1*2^6 + 0*2^5 + 1*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 è intero si scrive 0 se non è intero 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
Al giorno d'oggi esistono molti linguaggi di programmazione ad alto livello con i quali è possibile creare programmi complessi, più o meno efficienti e con i quali è possibile programmare ogni parte di un computer, ma se si vuole sfruttare al meglio le risorse messe a disposizione dal PC , se si vuole scrivere routine veloci allora l'unico linguaggio adatto è ancora il buon vecchio ASSEMBLY.
Programmando in Assembly si ha il controllo completo del computer ogni singolo bit di ogni singolo registro è nelle tue mani, hai il potere assoluto sulla macchina, però ...
Però è anche vero che programmare in Assembly non è del tutto facile, si deve tener conto di moltissime cose, un piccolo particolare trascurato ha come conseguenza il CRASH del sistema!! Una prerogativa della programmazione in Assembly è la conoscenza dell'Hardware sottostante , è quindi necessario conoscere la struttura della CPU dei registri delle porte e delle schede presenti per poterle programmare.
Questa serie di tutorial non vuole essere esaustivo in tutti gli aspetti della programmazione Assembly, si tratta di un' introduzione, un punto di partenza per entrare in questo mondo. Cominceremo dalle cose più semplici.
I tools di cui avrete bisogno sono un COMPILATORE e un LINKER , i miei esempi sono scritti per il compilatore della Borland TASM 3.1 ma si possono facilmente adattare ad altri compilatori.
Inoltre dovreste procuravi una documentazione degli interrupt del BIOS e del DOS reperibile via FTP al sito : ftp://x2ftp.oulu.fi/pub/msdos/programming oppure qui.
(Si tratta della famosissima lista di Ralph Brown).
Infine vi serve un editor di testo, va bene anche l'EDIT del DOS
ma vi consiglio un ambiente integrato per programmare in Assembly reperibile anche questo su internet al sito
http://www.inf.tu-dresden.de/~ok3/asmedit.html,
si tratta dell'ASM EDITOR scritto da Olaf Krusche e Tilo Elstner
(questo vi facilita molto il lavoro di compilazione e linkaggio).
Beh ora basta con le chiacchiere cominciamo ad addentrarci nel magnifico mondo della programmazione in ASSEMBLY.... buon lavoro!
1) Sistemi di numerazione ed elementi di logica
Ogni buon programmatore dovrebbe conoscere almeno 2 sistemi di numerazione oltre quello decimale imparato alle scuole elementari: 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 (oppure H e L, o ancora VERO e FALSO).
Infatti nel sistema binario esistono solo due cifre 0 e 1 appunto e i numeri ma anche tutte le altre informazioni vengono rappresentate con sequenze di Zero e di Uno.
Il sistema di numerazione binario è un sistema posizionale come quello decimale, cosa vuol dire: consideriamo il 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 + 1*2^6 + 0*2^5 + 1*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 è intero si scrive 0 se non è intero 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