Rejestr stosu - Stack register

Wskaźnik stosu jest komputer centralny rejestr procesora , którego celem jest, aby śledzić na stosie wywołań . Na maszynie opartej na architekturze akumulatorowej może to być dedykowany rejestr, taki jak SP na maszynie Intel x86 . Na maszynie rejestru ogólnego może to być rejestr, który jest zarezerwowany przez konwencję, na przykład na maszynach PDP-11 lub RISC . Niektóre projekty, takie jak Data General Eclipse, nie miały dedykowanego rejestru, ale wykorzystywały zarezerwowany adres pamięci sprzętowej dla tej funkcji.

Maszyny sprzed późnych lat sześćdziesiątych - takie jak PDP-8 i HP 2100 - nie miały kompilatorów obsługujących rekursję . Ich instrukcje podprogramów zwykle zapisywałyby bieżącą lokalizację w adresie skoku, a następnie ustawiały licznik programu na następny adres. Chociaż jest to prostsze niż utrzymywanie stosu, ponieważ w każdej sekcji kodu podprogramu znajduje się tylko jedna lokalizacja powrotu, rekursja nie może wystąpić bez znacznego wysiłku ze strony programisty.

Maszyna stosowa ma 2 lub więcej rejestrów stack - jeden z nich śledzi na stosie wywołań , inne (s) utwór utrzymanie drugiej stosu (S).

Rejestry stosu w x86

W 8086 główny rejestr stosu nazywany jest wskaźnikiem stosu - SP. Rejestr segmentu stosu (SS) jest zwykle używany do przechowywania informacji o segmencie pamięci, który przechowuje stos wywołań aktualnie wykonywanego programu. SP wskazuje na aktualny szczyt stosu. Domyślnie stos powiększa się w pamięci, więc nowsze wartości są umieszczane pod niższymi adresami pamięci. Aby umieścić wartość na stosie, PUSH używana jest instrukcja. Aby zdjąć wartość ze stosu, POP używana jest instrukcja.

Przykład : Zakładając, że SS = 1000h i SP = 0xF820. Oznacza to, że aktualny szczyt stosu to adres fizyczny 0x1F820 (wynika to z segmentacji pamięci w 8086 ). Kolejne dwie instrukcje maszynowe programu to:

PUSH AX
PUSH BX
  • Ta pierwsza instrukcja wypycha wartość przechowywaną w AX (rejestr 16-bitowy) na stos. Odbywa się to poprzez odjęcie wartości 2 (2 bajty) od SP.
  • Nowa wartość SP to 0xF81E. Następnie CPU kopiuje wartość AX do słowa pamięci, którego adres fizyczny to 0x1F81E.
  • Po wykonaniu „PUSH BX” SP jest ustawiane na 0xF81C, a BX jest kopiowane na 0x1F81C.

To ilustruje, jak działa PUSH. Zwykle uruchomiony program wypycha rejestry do stosu, aby wykorzystać je do innych celów, takich jak wywołanie procedury, która może zmienić bieżące wartości rejestrów. Aby przywrócić wartości zapisane na stosie, program powinien zawierać instrukcje maszynowe, takie jak:

POP BX
POP AX
  • POP BX kopiuje słowo w 0x1F81C (które jest starą wartością BX) do BX, a następnie zwiększa SP o 2. SP teraz wynosi 0xF81E.
  • POP AX kopiuje słowo z 0x1F81E do AX, a następnie ustawia SP na 0xF820.

Silnik stosu

Prostsze procesory przechowują wskaźnik stosu w zwykłym rejestrze sprzętowym i używają arytmetycznej jednostki logicznej (ALU) do manipulowania jego wartością. Zwykle push i pop są tłumaczone na wiele mikrooperacji , aby oddzielnie dodawać / odejmować wskaźnik stosu i wykonywać ładowanie / przechowywanie w pamięci.

Nowsze procesory zawierają dedykowany silnik stosu, który optymalizuje operacje stosu. Pentium M był pierwszym procesorem x86, który wprowadził silnik stosu. W jego implementacji wskaźnik stosu jest podzielony na dwa rejestry: ESP O , który jest rejestrem 32-bitowym, oraz ESP d , 8-bitową wartość delty, która jest aktualizowana bezpośrednio przez operacje na stosie. PUSH, POP, CALL i RET rozkazy działają bezpośrednio z ESP d zarejestrować. Jeśli ESP d jest bliski przepełnienia lub do rejestru ESP odwołuje się inne instrukcje (gdy ESP d ≠ 0), wstawiana jest mikrooperacja synchronizacji, która aktualizuje ESP O za pomocą jednostki ALU i resetuje ESP d do 0. Ten projekt pozostał w dużej mierze niezmodyfikowany w późniejszych procesorach Intela, chociaż ESP O został rozszerzony do 64 bitów.

Silnik stosu podobny do silnika Intela został również zastosowany w mikroarchitekturze AMD K8 . W Bulldozerze usunięto potrzebę synchronizacji mikrooperacji, ale wewnętrzna konstrukcja silnika stosu nie jest znana.

Uwagi

Bibliografia