Programowanie niskopoziomowe / Moduł 1: Wiadomości podstawowe: Różnice pomiędzy wersjami
Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Nie podano opisu zmian |
mNie podano opisu zmian |
||
(Nie pokazano 1 wersji utworzonej przez jednego użytkownika) | |||
Linia 16: | Linia 16: | ||
|valign="top" width="500px"|[[Grafika:PNP_M1_S03.png]] | |valign="top" width="500px"|[[Grafika:PNP_M1_S03.png]] | ||
|valign="top"| | |valign="top"| | ||
... | 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. | |||
|} | |} | ||
<hr width="100%"> | <hr width="100%"> | ||
Linia 22: | Linia 26: | ||
|valign="top" width="500px"|[[Grafika:PNP_M1_S04.png]] | |valign="top" width="500px"|[[Grafika:PNP_M1_S04.png]] | ||
|valign="top"| | |valign="top"| | ||
... | 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. | ||
|} | |} | ||
<hr width="100%"> | <hr width="100%"> | ||
Linia 28: | Linia 32: | ||
|valign="top" width="500px"|[[Grafika:PNP_M1_S05.png]] | |valign="top" width="500px"|[[Grafika:PNP_M1_S05.png]] | ||
|valign="top"| | |valign="top"| | ||
... | 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. | |||
|} | |} | ||
<hr width="100%"> | <hr width="100%"> | ||
Linia 34: | Linia 44: | ||
|valign="top" width="500px"|[[Grafika:PNP_M1_S06.png]] | |valign="top" width="500px"|[[Grafika:PNP_M1_S06.png]] | ||
|valign="top"| | |valign="top"| | ||
... | 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. | |||
|} | |} | ||
<hr width="100%"> | <hr width="100%"> | ||
Linia 40: | Linia 52: | ||
|valign="top" width="500px"|[[Grafika:PNP_M1_S07.png]] | |valign="top" width="500px"|[[Grafika:PNP_M1_S07.png]] | ||
|valign="top"| | |valign="top"| | ||
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. | |||
|} | |} | ||
<hr width="100%"> | <hr width="100%"> | ||
Linia 46: | Linia 58: | ||
|valign="top" width="500px"|[[Grafika:PNP_M1_S08.png]] | |valign="top" width="500px"|[[Grafika:PNP_M1_S08.png]] | ||
|valign="top"| | |valign="top"| | ||
... | 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. | |||
|} | |} | ||
<hr width="100%"> | <hr width="100%"> | ||
Linia 52: | Linia 68: | ||
|valign="top" width="500px"|[[Grafika:PNP_M1_S09.png]] | |valign="top" width="500px"|[[Grafika:PNP_M1_S09.png]] | ||
|valign="top"| | |valign="top"| | ||
. | 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. | |||
|} | |} | ||
<hr width="100%"> | <hr width="100%"> | ||
Linia 58: | Linia 76: | ||
|valign="top" width="500px"|[[Grafika:PNP_M1_S10.png]] | |valign="top" width="500px"|[[Grafika:PNP_M1_S10.png]] | ||
|valign="top"| | |valign="top"| | ||
... | 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. | |||
|} | |} | ||
<hr width="100%"> | <hr width="100%"> | ||
Linia 64: | Linia 84: | ||
|valign="top" width="500px"|[[Grafika:PNP_M1_S11.png]] | |valign="top" width="500px"|[[Grafika:PNP_M1_S11.png]] | ||
|valign="top"| | |valign="top"| | ||
... | 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. | ||
|} | |} | ||
<hr width="100%"> | <hr width="100%"> | ||
Linia 70: | Linia 90: | ||
|valign="top" width="500px"|[[Grafika:PNP_M1_S12.png]] | |valign="top" width="500px"|[[Grafika:PNP_M1_S12.png]] | ||
|valign="top"| | |valign="top"| | ||
... | 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. | ||
|} | |} |
Aktualna wersja na dzień 10:41, 26 cze 2008
![]() |
... |
![]() |
... |