Asembler/Wprowadzenie

O AsemblerzeEdytuj

Termin Asembler oznacza niskopoziomowy, czytelny dla człowieka sposób programowania (język) poszczególnych procesorów. W praktyce oznacza to, że termin ten jest bardzo rozległy i obejmuje wiele różnych dialektów. Język asembler jest zależny od danej architektury sprzętowej, dlatego też istnieją różne odmiany tego języka dla każdego z rodzajów procesorów. Asembler jest generalnie sposobem komunikacji jeden-do-jednego z właściwym językiem maszynowym. Niektóre kompilatory jak na przykład GCC mogą konwertować kod źródłowy wysokopoziomowych języków (jak C, C++ czy Ada) na kod źródłowy asemblera zależny od platformy jeszcze przed zasemblowaniem w język maszynowy.

Język asemblera jest jednym z nielicznych języków programowania, które naprawdę potrafią przestraszyć człowieka przy pierwszym kontakcie. Wynika to z dwóch faktów:

  • język asemblera jest językiem niskiego poziomu (tłumaczy się go bezpośrednio do kodu maszynowego)
  • według powszechnej opinii - nie nadaje się do nauczania programowania

Dlatego też osoby, które nie zetknęły się wcześniej z programowaniem nie powinny zaczynać od języków asemblerowych.

Asembler jest najbardziej niskopoziomowym sposobem na programowanie komputerów[1]. Nazwa "Asembler" jest myląca, gdyż nie ma jednego standardowego języka asemblerowego. Każdy procesor ma własny dialekt asemblera, różniący się między sobą zestawem instrukcji, rejestrów, mechanizmem dostępu do pamięci czy też samym sterowaniem procesora. Możemy jednak wyróżnić elementy wspólne: każdy procesor posiada rejestry (różnie się nazywające i dostępne w różnych ilościach), ma dostęp do pamięci, umożliwia wykonywanie prostych operacji logicznych i arytmetycznych itp. Dlatego też program napisany dla procesora firmy Intel nie będzie mógł zostać przetłumaczony na kod maszynowy procesora Motoroli i uruchomiony na nim (i vice versa).

Asembler jest typowym językiem jeden-do-jednego jeśli chodzi o sposób na komunikację z konkretnym językiem maszynowym. To oznacza,że każda instrukcja Asemblera może być przetłumaczona jako jedna instrukcja maszynowa i każdy rozkaz maszynowy może stanowić unikalną instrukcję w kodzie źródłowym napisanym w Asemblerze. Programując w Asemblerze można popełnić więcej błędów niż w językach wysokiego poziomu, ale czasami są sytuacje gdy niskopoziomowy język jest korzystniejszy lub wręcz konieczny. Ponadto, język asemblera może być łączony z językami wyższego poziomu w celu przyspieszenia kluczowych operacji.

Wszystkie mikroprocesory zachowują się inaczej jeśli chodzi o zadania takie jak sposoby adresowania pamięci, komunikacja z peryferiami lub innymi szczegółami. Te różnice między mikroprocesorami powodują, że generalnie Asembler jest nieprzenośnym językiem.

Nie mniej warto podkreślić, że żmudna praca na konstruowaniu instrukcji "na pieszo" daje rewelacyjne efekty n.p.

  • dzięki bardzo małym wymaganiom sprzętowym,
  • omija wszelki niepożądane implementację, jak n.p. telemetria (większość API jest skompilowana i trudno je przeanalizować),
  • umożliwia pisanie sterowników,
  • daje swobodę napisania dowolnych poleceń każdemu dla wszelkich urządzeń.

Przykłady owoców programowania w językach niskiego poziomu:

  • w pełni multimedialny system operacyjny MenuetOS (1,44MB) - jest darmowy,
  • wysokiej jakości gra FPP .kkrieger (99kB)

Dlaczego warto uczyć się asemblera?Edytuj

Asembler, tłumaczony bezpośrednio do kodu maszynowego danej architektury, daje możliwość dokładnego dopasowania oprogramowania do sprzętu. Dzięki temu możemy w maksymalny sposób wykorzystać możliwości naszego sprzętu. Oprócz tego znajomość języka asemblera jest konieczna wszędzie tam, gdzie programowany ma być bezpośrednio sprzęt (np. przy tworzeniu sterowników urządzeń, czy też przy programowaniu systemów operacyjnych). Oprócz tego język asemblera wymusza na programiście dokładną znajomość działania sprzętu. Tak więc nauka języka asemblera umożliwia dokładne poznanie działania np. procesora i pamięci. Wadami języka asemblera jest mała przenośność oraz stosunkowo duży nakład pracy w utworzenie nawet najprostszych programów (dla porównania - w języku Python program, który wyświetla na ekranie tekst "hello world" zajmuje tylko jedną linijkę kodu, w asemblerze potrzeba dla tej samej czynności nawet 20 linijek kodu!). W programowaniu w językach asemblerowych ważna jest także dokładność - błędne użycie instrukcji może spowodować błędy w wykonywaniu programu (właściwie, to nawet brak jednego symbolu może powodować błędy). Ponadto proces lokalizacji i usuwania błędów może być szczególnie trudny, gdyż popełniony przez nas błąd może ujawnić się bardzo daleko od swojego źródła.

Jak działa asembler?Edytuj

Na początku wyjaśnijmy jedną rzecz. Otóż pod nazwą "asembler" kryje się zarówno język jako taki, jak i program, który tłumaczy go do kodu maszynowego. Jako język jest pisany wielką literą (Asembler), a jako program tłumaczący jest pisany małą literą (asembler). Aby napisać program w Asemblerze potrzebny nam będzie:

  • edytor, który nie zapisuje formatowań tekstu
  • asembler, czyli program tłumaczący nasz program do kodu maszynowego
  • dobra znajomość danej architektury lub jej specyfikacja

Taki zestaw powinien w zupełności wystarczyć Ci do napisania najprostszego programu w asemblerze. Pozostało mi tylko wyjaśnić, jak działa asembler. Otóż programista tworzy program za pomocą tzw. mnemoników, czyli zwykle skrótów słów, które odpowiadają jednej instrukcji procesora. I tak, w procesorze i386 istnieje instrukcja move (przenieś), dla której w asemblerze istnieje mnemonik mov, który potrafi przenosić dane pomiędzy rejestrami procesora (o nich później) a pamięcią. Gotowy program, napisany w postaci mnemoników tłumaczony jest później przez asembler na kod maszynowy, który komputer może potem wykonać. Asembler również oblicza adresy słów, przez co można korzystać z etykiet. Wiele asemblerów obsługuje makra, lub korzysta się z zewnętrznych procesorów makr, np cpp.


Przypisy

  1. Oprócz "rzeźbienia" programu w czystym kodzie maszynowym - ten sposób programowania chyba już na zawsze wyszedł z użycia.