Kod programu umieszczamy w plikach o rozszerzeniu .asm. Wszystkie programy umieszczone w kursie skompilowano przy użyciu pakietu MASM32v10, w którym proces kompilacji został opisany w tej zakładce. Każdy plik o rozszerzeniu .asm przeznaczony do kompilacji umieszczamy w katalogu "../masm32/bin/". Aby zademonstrować proces kompilacji posłużymy się plikiem o nazwie p1.asm. Schemat kompilacji pojedynczego modułu przedstawiony jest na rysunku poniżej:
Zgodnie z rysunkiem na etap kompilacji pojedynczego modułu (w naszym wypadku jest to plik p1.asm.),
przypadają dwa podetapy:
a)Pierwszy tzw. asemblacja bądź tłumaczenie - przekształcenie modułu źródłowego w języku asemblera na moduł
obiektowy, wykonujemy przy użyciu pliku ml.exe. W celu asemblacji wybranego modułu wpisujemy następujące polecenie w oknie konsoli, po wcześniejszym
przejściu do katalogu "bin":
Po zostosowanej komendzie, w przypadku braku błędów asemblacji otrzymujemy plik obiektowy p1.obj.
Zastosowane tu opcje asemblera ml.exe : /c i /coff oznaczają odpowiednio:
asemblację bez konsolidacji i generację modułów obiektowych we wspólnym formacie plików obiektowych (COFF). Druga z tych opcji jest absolutnie
niezbędna przy każdej asemblacji.
b)Drugi tzw. konsolidacja bądź łączenie - przekształcenie modułu obiektowego w moduł wykonywalny poprzez dołączenie
bibliotek i innych modułów obiektowych wykonujemy przy użyciu konsolidatora link.exe. Komenda wywołująca konsolidację wpisywana w oknie konsoli zależy od typu programu jaki konsolidujemy. W przypadku aplikacji okienkowych - Windows wpisujemy:
,w przypadku programów obsługiwanych przez konsolę:
Zastosowana tu opcja konsolidatora /subsystem: ustala metodę uruchamiania wynikowego pliku .exe.
W przypadku korzystania z plików zasobów (pliki .rc), należy go przed konsolidacją skompilować programem
rc.exe, dołączonym do pakietu MASM32, znajdującym się w tym samym katalogu co konsolidator i translator. W wyniku otrzymujemy plik o rozszerzeniu .res.
Następnie należy podać nazwę pliku .res. jako parametr podczas konsolidacji.
Przykładowo posiadając plik z kodem p1.asm i plik zasobów zasoby.rc proces kompilacji
powinien wyglądać następująco:
Możliwe jest także wykonanie asemblacji i konsolidacji automatycznie, bez potrzeby wpisywania odpowiednich komend w oknie konsoli. Umożliwia to np. opcja Assemble & Link (Project->Assemble & Link) lub Console Assemble & Link (Project->Console Assemble & Link) edytora Qeditor dołączonego do pakietu MASM32. W wyniku otrzymujemy gotowy plik .exe.
Pozostałe parametry asemblera ml.exe i konsolidatora link.exe podawane podczas uruchomienia przedstawiono w tabelach poniżej:
Parametr asemblera ml.exe | Opis |
/? | Wyświetla ekran pomocy. |
/AT | Tworzony jest plik o rozszerzeniu .com. |
/BT<konsolidator> | Pozwala na użycie innego programu konsolidatora, który powinien uruchamiać się automatycznie. |
/c | Asemblacja bez konsolidacji. |
/Cp | Zachowanie wielkości znaków identyfikatorów użytkownika. Opcji tej można użyć w celu zwiększenia stopnia kontroli. |
/Cu | Wszystkie znaki w identyfikatorach zmieniane są na wielkie. |
/coff | Generuje moduły obiektów we wspólnym formacie plików obiektowych(COFF). |
/D<nazwa>=[ciąg znaków] | Definiuje makroinstrukcję tekstową. |
/EP | Listing preprocesora (kod programu z dołączonymi plikami dyrektyw INCLUDE) wypisywany jest na standardowe wyjście(stdout). |
/F<hex> | Ustala rozmiar stosu w bajtach. Domyślna wartość to 1MB. |
/Fe<plik> | Definiuję nazwę wynikowego pliku wykonywalnego. Opcji tej można używać jeżeli pominięta zostanie opcja /c. |
/Fl<plik> | Generuje plik listingu. |
/Fm<plik> | Generuje plik .map. Opcji tej można używać jeśli zostanie pominięta opcja /c. |
/Fo<plik> | Ustala nazwę pliku obiektowego. |
/Fr | Generuje plik źródłowy .sbr ( bez symboli lokalnych) na potrzeby programu bscmake.exe. |
/G<c|d|z> | Używana jest konwencja wywołań funkcji Pascala,C lub stdcall. |
/H<numer> | Ustala maksymalną długość nazw zewnętrznych. |
/I<nazwa> | Dodaje ścieżkę przechowującą pliki dołączone dyrektywą INCLUDE. Można podać więcej niż dziesięć opcji /I. |
/link<opcja> | Opcje wiersza poleceń konsolidatora. Opcji tej można używać jeżeli zostanie pominięta opcja /c. |
/nologo | Nie wyświetla komunikatów w przypadku asemblacji zakończonej sukcesem. |
/Sa | W listingu zostaną umieszczone wszystkie możliwe informacje. |
/Sc | Do listingu dodaje informacje czasowe. |
/Sf | Generuje dodatkowo listing pierwszego przebiegu asemblera. |
/Sl<numer> | Ustala szerokość wiersza w listingu. |
/Sn | Nie generuje w listingu tabeli nazw symbolicznych. |
/Sp<numer> | Ustala długość strony listingu. |
/Ss<numer> | Ustala tekst podtytułu listingu. |
/St<numer> | Ustala tekst tytułu listingu. |
/Sx | Do listingu dołączone są fragmenty kodu związane z kompilacją warunkową. |
/Ta<plik> | Asemblowane będą pliki o rozszerzeniu innym niż .asm. |
/W<numer> | Ustala listę zdarzeń występujących w czasie asemblacji, jakie należy traktować jak błędy. |
/WX | Wszystkie ostrzeżenia traktowane są jak błędy. |
/X | Ścieżka ustalona przez ścieżkę środowiskową INCLUDE jest ignorowana. |
/Zd | Informacja dla debuggera. Dołączane są tylko numery linii. |
/Zf | Wszystkie nazwy deklarowane są jako PUBLIC. |
/Zi | Dołączana jest pełna informacja debuggera. |
/Zm | Włącza tryb zgodności z asemblerem 5.01. |
/Zp<n> | Wprowadza wyrównywanie struktur danych. |
/Zs | Wykonywane jest tylko sprawdzanie składni. |
Parametr konsolidatora link.exe | Opis |
/ALIGN:numer | Definiuje wyrównanie sekcji dla płaskiego modelu pamięci. Domyślna jest wartość 4096. |
/BASE:{adres|@nazwapliku.klucz} | Definiuje adres podstawowy(adres ładowania). Dla pliku.exe domyślną jest wartość 0x400000 natomiast dla pliku .dll domyślną jest wartość 0x10000000. |
/COMMENT:["]komentarz["] | Definiuje komentarz umieszczony w nagłówkach plików .exe i .dll. |
/DEBUG | Tworzy w plikach .exe i .dll informacje dla debuggera. Informacje te umieszczone są w pliku .pdb. |
/DEBUGTYPE:{CV|COFF|BOTH} | Wartość CV oznacza zapisywanie informacji debuggera w formacie Microsoftu. Wartość COFF oznacza zapisywanie informacji debugera w formacie COFF, a wartość BOTH oznacza, że tworzone są informacje w obu formatach. |
/DEF:nazwa_pliku | Definiuje plik .def. |
/DEFAULTLIB:biblioteka | Do listy wykorzystywanych bibliotek dodaje jedną bibliotekę. |
/DLL | Tworzony jest plik .dll. |
/DRIVER[{UPONLY|WDM}] | Opcja stosowana do budowania sterowników systemów NT (sterowniki trybu jądra). |
/ENTRY:symbol | Definiuje adres startowy dla plików .exe i .dll. |
/EXETYPE:DYNAMIC | Opcja używana przy tworzeniu sterowników VXD. |
/EXPORT:nazwa_pliku[=nazwa_wewnętrzna] [.@porządkowa[.NONAME]][.DATA] | Opcja pozwala na eksportowanie funkcji z naszego programu i udostępnianie ich w ten sposób innym programom. W takim wypadku tworzona jest też biblioteka import. |
/FIXED[:NO] | Ustala adres bazowy określony opcją /BASE. |
/FORCE[:{MULTIPLE|UNRESOLVED}] | Opcja pozwala na przygotowanie pliku wykonywalnego, nawet jeżeli zewnętrzna nazwa nie zostanie znaleziona lub brakować będzie pewnych definicji. |
/GPSIZE:numer | Definiuje rozmiar ogólnych zmiennych dla platform MIPS i Alpha. |
/HEAP:rezerwa[.potwierdzenie] | Definiuje rozmiar sterty w bajtach. Domyślną wartością jest 1 MB. |
/IMPLIB:nazwa_pliku | Definiuje nazwę biblioteki import. Taką bibliotekę koniecznie trzeba przygotować. |
/INCLUDE:symbol | Dodaje nazwę do tabeli nazw. |
/INCREMENTAL:{YES|NO} | Jeżeli podana zostanie opcja /INCREMENTAL:YES to do pliku .exe dodawane będą dodatkowe informacje pozwalające na szybką rekompilację pliku. Domyślnie informacje te nie są dodawane. |
/LARGEADDRESSAWARE[:NO] | Określa, że aplikacja będzie działała z adresami większymi niż 2GB. |
/LIBPATH:katalog | Określa bibliotekę, która będzie przeszukiwana jako pierwsza. |
/MACHINE:{ALPHA|ARM|IX86|MIPS|MIPS16|MISPR41XX|PPC|SH3|SH4} | Określa platformę docelową. W większość przypadków nie trzeba stosować tej opcji. |
/MAP{:nazwa_pliku} | Nakazuje konsolidatorowi tworzyć pliki .map. |
/MAPINFO:{EXPORTS|FIXUPS|LINES} | Nakazuje konsolidatorowi dołączyć do pliku .map odpowiednie informacje. |
/MERGE:z=do | Nakazuje konsolidatorowi połączyć sekcję z sekcją do i wynikowej sekcji nadać nazwę do. |
/NODEFAULTLIB[:biblioteka] | Ignoruje wszystkie biblioteki lub podaną bibliotekę. |
/NOENTRY | Ta opcja jest konieczna w czasie tworzenia pliku .dll. |
/NOLOGO | Nie wyświetla komunikatów z logo konsolidatora. |
/OPT:{ICF[,iteracje]|NOICF|NOREF|NOWIN98|REF|WIN98} | Definiuje metodę optymalizacji stosowaną przez konsolidator. |
/ORDER:@nazwa_pliku | Optymalizuje program wstawiając do niego specjalne zainicjowane dane (COMDAT). |
/OUT:nazwa_pliku | Definiuje plik wyjściowy. |
/PDB{:nazwa_pliku|NONE} | Definiuje nazwę pliku przechowującego informacje dla programu uruchomieniowego. |
/POBTYPE{CON[SOLIDATE]|SEPT[YPES]} | Definiuje typ pliku .pdb. |
/PROFILE | Opcja stosowana do współpracy z profilem. |
/RELEASE | Do pliku wyjściowego zapisywana jest suma kontrolna. |
/SECTION:nazwa,[E][R][W][S][D][K][L][P][X] | Opcja pozwala na zmianę atrybutów sekcji. |
/STACK:rezerwa[,zatwierdzone] | Definiuje rozmiar zaalokowanego stosu. Wartość zatwierdzone definiuje rozmiar pamięci interpretowany przez system operacyjny. |
/SUBSYSTEM:{NATIVE|WINDOWS|CONSOLE|WINDOWSCE|POSIX}[.#[.##]] | Ustala metodę uruchomiania wynikowego pliku .exe. Wartość NATIVE stosowana jest dla aplikacji Windows NT. WINDOWS oznacza normalną aplikację systemu Windows. CONSOLE pozwala uruchomić aplikację konsolową, natomiast wartość POSIX opisuje aplikację podsystemu Windows NT POSIX. |
/SWAPRUN:{CD|NET} | Nakazuje systemu operacyjnemu skopiować plik wyjściowy do pliku wymiany(Windows NT). |
/VERBOSE[:LIB] | Włącza tryb konsolidacji z generowaniem komunikatów o wykonywanych operacjach. |
/VERSION:#[.#] | Umieszcza w pliku .exe informacje o wersji. |
/VXD | Tworzy sterownik VXD. |
/WARN[:poziom_ostrzeżeń] | Określa maksymalną liczbę możliwych ostrzeżeń konsolidatora. |
/WS:AGGRESSIVE | Zmniejsza prędkość wykonywania aplikacji docelowej(Windows NT). W czasie gdy aplikacja nie jest aktywna, system operacyjny usuwa ją z pamięci. |