..allora..Provo a fare un p? di ordine in me e cerco di spiegarlo meglio..

..
..Bisogna premettere che i processori di ultima generazione sono comunque delle evoluzioni dei vecchi processori..Per fare un esempio: un Intel Pentium 4 ? sviluppato sulla base di un suo abbastanza vecchio predecessore, l'8086..Con questo metodo di sviluppo possiamo utilizzare anche vecchi sistemi..Il programma che ho postato e le relative librerie sono per l'appunto realizzate per funzionare come su un 8086 a 16 bit..Ora questo processore ha 14 registri a 16 bit che sono:
AX - BX - CX - DX = Registri generali
SI - DI - BP - SP = Puntatori
CS - DS - ES - SS = Segmento
FLAG - IP = Ausiliari
..I registri generali sono spesso utilizzati anche divisi in due:
..AX pu? essere utilizzato a 8 bit diviso in due parti alto e basso..
..quindi AL -> AX low e AH -> AX high ..
..Ognuno dei registri sopra elencati viene utilizzato in alcune funzioni o istruzioni gi? esistenti in assembler e per convenzione hanno cos? dei ruoli..Faccio qualche esempio con il registro CX definito contatore:
- Code: Select all
mov cx,10
wrk: mov al,[bx]
mov es:[di],al
inc bx
add di,2
loop wrk
..In queste poche righe di programma che ovviamente devono essere precedute da altro (? solo uno spezzone riportato per esempio) il programma non fa altro che inizializzare un contatore a 10 e poi con la funzione loop decrementare il suo valore ogni volta che viene richiamata saltando all'etichetta wrk finch? CX non arriva a 0..Si capisce facilmente che dobbiamo inizializzare CX perch? la funzione loop utilizza proprio questo registro come contatore..Se sostituiamo loop otteniamo il seguente codice:
- Code: Select all
mov cx,10
wrk: mov al,[bx]
mov es:[di],al
inc bx
add di,2
cmp cx,0
je dopo
dec cx
jmp wrk
..oppure..
- Code: Select all
mov cx,10
wrk: mov al,[bx]
mov es:[di],al
inc bx
add di,2
dec cx
jnz wrk
..Insomma ci sono mille modi per affrontare lo stesso problema..Spero solo sia chiaro cosa fanno queste istruzioni..A scanso di equivoci..
..Prima istruzione:
mov cx,10 = D? al registro CX il valore 10 in decimale se vogliamo inserire il valore in esadecimale basta aggiungere una h alla fine e ricordare che se il valore inizia con una lettera dobbiamo mettere davanti uno 0 per far riconoscere il tipo di dato cio? un valore numerico..Per inserire valori in binario invece basta aggiungere una semplice b..Per cui:
mov cx,10 = mov cx,0ah = mov cx,1010b
..? chiaro?..
..wrk: ? solo una etichetta che pu? essere utilizzata per ripetere varie parti del programma o per tornare indietro nel listato quando c'? bisogno di ripetere delle operazioni..
..Seconda istruzione:
mov al,[bx]
..Con questa istruzione viene copiato il valore presente nella memoria all'indirizzo indicato da BX in AL..
..La memoria ? divisa in dati da 8 bit..
..Terza istruzione:
mov es:[di],al
..Questa istruzione copia il dato contenuto in AL nella locazione di memoria indicata da ES e DI..Esempio:
..L'indirizzo di memoria delle coordinate 0,0 dello schermo in modalit? testo 80x25 a 16 colori ? b8000h..Composto da 20 bit..Se come detto prima un registro viene utilizzato a 16 bit non pu? contenere un valore come b8000h quindi serve un altro registro d'appoggio!..Cos? il dato viene diviso in due parti..
..ES verr? inizializzato a b800h con l'istruzione:
- Code: Select all
mov es,0b800h
..e DI preso come variabile d'appoggio inizializzato a 0 cos?:
- Code: Select all
mov di,0
..Uniti dai due punti sar? come avere il valore intero anche se in realt? diviso fra ES e DI..
..Quarta istruzione:
inc bx
..Beh si capisce no?..Incrementa BX che viene utilizzato come puntatore..Per esempio ad una stringa..Se abbiamo una stringa "CIAO!" e BX puntava alla C con inc bx punter? alla I..
..Quinta istruzione:
add di,2
..Anche questa ? di semplice comprensione..Incrementa di 2 il valore di DI..Nella modalit? testo i caratteri occupano 16 bit..I primi 8 definiscono di che carattere si tratta in base alla tabella dei codici ASCII..I restanti 8 definiscono gli attributi tra cui il colore del carattere e dello sfondo ed altri attributi speciali..Per questo se non si vuole modificare l'attributo standard del carattere biano su sfondo nero si salta un indirizzo di memoria per definire solo il carattere passando alla locazione di memoria successiva utile al carattere successivo!..
..Sesta istruzione:
dec cx
..E' l'esatto opposto dell'istruzione INC utilizzata prima con BX..
..Le restanti istruzioni utilizzate non fanno altro in un modo o nell'altro che controllare se il valore di CX ? 0 e ripetere a partire dall'etichetta WRK tutto finch? non si verifica questa condizione..
..In breve:
CMP CX,0 = IF(CX==0)
..se in caso di condizione vera si vuole saltare a qualche etichetta in particolare si inserisce JE WRK per esempio se invece si vuole saltare in caso di condizione falsa si inserisce JNE WRK ..Insomma molto semplice ed elementare..
..Cavolo mi sono levato la vita per scrivere sta roba..Vi immaginate andava via la luce o si impallava il pc e andava tutto perso..

..Non lo rileggo troppo lungo e palloso per me..Se c'? qualche errore o qualcosa che non capite e volete delle delucidazioni fatemi sapere!..Grazie..

..