Programowanie niskopoziomowe / Moduł 3: Programowanie asemblerowe w środowisku systemu operacyjnego: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
 
 
Linia 22: Linia 22:
 
|valign="top" width="500px"|[[Grafika:PNP_M3_S04.png]]
 
|valign="top" width="500px"|[[Grafika:PNP_M3_S04.png]]
 
|valign="top"|  
 
|valign="top"|  
...
+
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.
 
|}
 
|}
 
<hr width="100%">
 
<hr width="100%">
Linia 28: Linia 30:
 
|valign="top" width="500px"|[[Grafika:PNP_M3_S05.png]]
 
|valign="top" width="500px"|[[Grafika:PNP_M3_S05.png]]
 
|valign="top"|  
 
|valign="top"|  
...
+
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.
 
|}
 
|}
 
<hr width="100%">
 
<hr width="100%">
Linia 34: Linia 36:
 
|valign="top" width="500px"|[[Grafika:PNP_M3_S06.png]]
 
|valign="top" width="500px"|[[Grafika:PNP_M3_S06.png]]
 
|valign="top"|  
 
|valign="top"|  
...
+
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.
 
|}
 
|}
 
<hr width="100%">
 
<hr width="100%">
Linia 64: Linia 68:
 
|valign="top" width="500px"|[[Grafika:PNP_M3_S11.png]]
 
|valign="top" width="500px"|[[Grafika:PNP_M3_S11.png]]
 
|valign="top"|  
 
|valign="top"|  
...
+
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.
 
|}
 
|}
 
<hr width="100%">
 
<hr width="100%">
Linia 82: Linia 90:
 
|valign="top" width="500px"|[[Grafika:PNP_M3_S14.png]]
 
|valign="top" width="500px"|[[Grafika:PNP_M3_S14.png]]
 
|valign="top"|  
 
|valign="top"|  
...
+
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.
 
|}
 
|}
 
<hr width="100%">
 
<hr width="100%">
Linia 88: Linia 100:
 
|valign="top" width="500px"|[[Grafika:PNP_M3_S15.png]]
 
|valign="top" width="500px"|[[Grafika:PNP_M3_S15.png]]
 
|valign="top"|  
 
|valign="top"|  
...
+
hello jest adresem początku łańcucha. hello_len jest stałą zdefiniowaną w programie – nie zajmuje ona miejsca w pamięci.
 
|}
 
|}
 
<hr width="100%">
 
<hr width="100%">

Aktualna wersja na dzień 20:52, 15 paź 2006


PNP M3 S01.png

...


PNP M3 S02.png

...


PNP M3 S03.png

...


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.


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.


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.


PNP M3 S07.png

...


PNP M3 S08.png

...


PNP M3 S09.png

...


PNP M3 S10.png

...


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.


PNP M3 S12.png

...


PNP M3 S13.png

...


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.


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.


PNP M3 S16.png

...


PNP M3 S17.png

...