82 Zrozumieć Asembler
o
Zajmijmy się teraz wyjaśnieniem, czym są kompilatory oraz asemblery. Oba należą do kategorii programów zwanych translatorami.
Translator jest programem przekształcającym tekst źródłowy programu zapisany w postaci zrozumiałej dla człowieka na program zapisany postaci kodu binarnego. Ten plik binarny może od razu być plikiem programu, który mikroprocesor będzie w stanie wykonać, może być też jednym z setek typów plików binarnych, jak np. fontem czy spakowanym plikiem danych.
Translatory programów są grupą translatorów, które tłumaczą tekst źródłowy programu zapisanego przez programistę w danym języku programowania na binarne odpowiedniki kodu źródłowego. Powstałe tą drogą pliki binarne nazywamy plikami łub kodami obiektowymi (ang. object codę fil es).
Kompilator jest translatorem tłumaczącym, który przyjmuje plik kodu źródłowego napisanego w języku wyższego poziomu, takim jak C czy Pascal, i na tej podstawie tworzy plik obiektowy.
Asembler jest specjalnym rodzajem kompilatora. Asembler jest specjalnie przeznaczony do tłumaczenia tego, co my nazywamy pro-gamem w języku Asemblera na kod obiektowy. Podobnie jak kompilator Pascala czy C, Asembler asembluje (tłumaczy, kompiluje) tekst źródłowy na kod obiektowy. Sama czynność tłumaczenia jest podobna w obu przypadkach. Istotna różnica powstaje w sposobie tworzenia programu: w przypadku Asemblera mamy pełną kontrolę nad kodem obiektowym.
Niektórzy ludzie definiują język Asemblera jako język, w którym z jednegc^wiersza tekstu źródłowego (zapisanego przez programistę) tworzy się jedną instrukcję maszynową. Dosłownie to nie jest prawda, gdyż niektóre wiersze zapisane przez programistę w kodzie źródłowym są poleceniami dla programu asemblera i nie powodują utworzenia żadnej instrukcji maszynowej.
Moja definicja Asemblera jest następująca:
Pascal czy C umożliwiają programowi translatora podejmowanie wielu niewidocznych decyzji dotyczących sposobu przetłumaczenia określonej instrukcji zapisanej przez programistę na instrukcje maszynowe. Przyjrzyj się temu na przykładzie prostej instrukcji zapisanej w Pascalu, przypisującej wartość 42 do zmiennej liczbowej o nazwie I:
I : = 42 ;
Kompilator Pascala przetłumaczy ten wiersz na serię czterech czy pięciu instrukcji maszynowych, które utworzą wartość 42 i zapamię-tają ją w pamięci pod adresem zakodowanym jako nazwa I. Normalnie programista nie ma pojęcia, jakie to są te cztery czy pięć instrukcji i nie ma również żadnej możliwości ich zmiany, nawet jeśli by znał inny zestaw instrukcji wykonujących tę samą pracę szybciej. Kompilator Pascala wykorzystuje instrukcje maszynowe według własnego wyboru.
Asembler natomiast dla każdego wiersza tekstu źródłowego programu generuje jedną instrukcję języka maszynowego (kodu maszynowego). W tekście źródłowym znajdują się również wiersze nic dotyczące bezpośrednio działania CPU. Natomiast każda instrukcja języka maszynowego w docelowym kodzie obiektowym (i programie) powstaje w wyniku bezpośredniego przetłumaczenia tylko jednego wiersza z kodu źródłowego.
Każda z instrukcji maszynowych ma odpowiedni mnemonik, czyli literowy zapis ułatwiający zapamiętanie efektów^ jej wykonania. Mnemoniki zostały utworzone w celu ułatwienia pracy programisty. Na przykład mnemonikiem dla instrukcji maszynowej 9CH, która poleca zachować rejestr znaczników na stosie, jest wyraz PUSHF, znacznie łatwiejszy do zapamiętania niż liczba 9CH.
Fragment programu w Asemblerze wyglądać może następująco:
M0V AH,12H ;12H - usługa sterowania silnikiem M0V AL/03H ;03H - odczyt aktualną szybkości X0R BH,BH ;zerowanieBH
INT 71H ;wywotanie przerwania obstugi silnika