Kurs Assemblera cz. 3

ASEMBLER 6502
Czyli adresowanie indeksowane oraz pośrednie i co z tego wynika.

Czym właściwie jest adresowanie? Zadaję to pytanie nie bez powodu, chociaż, na dobrą sprawę, bez dokładnej znajomości tego terminu można się doskonale obejść. Jednak jasne i jednoznaczne wyłożenie tej kwestii może być zwyczajnie dużym uproszczeniem w tłumaczeniu różnych spraw z programowaniem związanych. O trybach nie wspominałem na początku naszych spotkań po prostu dlatego, że nie wydawało się to konieczne. Teraz jednak tłumaczenie coraz bardziej zawiłych problemów bez wprowadzenia tej terminologii staje się coraz trudniejsze. Dlatego też postanowiłem poświęcić dzisiejszy artykuł właśnie trybom adresowania.

Zacznijmy więc jeszcze raz: Czym właściwie jest adresowanie? Adresowanie to sposób podania komputerowi informacji o tym, jak każdy rozkaz ma być wykonany. Jeżeli dalibyśmy rozkaz np. LDA 39, to niekoniecznie byłoby wiadomo, o co nam właściwie chodzi. Dlatego też zostały opracowane różne tryby adresowania. Jeżeli przed liczbą (argumentem) postawimy znak „#”, to jako argument będzie pobrana liczba, którą wpisaliśmy za rozkazem. Ten tryb adresowania nazywamy absolutnym lub natychmiastowym. Na przykład jeśli wydamy rozkaz LDA # $98 to w akumulatorze znajdzie się szesnastkowa liczba 98.

Kolejnym prostym trybem adresowania jest adresowanie bezpośrednie (ang. immediate). Podana po rozkazie liczba jest przez komputer traktowana jako adres, pod którym ma szukać argumentu. Jeśli więc napiszemy LDA $3000, komputer odszuka w pamięci komórkę o adresie szesnastkowym 3000 (dziesiętnie 12288) a następnie jej zawartość wczyta do akumulatora. Analogicznie dzieje się, kiedy napiszemy STA $1000. Wtedy zawartość akumulatora zostanie wpisana do komórki o adresie $1000 (4096).

Szczególną odmianą tego adresowania jest adresowanie strony zerowej, czyli pierwszych 256 komórek pamięci. Jej odmienność polega na tym, że do adresowania strony zerowej potrzebna jest tylko jedna komórka. Właśnie dlatego strona zerowa jest tak często przez programistów wykorzystywana – daje to czasem duże oszczędności czasowe.

Innym trybem adresowania jest adresowanie pośrednie. Jego idea polega na tym, że adres podany po rozkazie JMP (bo JMP jest JEDYNYM rozkazem, który może być tak adresowany) jest dla komputera adresem pod którym znajduje się adres (w postaci młodszego i starszego bajtu) procedury, do której należy skoczyć. Wygląda to np. tak: JMP ($0314). Pod adresem znajduje się wektor, który wskazuje na komórkę, do której trzeba skoczyć (zwykle w tym przypadku $ea31).

Jakieś dwa miesiące temu rozmawialiśrny trochę o tym, jak wydrukować na ekranie napisy. Robiliśmy to jeszcze bez użycia różnych procedur zapisanych w ROM komputera. Jak zapewne pamiętacie, używaliśmy do tego celu rejestru X jako rejestru pomocniczego. Właśnie operacje w rodzaju LDA $AAAA,X albo STA $BBBB,X nazywamy operacjami indeksowanymi. Zaś takie podanie instrukcji LDA lub np. STA nazywane jest adresowaniem indeksowanym. Indeksować można też oczywiście i inne rozkazy, ale o tym – potem. Przypomnę jeszcze tylko znaczenie takiego adresowania. Rozkaz LDA 10000,X oznacza dla komputera, że do akumulatora ma wstawić liczbę, która znajduje się w komórce o adresie obliczonym przez dodanie 10000 do zawartości rejestru X. Rozkazy LDA i STA można również indeksować drugim z rejestrów pomocniczych, Y.

Dwa kolejne tryby adresowania nie są już takie oczywiste. Tryby te to pośredni postindeksowany i pośredni preindeksowany. Adresowanie postindeksowane ma składnię LDA ($fb),y. Liczba podana po rozkazie jest tu miejscem, w którym znajduje się adres w pamięci. Do adresu tego trzeba dodać jeszcze zawartość rejestru Y i dopiero ta liczba wskazuje lokację pamięci, z której należy pobrać liczbę do akumulatora. Do tego indeksowania można zastosować wyłącznie rejestr Y. Adresowanie preindeksowane polega na tym, do liczby po rozkazie dodajemy jeszcze zawartość rejestru X i ta suma jest adresem komórki, której zawartość wstawiamy do akumulatora. Składnia wygląda tak: LDA ($f0, X) i trzeba pamiętać, że do indeksowania można użyć wyłącznie rejestru X. Moim skromnym zdaniem, tryb ten jest dość mało praktyczny.

W rozkazach skoków warunkowych, jak np. poznane już przez nas BEQ i BNE, mimo tego, że podajemy pełne adresy pod które należy skoczyć, komputer przechowuje tylko liczbę komórek o którą musi przeskoczyć w tył lub w przód. Dlatego też nazywamy ten tryb adresowaniem względnym.

Dwa ostatnie tryby, które zostały nam do omówienia są stricte wewnętrzne i użytkownik ma na nie znikomy wpływ. Pierwszy to adresowanie akumulatora i obejmuje wszystkie operacje wykonywane na samym akumulatorze, bez udziału pamięci. Drugi zaś – to adresowanie niejawne. Należą do niego podobne rozkazy, np. poznany przez nas INX. Zwiększa on zawartość rejestru X 0 1 i wcale nie interesuje nas, gdzie we wnętrzu komputera znajduje się komórka, której rozkaz ten dotyczy. Do rodzinki tej należą jeszcze NOP, RTS, BRK i inne tego typu rozkazy.

Wiem, że podanie wszystkich trybów adresowania było troszkę „na wyrost”, ale na pewno przyda się później. Przepraszam, że może byłem tym razem trochę nudnawy i nie podałem listingów przykładowych, ale taka solidna dawka teorii zaprocentuje na pewno w przyszłości.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *