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: 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: 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.

è 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.