Programowanie niskopoziomowe / Moduł 1: Wiadomości podstawowe

From Studia Informatyczne


Grafika:PNP_M1_S01.png

...


Grafika:PNP_M1_S02.png

...


Grafika:PNP_M1_S03.png

Język asemblera stanowi symboliczny zapis instrukcji procesora i danych, który w prosty sposób odpowiada zapisowi binarnemu. Języki asemblerowe wprowadzone w celu czytelnej dla człowieka reprezentacji języków maszynowych komputerów.

W przeciwieństwie do języków wysokiego poziomu, typowe języki asemblerowe charakteryzują się strukturą liniową (wierszową). Każdy wiersz tekstu może zawierać pojedynczą instrukcję procesora lub dyrektywę asemblera.

Programowanie w języku asemblera daje programiści możliwość bezpośredniego operowania na zasobach komputera na niskim poziomie.


Grafika:PNP_M1_S04.png

Na ogół pojedyncza instrukcja asemblera odpowiada instrukcji procesora. Większość asemblerów jest wyposażona w mechanizmy makrogeneracji, co umożliwia programiści definiowanie często powtarzanych sekwencji instrukcji i późniejsze ich przywoływanie przy użyciu jednej makroinstrukcji. Istnieją również asemblera, których zestaw instrukcji jest nadzbiorem zestawu instrukcji procesora. Dostępne w takich asemblerach metainstrukcje, zrealizowane nieco podobnie do makroinstrukcji, ułatwiają programiście zapis programu w czytelnej postaci. Przykładem mogą tu być asemblery dla procesorów MIPS.


Grafika:PNP_M1_S05.png

Program asemblerowy zawiera dyrektywy sterujące pracą asemblera, dyrektywy służące definiowaniu danych oraz instrukcje dla procesora.

Pojedynczy wiersz programu zawiera pojedynczą instrukcję lub dyrektywę. Struktura wiersza jest sztywno określona. Pierwszym elementem wiersza jest opcjonalna etykieta lub nazwa. Wiele asemblerów wymaga, aby bezpośrednio po etykietach (wszystkich lub tylko poprzedzających instrukcje) następował znak dwukropka.

Następny element stanowi nazwa instrukcji lub dyrektywy asemblera. Po niej mogą następować argumenty, stosownie do wymagań konkretnej instrukcji lub dyrektywy. Argumenty są oddzielane przecinkami.

Ostatnim elementem wiersza jest opcjonalny komentarz. W programie mogą występować wiersze puste, wiersze zawierające samą etykietę lub tylko komentarz. Komentarz rozpoczyna się charakterystycznym znakiem początku komentarza – najczęściej jest to średnik.


Grafika:PNP_M1_S06.png

Zazwyczaj program asemblerowy formatuje się w taki sposób, aby poszczególne elementy – etykiety, instrukcje i argumenty - rozpoczynały się w każdym wierszu od tych samych kolumn tekstu. najczęściej w tym celu używa się tabulacji poziomych.

W przykładowym programie pierwsza dyrektywa informuje asembler, że definiowane poniżej obiekty należą do sekcji kodu. Dyrektywa org określa adres początkowy następujących po niej instrukcji. Kolejne wiersze zawierają instrukcje i komentarze. Ostatni wiersz zawiera dyrektywę definicji (emisji) danych, które w tym przypadku mają postać łańcucha tekstowego.


Grafika:PNP_M1_S07.png

Pomimo możliwości stwarzanych przez języki wysokiego poziomu, programowanie asemblerowe jest stosowane w wielu sytuacjach, w których krytyczna jest optymalność programu lub jest wymagany bezpośredni dostęp do zasobów niewidocznych w języku wysokiego poziomu.


Grafika:PNP_M1_S08.png

Ponieważ na ogół duże programy są tworzone w językach wysokiego poziomu, tam, gdzie wymagane jest programowanie niskopoziomowe niezbędne staje się łączenie modułów programu napisanych w różnych językach programowania. Taki sposób programowania nazywamy programowaniem hybrydowym.

Główne struktury programu oraz operacje wejścia wyjścia zazwyczaj zapisuje się w języku wysokiego poziomu. W asemblerze pisane są te fragmenty, których zapis w języku wysokiego poziomu jest niemożliwy lub nieefektywny.

Przy programowaniu asemblerowym niezbędne jest opracowanie i przestrzeganie zasad przekazywania sterowania pomiędzy modułami i korzystania z zasobów komputera przez oprogramowanie.


Grafika:PNP_M1_S09.png

Program asemblerowy może być napisany z myślą o uruchamianiu go w systemie operacyjnym, tak, jak najczęściej ma to miejsce w przypadku programów napisanych w językach wysokiego poziomu.

W takim przypadku wszelkie operacje na zasobach sprzętowych realizuje system operacyjny.


Grafika:PNP_M1_S10.png

Zupełnie innym typem programów są programy działające na komputerach, które nie mają systemu operacyjnego, lub w których system operacyjny ma bardzo ograniczoną funkcjonalność. W takim przypadku program musi na samym początku przygotować sobie środowisko pracy.

Przykładami takich programów są fragmenty systemów operacyjnych, programy ładujące, moduły startowe programów napisanych w językach wysokiego poziomu oraz oprogramowanie małych mikrokontrolerów w systemach wbudowanych.


Grafika:PNP_M1_S11.png

Przykładem programu „wolnostojącego” jest program ładujący system operacyjny. Jest on zapisany w pojedynczym bloku pamięci masowej. Oprogramowanie zawarte w pamięci stałej komputera ładuje program ładujący i przekazuje mu sterowanie. Program ładujący musi przygotować sobie środowisko pracy, a następnie załadować system operacyjny lub właściwy dla niego program ładujący. Program ładujący operuje na fizycznych blokach pamięci masowej, poniżej poziomu systemu plików.


Grafika:PNP_M1_S12.png

Moduł startowy programu napisanego w języku wysokiego poziomu jest uruchamiany przez system operacyjny po załadowaniu programu. Moduł startowy przygotowuje środowisko pracy programu, następnie wywołuje główną procedurę programu. Po powrocie z głównej procedury moduł startowy zwalnia przydzielone przez system zasoby i przekazuje sterowanie do systemu operacyjnego.