www.bertinettobartolomeodavide.it
|
Se
ritenete che il contenuto di questo sito ed il mio lavoro possano
esservi stati utili in qualche modo e possano aver cambiato in
piccola misura la vostra vita, potrete contribuire al mantenimento e
alla diffusione dei materiali in esso contenuti con una donazione di
importo completamente libero. Ovviamente non siete obbligati ma se
qualcuno deciderà di aderire gliene sarò infinitamente
grato!
FUNZIONI MATEMATICHE:
Proviamo ad impartire delle semplici operazioni matematiche al nostro processore di addizione, sottrazione, moltiplicazione e divisione.
Ovviamente la prima è l'addizione: in linguaggio assembly il comando è ADD (codice macchina 01h d8h)
Inseriamo con il comando 'r ax' il numero 4 ad esempio nel registro ax. Poi con il comando 'r bx' inseriamo il numero 5 ad esempio.
Ora con il comando 'e 100' impartiamo il comando di addizione al calcolatore all'indirizzo 100h e ci verrà visualizzato un simile messaggio:
0f79:0100 00._ --------> inseriamo qui '01' e poi premiamo il tasto di 'spaziatura'
allora avremo:
0f79:0100 00.01 00._ ---------> inseriamo qui 'd8' e poi il tasto 'invio'
Così abbiamo impartito il comando di addizione al calcolatore.
Dobbiamo però farci dare il risultato a questo punto.
Perciò con il comando 't' eseguiamo questa singola istruzione (ammesso che il registro ip sia settato a 100h)
Avremo il numero 0009 come risultato nel registro ax.
Tutto questo procedimento equivale al comando in assembly : 'add ax,bx' (risultato in ax).
Vi ricordo che per continuare con gli esempi è necessario riportare ogni volta il registro ip a 100h in questo modo:
- r ip ---------> premino il tasto enter.
quindi inseriamo:
IP 0102
: 100 --------> premiamo il tasto enter.
quindi digitiamo 'r' e premiamo enter per verificare se il registro ip è a 100h, così comparirà all'incirca questo:
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE
BP=0000 SI=0000 DI=0000
DS=14A0 ES=14A0 SS=14A0 CS=14A0 IP=0100
NV UP EI PL NZ AC PE NC
14A0:0100 29D8 SUB AX,BX
Ora passiamo all' operazione di sottrazione (sub in assembly).
Vi dico subito che tutti i passaggi sono identici all' addizione tranne che per il codice macchina da inserire.
Il codice macchina da inserire per la sottrazione è : 29h d8h.
Corrispondente al comando assembly: sub ax,bx ( gli indirizzi coinvolti sono sempre ax e bx con risultato in ax).
Ora passiamo all' operazione di moltiplicazione (mul in assembly).
Vi dico subito che tutti i passaggi sono identici all' addizione tranne per il codice macchina da inserire.
Il codice macchina da inserire per la moltiplicazione è : f7h e3h.
Corrispondente al comando assembly: mul bx ( qui sono coinvolti il registro bx che è sempre moltiplicato per ax è il risultato è dato dalla composizione del registro dx con ax (valore a 32bit)).
Ora passiamo all' operazione di divisione (div in assembly).
Vi dico subito che tutti i passaggi sono identici all' addizione tranne per il codice macchina da inserire.
Il codice macchina da inserire per la divisione è : f7h f3h.
Corrispondente al comando assembly: div bx ( qui sono coinvolti il registro ax che è sempre diviso per bx, il risultato è nel registro ax con il resto inserito nel registro dx.
Esaminiamo i registri per capire come sono composti.
REGISTRI:
ax (16 bit) = ah(la 'h' sta per high) a 8 bit + al (la 'l' sta per low) a 8 bit
bx (16 bit) = bh(la 'h' sta per high) a 8 bit + bl (la 'l' sta per low) a 8 bit
cx (16 bit) = ch(la 'h' sta per high) a 8 bit + cl (la 'l' sta per low) a 8 bit
dx (16 bit) = dh(la 'h' sta per high) a 8 bit + dl (la 'l' sta per low) a 8 bit
e così via ........
Questo schema sui registri servirà in seguito perché a volte sarà necessario manipolare solo una parte del registro.
Fino ad ora vi faccio notare che abbiamo operato in codice macchina che è ancora più a basso livello del linguaggio assembler!!
Vediamo come possiamo fare, in pratica, per stampare su schermo un carattere usando sempre dei codici macchina inseriti nei registri del nostro processore.
Con il comando 'r ax' inseriamo 0200 che sarebbe 02h in ah. ---> diciamo al processore che c'è da stampare un carattere su schermo.
Poi in dl inseriamo 41 ad esempio(da 00h a ffh), che indica il carattere ascii 'A', quindi in dx inseriamo 0041 --- > Con questo passaggio abbiamo scelto il carattere 'A'.
Fatto questo dobbiamo comunicare al nostro microprocessore che stiamo usando una routine legata insieme al sistema operativo e non del bios. Quindi con il comando 'e 100' inseriamo in codice 'cd' e '21'. Il che vale a dire in assembler a 'int 21'. -----> int sta per interrupt.
Di seguito chiudiamo il programma inserendo il codice esadecimanle 'cd' seguito da '20' con il comando 'e 102'.
Ed eseguiamo il tutto con 'g 104'. (Si usa 104 e non 102 perchè si devono racchiudere tutte le istruzioni siccome la 102 viene ancora eseguita mentre la 104 è esclusa!).
Così viene visualizzata la 'A', subito l'interlinea sotto 'g 102' e poi lo stato dei registri.
PS: assicuriamoci sempre che l'indirizzo ip sia uguale a 100h.
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12 - 13 - 14 - 15 - 16
Se ti interessa scaricare questo tutorial in formato PDF premi questa scritta!!!
(disponibile anche su www.manuali.it)
(presente anche su www.tutorialpc.it)