Asembler
Asembler to język programowania niskiego poziomu, w którym zasadniczo jedno polecenie odpowiada jednemu rozkazowi procesora. Jest to język powstały na bazie języka maszynowego poprzez zastąpienie kodów maszynowych pisanych binarnie lub szesnastkowo ich mnemonicznymi odpowiednikami. Dzięki zamianie liczb na tzw. mnemoniki można pisać programy w miarę zrozumiałe dla człowieka, a jednocześnie bezpośrednio tłumaczone na kod maszynowy procesora zapewniając pełną kontrolę programową.
Pierwszym asemblerem był skonstruowany przez Konrada Zuse - układ elektromechaniczny przygotowania taśmy perforowanej z programem dla maszyny Z4 (moduł Planfertigungsteil). Pozwalał na wprowadzanie i odczyt rozkazów i adresów w sposób zrozumiały dla człowieka.
Współcześnie praktycznie nie używa się asemblera do pisania całych programów dla komputerów osobistych. Jest on za to wciąż używany do pisania fragmentów wymagających bardzo wysokiej wydajności lub mających inne specjalne wymagania, np. dla oprogramowania mikrokontrolerów o niewielkich rozmiarach pamięci programu.
Rozszerzeniem Asemblera z zachowaniem wszystkich jego możliwości jest makroasembler.
Assembler mimo iż jest językiem niskiego poziomu potrzebuje kompilatora, który przetłumaczy kod zrozumiały przez nas, na kod maszynowy, czyli taki, jaki rozumie komputer, a dokładnie procesor.
Są takie programy, które potrafią tłumaczyć kod asemblerowy na maszynowy podczas wprowadzania programu.
Struktura programu
Każda linijka programu napisanego w Asemblerze ma następującą budowę:
[ETYKIETA:] [KOD OPERACJI] [ARGUMENTY] [;KOMENTARZ]
Wszystkie elementy instrukcji mogą występować w dowolnym miejscu linii, ale w podobnej kolejności i każdy musi być oddzielony od sąsiednich przynajmniej jedną spacją (odstępem). Ogólna długość instrukcji nie może być dłuższa niż 128 znaków. Nie można również kontynuować jednej instrukcji w następnym wierszu. Każda linia, to jedno polecenie.
np.:
PRZESLIJ: MOV AX,LICZNIK ;odtwarza licznik
W powyższym przykładzie kodem operacji jest MOV, argumentami są: rejestr AX i adres pola o nazwie LICZNIK. Pierwszy argument nazywamy argumentem docelowym, zaś drugi źródłowym. Argument źródłowy nigdy nie zmienia swojej wartości, natomiast docelowy prawie zawsze. Instrukcja z przykładu ma etykietę o nazwie PRZESLIJ i komentarz opisujący jej sens. Początek komentarza zaczyna się zawsze średnikiem. Wszystko, co jest napisane za średnikiem nazywamy więc komentarzem i nie jest to brane pod uwagę podczas generowania kodu wynikowego.
Etykieta jest opcjonalna, tzn. jej obecność nie jest obowiązkowa. Służy ona do tego, by móc przekazywać sterowanie (skok) do danej instrukcji. Etykieta może zajmować również oddzielną linię, np.:
PRZESLIJ:
MOV AX,LICZNIK
Każda etykieta zakończona jest dwukropkiem. W jej nazwie można używać liter, cyfr i znaków specjalnych. Nie można natomiast zacząć nazwę etykiety cyfrą. Trzeba ją poprzedzić innym znakiem.
Instrukcje
Czym jest instrukcja ? Jest to nic innego jak określenie jakiejś czynności, która ma wykonać procesor. Instrukcje w asemblerze są równoważne podstawowym czynnością jakie może wykonać CPU tak jak dodawanie, odejmowanie czy mnożenie ale nie tylko. Instrukcje nazywane są również rozkazami.
Ogólna postać instrukcji (rozkazu)
nazwa argument1, argument2
Dla procesorów intelo-podobnych (czyli kompatybilnych ze standardem pc) ważna jest kolejność argumentów. Otóż procesor postępuje od drugiego do pierwszego (pomijamy tu oczywiście rozkazy bez lub z jednym argumentem). Inaczej mówiąc pierwszy argument określa cel a drugi źródło danych. Z tego powodu nie jest możliwe wpisanie do pierwszego argumentu liczby (stałej).
Przykład :
sub ax, 10
Powyższy rozkaz odejmuje 10 od AX. Zgodnie z zasada 'od drugiego do pierwszego’ wartość drugiego argumentu (10) jest odejmowana od pierwszego argumentu (AX) a wynik zostaje umieszczony w pierwszym argumencie (AX).
Stałe
Są to poprostu liczby o nadanej wartości (przez programistę, system, kompilator...). Można je stosować w argumentach jako liczby lub adresy, wykonywać na nich proste operacje (dodawać, odejmować, ...).
Zmienne, jak sama nazwa wskazuje mogą zmieniać swoja wartość. W zależności od typu zmiennej (bajt, słowo, ...) może ona przechowywać odpowiednio wielkie wartości.
Typ zmiennych nie jest ograniczony wielkością rejestru procesora. Zmienna może mieć dowolny rozmiar (no, prawie dowolny) oraz być traktowana w dowolny sposób.
Zmienne mogą być stosowane jako pierwszy argument w rozkazach. Istnieja tez zmienne, którym można nadać wartość jeszcze przed rozpoczęciem działania programu. Nazywa się je zmiennymi zainicjowanymi.
Legionista1