Esempi

 

 

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.

 

L'assembly - VAI           Indice - VAI