1.9 Stos

Stos jest pewną strukturą organizacji danych, którą równie dobrze można nazwać kolejką LIFO. Podstawowym założeniem jest to, że stos może przechowywać elementy o określonym rozmiarze. W przypadku stosu 16 bitowego są to po prostu wartości liczbowe 16 bitowe (2 bajty), inaczej słowa bitowe. Stos o rozmiarze słów jest stosowany w trybie rzeczywistym i taki właśnie stos postaram się tutaj opisać. Na stosie można wykonać dwa zasadnicze działania, można na niego odłożyć pewien element lub go pobrać. Główną cechą stosu jest to, że zapamiętuje on w jakiej kolejności elementy zostały na niego włożone ponieważ pobieranie elementów ze stosu następuje dokładnie w odwrotnej kolejności w jakiej były na niego wcześniej wkładane. Przy wyjaśnianiu zasady działania stosu najczęściej posługuje się analogią do układania stosu książek. Tak też postaram się to teraz opisać.

Przypuśćmy, że mamy gdzieś na półce książki pooznaczane kolejno literami alfabetu od A do C. Bierzemy teraz pierwszą książkę A i kładziemy poziomo na stole. To jest operacja odłożenia elementu na stos. Stos jest zwykle opisywany jednym parametrem określającym ile jest na nim książek. Ogólniej mówiąc jest to wskaźnik stosu określający jego szczyt. Po odłożeniu książki A wskaźnik stosu wynosi oczywiście 1.

<- wskaźnik
Książka A

 Jako następne dwie operacje odkładamy na stos dwie kolejne książki B i C.

<- wskaźnik
Książka C
Książka B
Książka A

Teraz gdy wykonamy operację pobrania elementu ze stosu zostanie pobrana książka C. Jeżeli chcielibyśmy sprawdzić jaki element jest na samym dnie stosu to musieli byśmy zdjąć z niego wszystkie elementy leżące wyżej. Idea działania takiego stosu wydaje mi się, że nie jest aż tak bardzo skomplikowana. Dla tych którzy pierwszy raz się z nim spotykają może się jednak wydawać iż nie ma dla niego zastosowań. Jednak stos jest najważniejszą strukturą danych procesora co mam nadzieje wyjaśni się w przyszłości.

Stos procesora opisywany jest wskaźnikiem określającym adres w przestrzeni pamięci RAM. Wskaźnik ten opisywany jest parą rejestrów segment:offset SS:SP. W przeciwieństwie opisanego wcześniej stosu książek stos procesora rośnie w dół. Tak więc jeżeli przykładowo adres stosu wynosi 0x747:0x100 to po odłożeniu na niego wartości 16 bitowej jego wskaźnik zmniejsza się do wartości 0x747:0xFE. Kierunku wzrastania (czy też raczej malenia) stosu nie można zmienić żadnymi ustawieniami procesora. Taki kierunek zapewnia efektywniejsze wykorzystanie pamięci na poziomie systemu operacyjnego gdzie stos zwykle umieszcza się w pamięci o najwyższych adresach.

Bardzo ważne jest aby adres stosu był bez reszty podzielny przez jego standardowy rozmiar danych. Przykładowo w trybie rzeczywistym standardowym typem danych są wartości dwubajtowe tak więc powinna być zachowana równość:

adres_stosu mod 2 = 0, przykładowe adresy 0x100, 0x102, 0x104

analogicznie powinno to wyglądać w trybie 32 bitowym:

adres_stosu mod 4 = 0, przykładowe adresy 0x100, 0x104, 0x108

i w trybie 64 bitowym:

adres_stosu mod 8 = 0, przykładowe adresy 0x100, 0x108, 0x110