Assembly Windows 32bit con MASM
Capitolo 1: Strumenti necessari per la sezione Assembly Windows 32bit
Nella sezione Assembly Windows 32bit vengono illustrate le tecniche generali che si
utilizzano per lo sviluppo dei programmi Assembly destinati a "girare" in
ambiente Windows; il termine Win32 indica tutte le versioni a 32
bit del sistema operativo Windows, come Windows 95, Windows 98,
Windows ME, Windows NT, Windows 2000, Windows XP (che
esiste anche in versione a 64 bit).
Naturalmente si dà per scontato il fatto che chi legge questa sezione abbia una
buona conoscenza generale della programmazione in Assembly; in particolare,
è importante avere una certa dimestichezza con il set di istruzioni a 32
bit e soprattutto con gli indirizzamenti a 32 bit. Bisogna osservare inoltre
che il sistema operativo Win32 sfrutta la modalità protetta delle CPU
80386 e superiori; è importante quindi avere anche una conoscenza generale
dei concetti che stanno alla base di questa modalità operativa delle CPU. Ricordiamo
le principali novità che caratterizzano la modalità operativa protetta a 32 bit:
- I segmenti di programma possono avere l'attributo SIZE di tipo
USE32.
- Gli indirizzamenti predefiniti sono di tipo NEAR a 32
bit.
- è possibile utilizzare qualsiasi registro generale a 32 bit
come registro puntatore.
- Lo stack viene gestito dalla CPU attraverso ESP, e dal programmatore
attraverso EBP.
- La dimensione predefinita per gli operandi immediati è di 32 bit.
Ulteriori dettagli vengono esposti nel capitolo successivo.
In ogni caso, per scrivere programmi Assembly in ambiente Win32 non è
necessario destreggiarsi tra descrittori di segmento, selettori, task switching,
etc; tutti questi aspetti vengono infatti gestiti dal sistema operativo e non dal
programmatore. è chiaro però che se si è interessati agli aspetti più nascosti di
Windows è necessaria una conoscenza piuttosto approfondita della programmazione
in modalità protetta e dei concetti che stanno alla base della progettazione dei
sistemi operativi (da ora in poi chiamati SO); le sezioni Assembly Base,
Assembly Avanzato e Modalità Protetta rappresentano una buona base di
partenza per chi fosse interessato a questi argomenti.
1.1 Strumenti di sviluppo
Per poter sviluppare programmi Windows in Assembly è necessario dotarsi di una
serie di adeguati strumenti; la dotazione minima comprende:
- un editor di testo
- un assembler a 32 bit
- un linker a 32 bit
- un compilatore di risorse
- un editor di icone
- il Windows SDK
ci serve per creare, modificare, salvare su disco o leggere dal disco i
files contenenti il codice sorgente dei nostri programmi Assembly; come al solito,
questi files devono essere rigorosamente in formato
ASCII;
perché questo è ciò che viene richiesto dall'assembler. Per motivi di chiarezza e di stile,
si consiglia di rispettare tutte le convenzioni per le estensioni dei files contenenti
programmi Assembly; i files contenenti il codice sorgente dovrebbero utilizzare
l'estensione ASM, i files contenenti direttive, dichiarazioni, prototipi di procedure,
etc, dovrebbero utilizzare l'estensione INC, i files contenenti macro dovrebbero
utilizzare l'estensione MAC, e così via.
ha il compito di convertire il codice sorgente del nostro programma in codice
oggetto; come al solito, se il codice sorgente è distribuito su più files, verranno
generati altrettanti files con estensione OBJ contenenti il codice macchina del
nostro programma. è chiaro che per poter sviluppare programmi per Win32 è
necessario un assembler in grado di supportare il set di istruzioni a 32 bit; se
poi si vogliono utilizzare istruzioni disponibili solo in modalità protetta (come
LLDT), è necessario un assembler che accetti direttive del tipo .386p (set
di istruzioni a 32 bit in modalità protetta).
ha il compito di collegare tra loro i vari moduli oggetto e di generare il
programma finale in formato eseguibile (estensione EXE); il linker deve essere
capace di generare eseguibili a 32 bit compatibili con Windows. Infatti,
il formato EXE utilizzato da Windows è differente dall'analogo formato
utilizzato in ambiente DOS; la struttura degli eseguibili per Windows
viene analizzata in un apposito capitolo della sezione Assembly Windows 32bit.
- Il Compilatore di risorse:
è uno strumento di sviluppo tipico dell'ambiente Windows;
questo particolare compilatore opera sui cosiddetti Resource Files (files di risorse)
di Windows. Come si intuisce dal nome, un file di risorse è destinato a contenere
una serie di risorse che verranno utilizzate da una applicazione Windows; tra le
risorse più conosciute possiamo citare i menu, le icone, le immagini in formato
bitmap, etc. I files di risorse utilizzano l'estensione predefinita RC e anche
in questo caso devono essere in formato
ASCII;
il compilatore di risorse compila il
FILE.RC e lo converte in un FILE.RES che è compatibile con il formato oggetto
(OBJ). A questo punto il FILE.RES viene passato al linker che provvede a
collegarlo ai vari moduli OBJ per poter ottenere il programma finale in versione
EXE.
è un'altro strumento di sviluppo tipico dei SO o ambienti operativi
che utilizzano interfacce grafiche; uno degli oggetti più caratteristici delle interfacce
grafiche è rappresentato proprio dall'icona che è una sorta di bitmap formata in
genere da 16 x 16 o 32 x 32 pixel. Nell'interfaccia grafica di Windows,
di Linux, di OS/2, etc, ad ogni programma viene associata un'icona chiamata icona
del programma; l'editor di icone ci permette proprio di creare o modificare icone, e di salvarle
su disco nel tipico formato di immagine ICO utilizzato da Windows. A rigore bisogna
dire che l'editor di icone non è uno strumento indispensabile; infatti, se il programmatore non
specifica una icona personalizzata, Windows provvederà ad assegnare al programma una
icona predefinita. Su Internet sono reperibili numerosi editor di icone, dai più semplici
ai più sofisticati; per trovarli ci si può servire di un motore di ricerca e utilizzare un
criterio di ricerca del tipo windows AND iconedit.
rappresenta uno strumento senza il quale non sarebbe possibile sviluppare
programmi per Windows; la sigla SDK sta per Software Development Kit e cioè
il kit software per lo sviluppo dei programmi Windows. L'SDK rappresenta una collezione
di librerie contenenti tutti gli strumenti che Windows mette a disposizione dei
programmatori per la gestione dei files, gestione della memoria, gestione della grafica,
multimedia, telecomunicazioni, etc; l'SDK occupa su disco diversi Mb, ed è importante
procurarsi la versione più aggiornata possibile per poter usufruire di tutte le nuove
funzionalità messe a disposizione dalle versioni più recenti di Windows. L'SDK
di Windows è scritto principalmente in linguaggio C standard (ANSI C),
mentre le parti più critiche, strettamente legate alla piattaforma hardware utilizzata, sono
state scritte guarda caso in Assembly; queste considerazioni ci fanno capire che i
programmi Windows scritti in C o Assembly risultano più semplici, compatti
e veloci degli analoghi programmi scritti con qualunque altro linguaggio di programmazione.
1.2 Assembler disponibili
L'assembler che offre il supporto più completo per lo sviluppo di applicazioni Windows
è sicuramente il Microsoft Macro Assembler (MASM); l'aspetto più interessante
è dato dal fatto che la Microsoft da un pò di tempo ha deciso di distribuirlo "gratis"
via Internet (con la solita chilometrica licenza d'uso che tutti evitano di leggere
premendo direttamente il pulsante [Accept]). Grazie ad un rapporto di collaborazione tra
la Microsoft e un gruppo di programmatori, è nato il progetto MASM32 che ha lo
scopo di promuovere l'uso dell'Assembly per lo sviluppo di applicazioni Win32;
MASM32 fornisce ai programmatori interessati un vasto insieme di strumenti di sviluppo
che comprende tra l'altro: l'assembler, il linker, il compilatore di risorse, l'SDK, un
ottimo editor di testo (Quick Editor), etc.
Nella sezione Compilatori assembly, c++ e altri
dell'Area Downloads di questo sito
è presente il MASM32SDK.
Tra l'altro, lo stesso MASM32 contiene una notevole quantità
di eccezionali esempi pratici scritti dagli stessi programmatori della Microsoft.
Per quanto riguarda il Turbo Assembler della Borland dobbiamo dire che non è
compatibile con la scrittura di applicazioni per Win32.
Il Borland Turbo Assembler (TASM) che a differenza del MASM è però a
pagamento; si tratta comunque di un assembler nettamente più affidabile del MASM, tanto
che la stragrande maggioranza dei programmatori Assembly lo considera il miglior assembler
disponibile nel mondo dei PC. Del resto la Borland è una software house resa celebre da
mitici compilatori e interpreti come il Turbo Basic, il Turbo Pascal, il
C/C++, Delphi, etc, che si differenziano dagli analoghi prodotti Microsoft
per la quasi totale assenza di bugs; si può dire che grazie alla Borland, milioni di
programmatori in tutto il mondo hanno appreso l'arte della programmazione.
La versione più aggiornata del TASM è la 5.0 che mette a disposizione
l'assembler a 32 bit (TASM32.EXE), il linker a 32 bit (TLINK32.EXE) che è
in grado di generare eseguibili per Windows, il compilatore di risorse e numerosi
altri strumenti. Per i fortunati possessori del TASM, si presenta un problema legato
al fatto che l'SDK fornito con la versione 5.0 dell'assembler risale all'era
paleozoica di Windows 95; si tratta quindi di un SDK molto vecchio e pressoché
inutilizzabile. L'SDK fornito con questo Assembler può assemblare programmi per
la modalità reale di MS-Dos. Su internet possiamo trovare delle scritture dell'SDK
per Windows scritti da appassionati, ma comunque si tratta di scritture molto vecchie e non
propriamente affidabili. Quindi ribadisco che il TASM non è affatto compatibile con
la scrittura di applicazioni per Win32.
Tra i vari assembler che si possono utilizzare per lo sviluppo di applicazioni Windows,
una menzione speciale spetta al prodotto freeware NASM; la versione a 32 bit di
NASM supporta il formato oggetto COFF e può essere quindi usata in combinazione
con l'SDK fornito con MASM32. Chi volesse usare NASM per sviluppare
applicazioni Windows, può reperire tutta la documentazione necessaria sul sito ufficiale di NASM.
Su Internet possiamo reperire molti progetti che aggiungono un SDK personalizzato
per assemblare programmi scritti per Windows, Linux, MAC OS e i vari
so moderni.
1.3 Gli include files
Dopo aver installato MASM32 sul disco fisso (generalmente nella cartella masm32), si
nota la presenza di due sottocartelle chiamate Lib e Include; la sottocartella
Lib contiene ovviamente la collezione di librerie dell'SDK, mentre la sottocartella
Include contiene gli include files. Come già sappiamo, gli include files
dell'Assembly equivalgono agli header files del C/C++ e sono destinati a
contenere prototipi di procedure, dichiarazioni di strutture, di union, di costanti simboliche,
etc; in questo caso tutti questi prototipi e dichiarazioni servono per poter interfacciare i
nostri programmi Assembly con l'SDK di Windows.
1.4 L'include file Windows.inc
Tra tutti gli include files, il più importante di tutti è sicuramente Windows.inc che
equivale all'header file Windows.h usato dai programmi C/C++ per Windows
e viene chiamato include file principale; il file Windows.inc contiene al suo
interno una autentica marea di dichiarazioni di procedure, di strutture, di union, di costanti,
di tipi di dati (typedef), etc. Queste dichiarazioni sono indispensabili per poter
sviluppare qualunque applicazione per Windows; se si osserva il codice sorgente del modulo
principale di un programma per Windows, si nota che all'inizio è sempre presente una direttiva
del tipo:
INCLUDE Windows.inc
All'interno di Windows.inc si possono trovare ad esempio dichiarazioni del tipo:
UINT TYPEDEF DWORD
Questa dichiarazione crea un nuovo tipo di dato UINT che rappresenta il tipo intero senza
segno a 32 bit. è importantissimo che il programmatore dia un'occhiata a questo include
file per farsi un'idea precisa del suo contenuto; si tenga presente infatti che in fase di
sviluppo dei programmi Assembly per Windows, la consultazione di Windows.inc
diventa una pratica frequentissima.
1.5 Documentazione
Per poter utilizzare l'SDK il programmatore deve conoscere i nomi con i quali vengono
chiamate le funzioni, procedure, macro, strutture, union, costanti simboliche, etc, presenti
nell'SDK stesso; tutte queste dichiarazioni utilizzano la classica sintassi del linguaggio
C, e nel loro insieme formano la cosiddetta Windows API. La sigla API sta
per Application Programming Interface (interfaccia per la programmazione delle applicazioni)
e indica appunto l'interfaccia che bisogna utilizzare per accedere agli strumenti dell'SDK;
si tratta di centinaia e centinaia di nomi che un programmatore non può certo ricordare a memoria.
È molto importante quindi procurarsi un manuale di riferimento sull'API di Windows,
che deve essere il più possibile aggiornato; fortunatamente grazie a Internet è possibile
scaricare un file generalmente chiamato win32.zip e contenente un documento chiamato
Win32 Programmer's Reference in formato HLP (Help File di Windows). Questo
file, una volta decompresso occupa su disco oltre 24 MiB, ma nonostante le dimensioni
consistenti, contiene una versione dell'API aggiornata al 1996; in ogni caso si
tratta di un documento che si rivela di estrema utilità per il programmatore. La documentazione
completa dell'API di Windows occupa diversi CD-ROM ed è ottenibile a pagamento
dalla Microsoft; in alternativa, la versione completa ed aggiornata dell'API è
consultabile gratuitamente via Internet nel sito della stessa Microsoft.