1.1 Wstęp

Po co programować w asemblerze?

Obecnie trudno jest odpowiedzieć na to pytanie tak, aby jednocześnie do tego zachęcić. Dzisiaj coraz mniej osób zna asembler i w zasadzie nie odczuwa z tego powodu jakichś braków co do metod programowania. Zamiast w asemblerze można równie dobre programy napisać w języku C, który jest dużo bardziej powszechny w zastosowaniu. Jeszcze nie tak dawno asembler stosowany był najczęściej do pisania tych elementów algorytmów, które wymagały ścisłej optymalizacji pod względem czasu działania lub wielkości kodu. Obecnie mamy ogromne ilości pamięci i możliwość zrównoleglania obliczeń, do czego nie jest potrzebna znajomość języków niskiego poziomu. Tak więc sam nie wiem czy warto się uczyć asemblera. Właściwie to nie chcę odpowiadać na to pytanie, bo zaraz pojawi się ktoś, kto zacznie podważać moje argumenty. Bardzo by mnie cieszyło, gdyby każdy znalazł sobie sam argumenty przemawiające za nauką asemblera.

Jak powstał asembler?

Asemblerem określa się najniższy język programowania przewidziany na dany procesor. Zwykle wiąże się to z tym, iż jednemu rozkazowi języka odpowiada zrealizowanie jednej instrukcji przez procesor. Procesor oczywiście nie rozpoznaje kodu źródłowego w postaci słownych rozkazów tylko w formie kodu maszynowego. Kod maszynowy jest to szereg bajtów, czyli liczb zapisanych w postaci szesnastkowej. Przykładowo procesor interpretuje liczbę 0x05 jako kod operacji dodawania. Język asemblera daje natomiast możliwość przedstawienia kodu maszynowego w postaci reprezentacji słownej poprzez zestaw mnemoników (skrótowych nazw instrukcji), nazw rejestrów i wartości liczbowych.
Konwersja kodu źródłowego asemblera do kodu maszynowego nazywana jest kompilowaniem. W przypadku asemblera da się wykonać czynność odwrotną, czyli z kodu maszynowego odtworzyć kod w postaci instrukcji asemblera. Taka czynność nazywa się deasemblacją. Oczywiście w takim odtworzonym kodzie nie zachowają się żadne nazwy zmiennych, ani żadne symbole nazw.

Ile jest asemblerów?

Istnieje duża liczba różnych procesorów, z których każdy ma swój zestaw poleceń. Można więc mówić o innym języku asemblera stosowanym do programowania każdej z rodzin procesorów. W przypadku procesorów rodziny x86 istnieje wyłącznie jeden język asemblera, ale jest dużo kompilatorów tego języka. Różnorodność kompilatorów sprowadza się do drobnych różnic co do składni języka. Jednak wynikowy kod maszynowy jest taki sam. W tym kursie programowania będę się ograniczał w opisie programów do języka asembler z rodziny x86 jak i niektórych jego późniejszych rozszerzeń. Z pośród różnych kompilatorów wybrałem NASM. Można by się zastanawiać, który z nich jest najlepszy, ale trzeba przyznać, że większość posiada podobne możliwości, a NASM jest obecnie jednym z najbardziej popularnych.

Czy asembler jest jeszcze potrzebny?

Ostatnio zdarzyło się, że ktoś wszedł na moją stronę z takim zapytaniem. Podobne wątpliwości bywają też zgłaszane na różnych forach programistycznych przez początkujących programistów. Pytanie takie oczywiście ujawnia brak podstawowej wiedzy, czym jest asembler. Jak napisałem we wcześniejszych akapitach, jest językiem procesora i tak długo jak w naszym komputerze mamy zamiar z niego korzystać, asembler będzie potrzebny. Może nie nam bezpośrednio, ale na pewno wszystkim programom niezależnie od tego, w jakim języku zostały napisane. Każdy program kompilowany jest bowiem do kodu maszynowego, który jest właściwie instrukcjami asemblera. Pytanie Czy asembler jest jeszcze potrzebny ? można porównać do tego: jeżeli mamy obecnie dostępne całe mnóstwo zaawansowanych procesorów i układów scalonych, to tranzystor jest jeszcze potrzebny ? Odpowiedź, jak i zasadność tego pytania, jest chyba oczywista. Wystarczy zrozumieć czym jest asembler i tranzystor.