Pamięć danych, stos

Wewnętrzna pamięć danych (ang. internal data memory) zawarta w układzie mikrokomputera ma pojemność 64, 128 lub 256 słów 8-bitowych, w zależności od typu układu. Jest ona najdogodniejsza do zapamiętywania argumentów i wyników wszelkiego rodzaju obliczeń. Większość rozkazów przesłań dotyczy tej pamięci. To z niej są pobierane dane do większości dwuargumentowych operacji arytmetycznych i logicznych. Ponadto, w ramach osobnej przestrzeni adresowej można dołączyć do układu zewnętrzną pamięć danych (ang. external data memory) o pojemności 256 słów. Programowy dostęp do tej pamięci (przesłanie danych) jest możliwy tylko za pomocą rozkazów MOVX. Zasady dołączania i wykorzystania zewnętrznej pamięci danych opisano w kolejnym rozdziale.

Organizację wewnętrznej pamięci danych pokazano na rys.

      8051 - 255 +-----------------+        
8049, 8749 - 127 |                 |
8048, 8747 -  63 |                 |
              .. |                 |
              .. |      Pamięć     |
              .. |   użytkownika   |
              .. |                 |
              .. |                 |
              32 |                 |
                 +-----------------+
              31 |       R7        | \
              .. +-----------------+ |
              .. |       R6        | |
              .. +-----------------+ |
              .. |       R5        | |  
              .. +-----------------+ |  Zbiór rejetrów 1
              .. |       R4        |  \
              .. +-----------------+  / (BS=1)
              .. |       R3        | |
              .. +-----------------+ |
              .. |       R2        | |
              .. +-----------------+ |
              .. |       R1        | |
              .. +-----------------+ |
              24 |       R0        | /                   
                 +-----------------+
              23 |   8-poziomowy   |
              .. |      stos       |
              .. |      lub        |
              .. |     pamięć      |
               8 |   użytkownika   | 
                 +-----------------+
               7 |       R7        | \
                 +-----------------+ |
                 |       R6        | |
                 +-----------------+ |
                 |       R5        | |  
                 +-----------------+ |  Zbiór rejetrów 0
                 |       R4        |  \
                 +-----------------+  / (BS=0)
                 |       R3        | |
                 +-----------------+ |
                 |       R2        | |
                 +-----------------+ |
                 |       R1        | |
                 +-----------------+ |
               0 |       R0        | /                   
                 +-----------------+
Cała pamięć może być adresowana pośrednio, za pomocą wskaźników danych, o których będzie mowa za chwilę. Niektóre części pamięci mają specjalne znaczenie.

Słowa o adresach od 0 do 7 i od 24 do 31 stanowią dwa zbiory uniwersalnych rejestrów roboczych (ang. working register) od R0 do R7. Rejestry te mogą być adresowane bezpośrednio (np. rozkaz MOVA, R1), co znacznie ułatwia operowanie ich zawartością. Rejestry R0 i R1 pełnią ponadto funkcję wspomnianych wyżej wskaźników danych (ang. data pointers) do adresowania całej pamięci danych.

W danej chwili jest dostępny - przez adresowanie bezpośrednie - tylko jeden zbiór rejestrów, wskazany przez jednobitowy wskaźnik zbioru rejestrów (ang. register bank switch) - BS - zawarty w słowie stanu PSW. Jego stan może być zmieniany programowo, za pomocą rozkazu SEL RB. Drugi zbiór rejestrów może być używany jako rozszerzenie pierwszego. Może być też przeznaczony do wykorzystania w programach obsługi przerwań lub podprogramach, jeśli istotne jest zachowanie zawartości rejestrów zbioru pierwszego, używanych w programie głównym.

Część pamięci danych, o adresach od 8 do 23, jest przeznaczona na 8-poziomowy stos (ang. stack). Jest on na stałe zlokalizowany w pamięci, a przeznaczony nań obszar wyznacza maksymalny dopuszczalny poziom zagnieżdżania (ang. nesting) podprogramów i przerwań (osiem).

Adres stosu jest wyznaczony przez 3-bitowy wskaźnik stosu (ang. stack pointer) - SP - zawarty w słowie stanu (bity 0-3). Wskaźnik stosu wskazuje pierwszą wolną dwubajtową pozycję na stosie, o adresach 8 + 2 * SP i 8 + 2 * SP + 1. Podczas zerowania mikrokomputera (RESET) wskaźnik stosu jest także zerowany.

Na rysunku poniżej pokazano organizację stosu. W czasie wykonywania rozkazu skoku do podprogramu (CALL) oraz przy przyjęciu przerwania, na stos zapisują się automatycznie licznik rozkazów i bity 4-7 słowa stanu. Przy zapisywaniu wartość wskaźnika stosu zwiększa się o 1, przy czym jest to dodawanie mod 8; po stanie 111 następuje 000. Zatem w przypadku przepełnienia stosu ( przekroczenia maksymalnego poziomu zagnieżdżeń) następuje wyzerowanie wskaźnika stosu i zapisywanie na stosie od początku, a więc zniszczenie zapisanych wcześniej danych.

                          Adres
--------+-----------------+
        |        |        | 23
 SP=111 |--------+--------| 
        |        |        | 22
--------+-----------------+
        |        |        | 21
 SP=110 |--------+--------| 
        |        |        | 20
--------+-----------------+
        |        |        | 19
 SP=101 |--------+--------| 
        |        |        | 18
--------+-----------------+
        |        |        | 17
 SP=100 |--------+--------| 
        |        |        | 16
--------+-----------------+
        |        |        | 15
 SP=011 |--------+--------| 
        |        |        | 14
--------+-----------------+
        |        |        | 13
 SP=010 |--------+--------| 
        |        |        | 12
--------+-----------------+
        |        |        | 11
 SP=001 |--------+--------| 
        |        |        | 10
--------+-----------------+
        |PSW 7-4 | PC 11-8|  8
 Sp=000 |--------+--------|
        | PC 7-4 | PC 3-0 |  9
--------+-----------------+

Pobieranie informacji ze stosu następuje w wyniku wykonania rozkazów powrotu RET lub RETR. Rozkaz RET powoduje - zdjęcie - ze stosu i odtworzenie tylko stanu licznika rozkazów, rozkaz RETR natomiast - odtwarza stan licznika rozkazów oraz słowo stanu. W czasie realizacji tych rozkazów, przed wykonaniem operacji pobrania informacji, wartość wskaźnika stosu zmniejsza się o 1.

Ponieważ na stosie zapisuje się (i odtwarza) zawartość wszystkich 12 bitów licznika rozkazów, jest możliwy skok do podprogramu do drugiego tomu pamięci i powrót do miejsca skoku. Należy przy tym pamiętać, że przy powrocie nie zmienia się wskaźnik tomu DBF. Jeżeli w obrębie bieżącego tomu ma być wykonany kolejny skok (JMP lub CALL), to należy programowo zmienić wskaźnik tomu.

Poza wymienionymi wyżej operacjami na stosie nie są możliwe żadne inne, jak np. zapisywanie stanu akumulatora czy rejestrów.

Jeżeli w danym systemie poziom zagnieżdżenia jest niższy niż osiem, to nie wykorzystany obszar stosu może być używany jako normalna pamięć, adresowana za pomocą wskaźników R0 lub R1.

Powrót