8. Architektura mikroprocesora Intel 8086

8.4. Segmentacja pamięci operacyjnej

Pamięć operacyjna z punktu widzenia programisty podzielona jest na tzw. segmenty (spójne fragmenty pamięci) o maksymalnym rozmiarze 64 kB, które mogą na siebie zachodzić.

Procesor 8086 ma 4 rejestry segmentowe CS,DS,SS,ES. Rejestr segmentowy kodu programu CS wskazuje segment, z którego pobierane są kolejne rozkazy do wykonania. Rejestr segmentowy danych DS wskazuje segment, w którym zapamiętywane są dane używane w programie. Rejestr segmentowy stosu SS wskazuje segment pamięci w którym zdefiniowany jest stos. Rejestr segmentu dodatkowy ES wskazuje dodatkowy segment danych

Każde odwołanie się do pamięci musi zawierać adres segmentu, czyli adres początkowy segmentu (symbolicznie oznaczany jako SEGMENT) i przemieszczenie w ramach segmentu (symbolicznie oznaczamy to przemieszczenie symbolem OFFSET).

Powszechnie stosowaną notacją dla oznaczania adresu jest zapisanie najpierw adresu segmentu a za nim po dwukropku przesunięcia.. Pełny fizyczny adres w pamięci operacyjnej notujemy więc w postaci

SEGMENT:OFFSET

przy czym jeden adres fizyczny można przedstawić na wiele sposobów w postaci pary uporządkowanej SEGMENT:OFFSET. Na przykład adres pewnej danej w pamięci operacyjnej możemy zapisać tak: 40H:12H co oznacza, że dana znajduje się w segmencie o adresie 40H a przesunięcie w ramach segmentu wynosi 12H.

Możemy również używać w tym zapisie nazw rejestrów segmentowych. Możemy np. zapisać DS:24 co oznacza, że dana znajduje się w segmencie danych (o adresie: zawartość DS razy 24) z przesunięcie w segmencie równym 24.

Rys. 4. Adresowanie pamięci; adres fizyczny uzyskujemy przez dodanie arytmetyczne 16-bitowego adresu efektywnego (jest to tzw. OFFSET lub przemieszczenie wewnątrz segmentu) do wartości zapisanej w rejestrze segmentu (w kodzie NKB) pomnożonej przez 24; adres efektywny uzyskujemy zależnie od trybu adresowania

Rysunek 4. ilustruje zasadę segmentacji pamięci. Każdy segment zaczyna się na granicy będącej wielokrotnością 16 (a więc 0, 16, 32, 48 itd.) co pozwala zaadresować segmenty 16-bitowym słowem. Tworzenie 20-bitowego adresu fizycznego polega na uzupełnieniu słowa 16-bitowego 4-ma zerami od strony najmniej znaczących bitów.. Procesor automatycznie przyjmuje, że 4 najmłodsze bity z 20-bitowego adresu segmentu są zerami. Odwołując się do danej procesor dodaje do 20-bitowego adresu segmentu 16-bitowe przesunięcie tej danej w segmencie. Jest to fizyczny adres danej w pamięci operacyjnej.

System operacyjny MS-DOS automatycznie wypełnia rejestry CS, ES, i SS. Natomiast o rejestr DS program użytkownika musi zadbać sam, tzn. program użytkownika musi sam załadować rejestr DS adresem segmentu danych programu. Jeśli dane programu nie mieszczą się w 64 kB obszarze pamięci przeznaczonej standardowo na dane, to program użytkownika musi sam modyfikować zawartość rejestrów DS i ES.

Rys. 5. Segmentacja pamięci; segment jest podobny do „okienka” przesuwanego w górę i w dół pamięci, ze skokiem 16