Komputery i sieci - podstawy
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.
Rys. 5. Segmentacja pamięci; segment jest podobny do „okienka” przesuwanego w górę i w dół pamięci, ze skokiem 16