Zerknijmy na to, jaką pamięć mamy w 8051.
Mamy pamięć wewnętrzną. Każdy 8051 ma pamięć wewnętrzną, składającą się z RAMu i SFR1). Może mieć również wewnętrzną pamięć kodu - np jakiś EEPROM - i wtedy nie musi sięgać na zewnątrz po kod programu.
Zerknijmy na pamięć wewnętrzną w 8051. Pierwsze 0x20h bajtów to banki rejestrów. Mamy do nich dostęp albo bezpośrednio, za pomocą adresu w pamięci, albo odwołując się do nich jak do rejestrów (tzn R0, R1 itp). Warto zwrócić uwagę na to, że manipulując w SFR można wybrać, z którego banku się aktualnie korzysta.
Niżej mamy pamięć, którą możemy adresować bitowo. Przyjemna i wygodna sprawa.
Jeszcze niżej, na żółto, znajduje się przestrzeń pamięci ogólnego przeznaczenia, w której również może znajdować się stos. Z tym stosem to jednak jest grubsza sprawa.
Po inicjacji wskaźnik stosu jest ustawiany na 0x07h. Tak, to będzie R7 w zerowym banku rejestrów. To dlatego, że SP wskazuje na obecny element na stosie, czyli następne elementy są wstawiane dalej. Co więcej, SP jest inkrementowany. Stos w 8051 rośnie w górę, a nie w dół.
Kłopot zaczyna się w momencie, gdy chcemy korzystać z innych banków rejestrów. Pierwszy element na stosie wyląduje przecież w 0x08h, a to jest R0 z pierwszego banku rejestrów. Rozwiązanie jest proste - trzeba na początku ustawić SP na jakąś odleglejszą wartość, np 0x30h. Problemem oczywiście jest wtedy mniejsza pojemność stosu, ale z tym musimy już jakoś sobie poradzić.
SFR zawiera rejestry specjalnego przeznaczenia. Niektóre są nawet adresowane bitowo! Znajdziemy tam m.in. porty od P0 do P3, akumulator, rejestr B2), kontrolę licznika czasu, DPTR itp. Więcej informacji można znaleźć w 8051_tutorial.pdf.
Dlaczego tam jest tyle wolnych miejsc? Żeby było gdzie wsadzić nowe elementy dodawane przy rozbudowie 8051 w nowe wersje, których było dość dużo.
SFR może być adresowany tylko za pomocą trybu adresowania bezpośredniego.