Zrozumieć Asembler
ci. Na koniec jeszcze musisz powiedzieć mikroprocesorowi, w którym miejscu zaczyna się program, który ma wykonać. Mikroprocesor sam nie odnajdzie programu, bo treść programu zapisana jest przy pomocy takich samych liczb, jak każde dane.
Dochodzimy wreszcie do istoty działania komputera, do określenia, czym jest program i w jaki sposób jednostka centralna steruje komputerem.
Wesz już, w jaki sposób informacja przechowywana jest w pamięci - w postaci ciągu bitów, czyli cyfr dwójkowych tworzonych przez napięcie: jest, czyli 1 lub go nie ma, czyli 0. Dla potrzeb człowieka zestawy tych bitów, czyli cyfr dwójkowych, zwane są bajtami i interpretowane są jako cyfry szesnastkowe lub dziesiętne, litery lub inne znaki. Podobnie jak w tabeli znajdującej się w załączniku A, przedstawiony jest zestaw symboli, które znaczą coś dla człowieka, tak samo istnieje zestaw kodów, które znaczą coś dla mikroprocesora. Kody te nazywane są instrukcjami języka maszynowego. Są to właśnie instrukcje, przy pomocy których będziesz nakazywał jednostce centralnej wykonanie określonych czynności.
Przyjrzyjmy się temu bliżej na przykładzie instrukcji mikroprocesora 8088. Kod zapisany w postaci liczby dwójkowej 01000000 (40H) dla mikroprocesora 8088 nie jest poleceniem: dodaj 1 do zawartości rejestru AX. Inne instrukcje mogą zajmować więcej niż jeden bajt. Na przykład 2 bajty 11010110 01110011 (0B6H 73H) oznaczają polecenie: załaduj wartość 73H do rejestru DH. Istnieją również bardziej skomplikowane polecenia. Na przykład 11110011 10100100 (0F3H 0A4H) poleca mikroprocesorowi wykonanie następującego zespołu czynności: przenieś ciąg bajtów o długości określonej w rejestrze CX zaczynający się od 32-bitowego adresu znajdującego się w parze rejestrów DS i SI do komórek pamięci zaczynających się od 32-bito-wego adresu, znajdującego się w rejestrach ES i DI, uaktualniając adresy znajdujące się zarówno w SI, jak i DI po przeniesieniu każ-dego bajtu, oraz zmniejszając CX o 1 po wykonaniu każdego przeniesienia. Kiedy CX będzie równe 0, należy zakończyć przenoszenie.
Wszystkie kilkaset instrukcji rozumianych przez mikroprocesory Intela mieści się w powyższym zakresie stopnia komplikacji i możliwości wykonawczych. Są tam instrukcje wykonujące działania arytmetyczne (dodawanie, odejmowanie, mnożenie czy dzielenie), instrukcje operacji logicznych (I, LUB itd.) oraz instrukcje, które przenoszą informacje między obszarami pamięci lub do urządzeń peryferyjnych.
Program komputerowy jest po prostu ciągiem takich instrukcji przechowywanych w pamięci. Program może być przechowywany w całkowicie dowolnym obszarze pamięci i bajty znajdujące się w tym obszarze nie różnią się niczym od innych bajtów, znajdujących się w dowolnym innym obszarze pamięci.
Specjalność bajtów programu bierze się tylko i wyłącznie z tego, że mikroprocesor odczytuje (pobiera) bajt znajdujący się we wskazanej mu przez programistę komórce i zaczyna wykonywać odpowiadającą mu instrukcję, pobierając ewentualnie dodatkowe bajty związane z tą instrukcją. Jeśli przypadkiem pomylisz się wskazując zły adres początkowego baj tu programu, mikroprocesor zacznie wykonywać nie istniejący program, wykonując w sumie zupełnie nieprzewidziane czynności.
Jeśli np. Twój program zaczyna się od polecenia 40H (wspomnianego wcześniej), to do aktualnej wartości w rejestrze AX zostanie dodane 1. Natomiast jeśli pierwszym (czy kolejnym) poleceniem będzie 0D6A, to mikroprocesor pobierze dodatkowy bajt, aby znać w pełni rodzaj tej instrukcji. Dopiero po pobraniu tego drugiego baj-tu mikroprocesor wykona nakazaną czynność, czyli załaduje ten drugi pobrany bajt do rejestru DH.
Po wykonaniu bieżącej instrukcji CPU pobiera automatycznie kolejny bajt. W mikroprocesorze istnieje specjalny rejestr o nazwie wskaźnik (licznik) instrukcji (ang. instruction point er), który po prostu zawiera adres komórki pamięci, w której znajduje się następna instrukcja. Po wykonaniu każdej instrukcji wskaźnik instrukcji jest aktualizowany tak, żeby zawierał adres następnej instrukcji.