(10-04-2012 15:11)SP4EJT napisał(a): No właśnie ... zupełnie nie wiem jak w praktyce dobrać się do tego stosu. Wiem tylko że służy do odkładania wartości rejestrów, a potem pobierania ich z powrotem ale poco ? i jak to wszystko ogarnąć ? nie mam pojęcia ...
STOS w mikroprocesorach to specjalny sprzętowo-programowy mechanizm zarządzania dostępem do pamięci danych. Część operacji na stosie wykonywana jest sprzętowo przez rdzeń procesora a część programowo w trakcie realizacji programu. Bajty (dane, adresy) są układane w pamięci w specyficzny sposób, tak jak na stosie, ostatnio położony bajt musi być pobrany jako pierwszy. Stos to określony fragment pamięci SRAM procesora wskazywany przez wskaźnik stosu SP. W procesorach 8051 stos rośnie w górę pamięci RAM, w procesorach AVR naleje dlatego ustawiany jest na końcu pamięci SRAM. Jeśli w programie używamy wywołań funkcji lub mamy obsługę przerwań wskaźnik stosu musi być ustawiony na początku programu. W procesorach o małej pomięci SRAM należy "oszacować" zapotrzebowanie na wielkość stosu. Spotkanie wskaźnika stosu z lokacją zmiennych będzie źródłem sporych kłopotów.
Wskaźnik SP zawsze pokazuje wolny bajt na stosie. Dostęp do danych na stosie możemy mieć poprzez rozkazy pobierania i odkładania danych (PUSH, POP) lub poprzez adresowanie pamięci SRAM, tak jak do typowej zmiennej. Niestety manipulowanie danymi na stosie oraz na wskaźniku stosu wymaga dużego doświadczenia. Przy programowaniu w assemblerze takie zabiegi pozwalają robić ciekawe "sztuczki" jak: przekazywanie danych, podmiana adresu powrotu itd.
W językach wysokopoziomowych występuje dodatkowo stos danych wykorzystywany do przekazywania parametrów do wywoływanych funkcji. Oba stosy są rozłączne, mają odrębne wskaźniki i pracują niezależnie od siebie.
Obsługa sprzętowa stosu
Dobrym przykładem na wyjaśnienie roli stosu jest wywołacie w programie obsługi jakiejś funkcji ( CALL). Obsługa programu jest przekazywana do kodu funkcji po czy musi ona powrócić w miejsce jej wywołania. Aby procesor wiedział w które miejsce programu ma wrócić na stos odkładany jest adres powrotu z funkcji. Po wykonaniu rozkazu (RET) adres jest pobierany ze stosu i wykorzystany do poprawnego powrotu. Odkładanie i pobieranie adresu wykonywane jest sprzętowo przez CPU bez naszego udziału.
Kolejnym przykładem jest obsługa przerwań. Po wykryciu przerwania procesor przekazuje sterowania według wektora przerwań do procedury obsługi przerwania. Przerwanie może pojawić się w dowolnym momencie wykonywania programu głównego, jakiejś funkcji lub obsługi innego przerwania. Aby procesor wiedział gdzie wrócić po zakończeniu obsługi przerwania musi odłożyć na stosie adres powrotu. W rozbudowanych programach na stosie może w tym samym momencie być kilkanaście różnych adresów powrotów oddzielonych dodatkowo chronionymi rejestrami.
Obsługa programowa stosu
Procesor ma ograniczoną ilość rejestrów do wykorzystania w programie. Bardzo często podczas wywołania kolejnych funkcji nie chcemy niszczyć pierwotnej zawartości pewnych rejestrów a musimy z nich korzystać w programie funkcji. Wtedy pomocny jest stos na którym możemy przechować stan tych rejestrów za pomocą rozkazów PUSH. Po zakończeniu wykonywania funkcji przywracamy zawartość naruszonych rejestrów rozkazami POP.
Ktoś może słusznie zauważyć, że rejestry możemy zapamiętywać w pamięci SRAM procesora i będzie miał po części rację. Stos jest mechanizmem szybszym bardziej elastycznym, efektywniejszym niż adresowany dostęp do zmiennych w SRAM. O ogromnej roli stosu przekonamy się podczas pisania programu obsługującego kilka przerwań sprzętowych.