Oggi voglio presentarvi un programma scritto in linguaggio assembly e spiegare a grandi linee il come è stato programmato.
Per partire bisogna sapere alcune cose sul linguaggio Assembly. Esso infatti è un linguaggio a basso livello, ciò vuol dire che è molto vicino all'hardware e alle singole operazioni che esegue la cpu, infatti questo linguaggio di programmazione varia a seconda del processore sulla quale bisogna lavorare, e ogni riga di codice corrisponde con un’istruzione eseguita dal processore. Rispetto ai linguaggi ad alto livello è meno intuitivo, perché appunto è molto vicino al linguaggio macchina. Un vantaggio di questo linguaggio è la possibilità di controllare il trasferimento dei vari dati dalla memoria ai registri della CPU.
Un programma assembly può essere diviso in 4 aree principali, Data Segment, Stack Segment, Code Segment ed Extra Segment.
• Il Data Segment è quella parte del programma nel quale vengono dichiarate e inizializzate le variabili utilizzate nel programma
• Lo Stack Segment è l’area dove viene inizializzato lo stack che è una sorta di contenitore nella quale vengono memorizzati i dati, e successivamente estratti secondo la tecnica LIFO (Last In First Out)
• Il Code Segment è la parte del programma dove viene scritto il codice vero e proprio
• L’Extra Segment è il segmento dove vengono svolte operazioni più complesse e non è detto che sia presente in un codice
Il programma che volevo presentarvi è un semplice programma che legge una stringa alfanumerica che viene successivamente ristampata. In questo semplice programma l’uso dell’extra segment non è richiesto. Anche il Data segment è vuoto, per il semplice motivo che la funzione viene svolta dai registri interni alla CPU.
Come prima cosa nel programma azzeriamo i registri AX e CX (il registro accumulatore e il registro contatore) e inizializziamo l’SI a 0100h (il Source index contiene indirizzi di memoria nella quale vengono memorizzati i dati) con il comando MOV, che copia nel primo operando il valore dell’operando dopo la virgola.
Dopo a questa parte è presente un ciclo nella quale vengono inseriti i caratteri da tastiera, questo ciclo finisce nel momento in cui il carattere inserito è l’invio, all’interno di questo ciclo è presente un interrupt (INT 21h) e la sua funzione è quella di interrompere il programma fino a quando non viene inserito un carattere dalla tastiera, il ciclo viene iterato grazie ai comandi CMP e JE rispettivamente "compare" e "jump if equal". Infatti il ciclo, quando l’istruzione CMP dà come risultato che il carattere inserito e il corrispettivo ASCII del invio sono uguali, fa entrare in funzione il JE che salta alla riga del codice chiamata fine. Per ogni volta che il ciclo viene ripetuto viene incrementato la parte inferiore del registro contatore CX, cioè CL.
I due blocchi di istruzione seguenti servono esclusivamente per andare a capo prima di stampare la stringa inserita, questo avviene inserendo i valori ASCII dell’invio e del reset della posizione del cursore.
Nell’ultima parte viene svolta la stampa su schermo della stringa inserita. Per fare ciò si reimposta SI a 0100h, per tornare alla cella di memoria nella quale è memorizzato il primo carattere, che viene stampato a schermo grazie all’INT 21h, che in questo caso blocca il programma finché non viene stampato un carattere. In questo ciclo viene decrementato CL in modo da, quando CL è uguale a 0, capire quando sono stati stampati tutti i caratteri. Si controlla che CL sia uguale a 0 con le istruzioni CMP e JE che salta all'istruzione denominata "fine". L'instruzione che fa terminare il programma è composta da INT 20h, interrupt che fa termina il programma.
Federico Danda