Programowanie niskopoziomowe / Moduł 3: Programowanie asemblerowe w środowisku systemu operacyjnego

From Studia Informatyczne


Grafika:PNP_M3_S01.png

...


Grafika:PNP_M3_S02.png

...


Grafika:PNP_M3_S03.png

...


Grafika:PNP_M3_S04.png

Program jest zapisany w postaci pliku, zawierającego zawartość poszczególnych sekcji – klas pamięci oraz informacje o sposobie ładownia (w tym np. rozmiary sekcji). Często postać ładowalna nie ma określonych adresów początkowych poszczególnych sekcji, co oznacza, że w programie nie są wpisane adresy bezwzględne obiektów, a jedynie ich adresy względem początku sekcji – w takim przypadku podczas ładowania system operacyjny dokonuje finalnej konsolidacji, tzw. relokacji programu, podczas której do wszystkich adresów dodawane są adresy początkowe sekcji, określone przez system operacyjny.

Po załadowaniu system przekazuje sterowanie do punktu wejścia programu. Wywołując program system operacyjny przekazuje do programu argumenty wywołania.


Grafika:PNP_M3_S05.png

Programowanie asemblerowe w środowisku systemu operacyjnego można przećwiczyć korzystając z symulatora architektury MIPS o nazwie SPIM. Symulator symuluje komputer z procesorem MIPS i prostym jednoprocesowym systemem operacyjnym udostępniającym funkcje obsługi wejścia-wyjścia.


Grafika:PNP_M3_S06.png

Symulator zawiera wbudowany asembler, który akceptuje postać źródłową programu w formie pojedynczego modułu.

Symulator oraz towarzysząca mu dokumentacja są dostępne pod podanym adresem www.


Grafika:PNP_M3_S07.png

...


Grafika:PNP_M3_S08.png

...


Grafika:PNP_M3_S09.png

...


Grafika:PNP_M3_S10.png

...


Grafika:PNP_M3_S11.png

Dyrektywa .data otwiera sekcję danych. W sekcji tej jest zdefiniowany łańcuch tekstowy. Dyrektywa .asciiz definiuje łańcuch zakończony bajtem o wartości 0.

Dyrektywa .text otwiera sekcję kodu. Kolejny dyrektywa deklaruje main jako symbol publiczny, co jest potrzebne wbudowanemu konsolidatorowi. Etykieta main jest punktem wejścia do prgramu.

Program korzysta z dwóch funkcji systemowych – wypisywania łańcucha na konsolę i zakończenia programu.


Grafika:PNP_M3_S12.png

...


Grafika:PNP_M3_S13.png

...


Grafika:PNP_M3_S14.png

Dla porównania przyjrzyjmy się programowi asemblerowemu w języku asemblera procesorów rodziny x86, działającemu pod kontrolą systemu Linux.

W porównaniu ze środowiskiem SPIM mamy tu oczywiście do czynienia z odmiennym językiem asemblerowym, o odmiennych instrukcjach jak również nieco innej składni dyrektyw.

Istnieje wiele asemblerów dla procesorów x86, różniących się znacznie składnią. W dalszych przykładach będziemy używali składni zgodnej z asemblerem NASM, dostępnym w www.sourceforge.net. Analogiczną składnię mają inne darmowe asemblery – YASM i FASM.


Grafika:PNP_M3_S15.png

hello jest adresem początku łańcucha. hello_len jest stałą zdefiniowaną w programie – nie zajmuje ona miejsca w pamięci.


Grafika:PNP_M3_S16.png

...


Grafika:PNP_M3_S17.png

...