22
2. Mikroprocesory 8086/8088
jest niezależny od innych segmentów i jest programowo zdefiniowany przez adres po-czątku segmentu. Adres ten jest określony zawartością rejestrów segmentowych CS, DS, SS i ES. Ponieważ są to rejestry 16-bitowe, a fizyczna pamięć omawianych procesorów wymaga 20 bitów adresu, poszczególne segmenty nie mogą rozpoczynać się od dowolnego adresu. 20-bilowy adres początku segmentu uzyskuje się przesuwając w lewo o 4 bity zawartość określonego rejestru segmentowego. Tak więc adres początku segmentu musi być podzielny bez reszty przez 16, co oznacza, że najmniej znaczące 4 bity adresu są stale równe zero, a odstęp między dwoma adresami początków segmentów może być jedynie wielokrotnością liczby 16. Nic ma żadnych innych ograniczeń na zdefiniowanie w pamięci operacyjnej poszczególnych segmentów logicznych. W szczególności mogą one być umiejscowione jeden po drugim w sposób ciągły lub z przerwą, czy też nakładać się na siebie całkowicie lub częściowo. Program użytkowy może zdefiniować w dowolny sposób wiele segmentów logicznych (rys. 2.7), jednak w danym momencie dostęp jest możliwy jedynie do czterech segmentów wskazywanych przez rejestry segmentowe. W wielu prostych programach użytkowych definiuje się tylko raz, na początku, zawartość rejestrów CS, DS, SS, ES, uzyskując 64 KB pamięci dla programu, 64 KB dla stosu oraz 128 KB dla danych. Segmentowa struktura pamięci mikroprocesorów 8086/8088 narzuca, ale równocześnie znacznie ułatwia
Adresy fizyczne
Rys. 2.7. Przykładowa organizacja segmentów w programie
modularną konstrukcję programów. Pozwala na dosyć swobodne przemieszczanie w pamięci uruchomionych programów; ułatwia rozwiązanie wielu złożonych problemów programowania (np. w systemach wielodostępnych).
Obliczanie adresu fizycznego
Z każdą lokacją pamięci jest związany adres fizyczny oraz adres logiczny. Adres fizyczny stanowi 20-bitowa liczba pozwalająca na jednoznaczny wybór jednego bajtu
2.5. Organizacja pamięci operacyjnej
t jednomegabajtowej przestrzeni adresowej (00000H - OFFFFFH). Adr używany do każdej wymiany danych między procesorem a pamięcią operacyjną.
W programach zasadniczo wykorzystuje się adresy logiczne (rys. 2.8). Dzięki temu programy mogą być tworzone bez konieczności ostatecznego definiowania adresu, od którego będą ładowane do pamięci. Każdy adres logiczny składa się z ajresu początku segmentu zdefiniowanego zawartością właściwego rejestru segmentowego oraz adresu względem początku segmentu - przesunięcia, zwanego dalej krótko offsetem (ang. offset). Offset jest 16-bitową liczbą bez znaku; wielkość segmentu nie może przekraczać 64 KB.
Adres
fizyczny
00001H )H
iiiii
Rys. 2.8. Adres logiczny i fizyczny
Pamięć
Adres logiczny
Offset = 5H | ||
014AH | ||
014A6H
014A5H
014A4H
014A3H
014A2H
014A1H
014A0H
0149FH
Adres fizyczny
4F543H
4F540H
4F530H
Rys. 2.9. Różny sposób zaadresowania tego samego baj tu
Wiele adresów logicznych może wskazywać ten sam bajt w pamięci (rys. 2.9). Układ sterowania magistral BIU obsługując komunikację między procesorem a pamięcią, oblicza adres fizyczny w sposób pokazany schematycznie na rys. 2.10. W zależności od rodzaju wykonywanej operacji, źródłem adresu logicznego mogą być