Dopo avervi mostrato qualche esempio in generale della programmazione in assembly a 16 bit voglio chiudere questa sezione con due piccoli programmi che vi possono servire per creare i vostri progetti,quindi una specie di base.
Il programma consiste principalmente in due opzioni.La scelta di richiedere la versione DOS usata, e poi leggere l'input e in base a quello decidere se continuare ad eseguire quello che volete oppure ritornare al DOS, visualizzare un messaggio di errore, ci potete fare qualunque cosa.L'unica cosa nuova forse vi è come si fa a richiedere la versione DOS, quindi prima qualche informazione si come vi e possibile farlo.
Per richiedere la versione DOS esiste la funzione 30h dell'interrupt 21h.Quindi con un semplice
mov ah,30h
int 21h
possiamo avere tutte le informazioni che vogliamo sulla versione usata.Così otteniamo in al il primo numero della versione, mentre in ah troviamo il resto del numero della versione (.XX).Esistono programmi però che sono in grado di cambiare la versione,quindi in un certo senso la falsificano.Ecco cosa fare per sapere la versione vera e propria del DOS.
mov ah,33h ; usando l'interrupt 33, che vi darà informazione sulla ver. vera
mov al,06h ; e la subfunction 06,
int 21h ; sarà possibile trovare la versione giusta anche se è stata cambiata.
Ciò funziona solamente dalla versione 5+ del DOS, quindi se volete evitare errori nel vostro programma, potete scrivere prima una piccola routine che verifica se si stia operando sotto DOS 5+ o meno.Tutto questo sempre con la funzione 30h.
Ma ora rivolgiamoci al programma vero e proprio.Iniziamo con un file com, vogliamo avere l'opzione di poter richiedere la versione del DOS e poi aggiungiamoci un tasto che farà visualizzare un testo qualsiasi, come l'About di ogni programma, cioè semplici informazioni su di esso.
Tutto inizia con il nostro header, non dovrebbe essere assolutamente un problema.Si tratta di un com file,e ci basta un model tiny.Poi seguono i dati.
Argomenti equ 81h ; "Argomenti corrispondono a 81h" i nostri argomenti
Versione_DOS db " Versione DOS X.X",0dh,0ah,"$"
About db " Possibili opzioni sono:",0dh,0ah
db "-v: Informazioni sulla versione DOS",0dh,0ah
db "-a: About - informazioni sul programma",0dh,0ah,"$"
Errore db " Argomento non riconosciuto!",0dh,0ah,"$"
Praticamente si potrebbe dire che l'inizio vero sia qua.
mov si,Argomenti + 2 ; carichiamo il terzo byte (spazio,-,lettera)
lodsb ; carica il valore in al
cmp al,41h ; il 41 esadecimale corrisponde alla lettera "A"
je Visualizza_About ; in caso affermativo esegui "Visualizza_About"
cmp al,61h ; la stessa procedura per la "a" minuscola
je Visualizza_About
cmp al, 56h ; Lettera corrisponde alla "V" ?
je DOSinfo ; allora esegui la parte del codice che riguarda la vers. del DOS
cmp al,76h ; lettera "v"
je DOSinfo
; Se la lettera non corrisponde ad una "v" oppure una "a", il programma ;continuerà semplicemente visualizzando il messaggio di errore seguito dal ;messaggio "about".
mov dx, offset Errore ;carichiamo il messaggio di errore
mov ah,9h ;funzione 9 dell'interrupt 21 per visualizzare un testo
int 21h ; esegue tutto quanto
Visualizza_About: ; ed ecco il nostro Visualizza_About.Ci farà vedere solamente un messaggio qualunque e quindi tornerà al DOS.
mov dx, offset About ; il testo che contiene le informazioni sul programma
mov ah,9h ; Visualizza il testo
int 21h
jmp esci ; ed infine usciamo dal programma
DOSinfo: ;Se è stato premuto il tasto "v" il programma continuerà qui.
mov ah,33h ; ecco che usiamo il metodo più "moderno"
mov al,06h; la subfunction di cui vi ho parlato
int 21h; esegue tutto quanto
add bl,30h ; qui convertiamo i valori esadecimali invalori decimali
mov Versione_DOS + 13,bl ; ecco il testo con la vers. da visualizzare
add bh,30h ; qui convertiamo i valori esadecimali invalori decimali
cmp bh,39h ; vediamo se il numero (.XX) è minore di 10
jle Visualizza ; ed ecco che la versione sarà visibile sullo schermo
mov bl,bh ; dovrebbe essere tutto chiaro
sub bl,0ah ; "sub" ormai lo conoscete
mov Versione_DOS + 16,bl ;la posizione dove sara' visibile il numero
mov bh,31h; quindi otteniamo il valore della sottrazione in bh
; Dopodichè verrà visualizzata la versione del DOS
mov Versione_DOS +15,bh ; sempre la posizione della versione
mov dx, offset Versione_DOS ; carichiamo la nostra string
mov ah,9
int 21h ; nessuna difficoltà
esci: ; ora il codice per ritornare al DOS
mov ah,4ch ; funzione 4ch termina il programma
int 21h ; e siamo di nuovo fuori
Per quanto riguarda exe files, come sapete, sono più flessibili e la grande differenza tra com ed exe è quella che files .exe sono fatti di diversi segmenti, mentre un com file ne puo' contenere solamente uno.Ora trasferiamo tutto ciò su un file exe,Potete creare addirittura un segment per il PSP (Program Segment Prefix), pur sapendo che nel file compilato non sarà più presente.
Questo piccolo programma non necessita un model grande, quindi ci possiamo accontentare di un model small.La cosa importante però è che non dovete scordarvi di includere lo .stack.Potete specificarne anche la grandezza, il default rimane comunque 200h.
Argomenti db 127 dup(?) ; i nostri argomenti
Ora segnalamo all'assembler di creare un data segment con i nostri dati, che non sono diversi da quelli usati nel file com.
.data
Versione_DOS db " Versione DOS X.X",0dh,0ah,"$"
About db " Possibili opzioni sono:",0dh,0ah
db "-v: Informazioni sulla versione DOS",0dh,0ah
db "-a: About - informazioni sul programma",0dh,0ah,"$"
Errore db " Argomento non riconosciuto!",0dh,0ah,"$"
Ora il codice vero e proprio, creando l'importantissimo cod segment
.code
mov ax,@data
mov ds,ax
mov al, Argumenti + 2 ; dovrebbe essere tutto chiaro penso
cmp al,41h ; il 41 esadecimale corrisponde alla lettera "A"
je Visualizza_About ; in caso affermativo esegui "Visualizza_About"
cmp al,61h ; la stessa procedura per la "a" minuscola
je Visualizza_About
cmp al, 56h ; Lettera corrisponde alla "V" ?
je DOSinfo ; allora esegui la parte del codice che riguarda la vers. del DOS
cmp al,76h ; lettera "v"
je DOSinfo
Il resto è praticamente identico.Potete metterci anche procedure, e un sacco ancora.
Spero che questi programmi di base vi possano essere utili, da qui in poi sono possibili diversi programmi di input e output, oppure possono fungere come base per ogni tipo di shell di ogni genere di programma.
E con questo vorrei anche chiudere il capitolo "Esempi", cioe' degli esempi espliciti di programmazione generale a 16 bit, ovviamente spiegherò anche in avanti il codice pubblicato, solamente che saranno fatti più per questa rubrica, ma si tratterà di virus o altri programmi.Comunque credo che ora siete anche in grado di capire diversi tipi di codici, quindi a dire la verità non ce ne sarà neanche più bisogno di questo genere di esempi.