.386 ;Direttiva assembler che indica l'utilizzo del set istruzioni dell'80386 in questo caso. ;In genere si utilizza questa (e non .486 .586 ,ecc...) per maggiore compatibilità con altri PC. ;Abbiamo altre direttive simili a questa che finiscono però con la "p" (es: .486p) ;In quest'ultimo esempio abbiamo detto all'assemblatore di utilizzare delle istruzioni privilegiate ;quando la CPU o l'OS sono in Protected Mode(noi non la utilizzeremo mai perchè si usa SOLO sorgente ;privilegiato,ed in genere i programmi non si usano in modalità protetta) .MODEL FLAT,STDCALL ;abilito la modalità 32bit con trattamento stack "stdcall"(Passaggio ;parametri da destra a sinistra[dall'ultimo al primo]) ;e le call sono responsabili del bilanciamento dello stack option casemap:none ;Case sensitive ;Includiamo delle costanti,prototipi di funzioni,dichiarazioni varie,ecc...contenute nei seguenti path ;nel nostro programma. include \masm32\include\windows.inc include \masm32\include\kernel32.inc include \masm32\include\user32.inc includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib .DATA ;Dati inizializzati(occupa lo spazio che dimensioni direttamente nell'exe...mentre ;se usi la direttiva ".data?" indichi all'assemblatore che vuoi riservare un certo spazio ;quando il programma è in memoria). ;Esiste anche la direttiva ".const" dove(come dice il nome stesso)si dichiarano le costanti del programma TitoloMsgBox db "Olè",0 TestoMsgBox db "La mia prima MessageBox! :)",0 ;Terminiamo SEMPRE le stringhe con gli zeri alla fine .CODE ;Da qua comincia il sorgente del nostro programma start: ;Comune label ;Altri modi per nominare una label sono le "anonymous label" nel momento in cui non sono ;necessari nomi ben precisi o da ricordare,e si dichiarano in questo modo: ;@@: ;E per jumpare alle etichette anonime si può fare in questi 2 modi: ;jmp @F (salta alla prima etichetta anonima che trovi dopo l'istruzione del salto) ;jmp @B (salta alla prima etichetta anonima che trovi prima dell'istruzione del salto) ;ovviamente si possono fare anche salti condizionati tipo: ;je @F ;Con "invoke" chiamiamo i prototipi di funzione(memorizzati nei file .inc che abbiamo dichiarato ;all'inizio del nostro programma)che ci permettono di utilizzare una sola istruzione nel codice ;al posto dei comuni PUSH,CALL,POP invoke MessageBox, NULL,addr TestoMsgBox, addr TitoloMsgBox, MB_OK ;Richiamiamo l'API per crare una MessageBox con i rispettivi parametri invoke ExitProcess,NULL ;Terminiamo il programma restituendo il valore NULL END start ;^ ^ ;| | ;Fine programma Label inizio programma