4. Instrukcje bajtowej wymiany danych 29
Grupa rozkazów MOVX dotyczy wymiany danych między mikroprocesorem i zewnętrzną pamięcią RAM. Jedynymi rejestrami, które biorą udziai w tej wymianie są akumulator, rejestry RO ł R1 oraz wskaźnikowy rejestr danych (DPTR). Oba rejestry procesora RO l Rl są 8-bitowe, a wskaźnikowy rejestr danych (DPTR) 16-bitOwy. Dlatego adresując pamięć za pomocą rejestrów Ri można zaadresować bezpośrednio jedynie 256 komórek zewnętrznej pamięci RAM. Stosując wskaźnikowy rejestr danych (DPTR) można adresować całą dostępną przestrzeń zewnętrznej pamięci RAM (64 kBajty). Należy przy tym pamiętać, że mikroprocesor komunikując się z zewnętrzną pamięcią RAM wykorzystuje do jej pełnego adresowania 8 Unii portu P2, który zawiera bardziej znaczącą część 16-bitowego adresu. Część mniej znacząca adresu multipleksowana z przesyłanymi danymi pojawia się na liniach portu PO (rysunek 2-9). Stosując adresowanie rejestrowe, używając rejestrów Rj, bardziej znaczącą część adresu należy przesyłać za pośrednictwem portu P2 (rysunek 2*10). W obu przypadkach sygnały zapisu WR# i odczytu RD# danych do/z pamięci pojawiają się na Uniach portu 1*3 (P3.6-WR#, 1*3.7*RD#).
Dwa rozkazy przesyłania danych MOVC pozwalają na pobieranie argumentów z pamięci kodu programu (pamięci ROM/EPROM). Dane mogą być tylko przesłane do akumulatora i transmisja w odwrotnym kierunku nie jest możłiwa (pamięć tylko do odczytu). Zadaniem obu rozkazów jest pobranie stałych zawartych w pamięci kodu programu (ROM/EPROM). Zaproponowany sposób adresowania pamięci kodu programu jest szczególnie polecany do odczytu deklarowanych w programie tablic o długości do 256 bajtów. W obu rozkazach bierze udział jedynie akumulator oraz wskaźnikowy rejestr danych (DPTR) lub licznik rozkazów (PC). W akumulatorze znajduje się wartość przesunięcia w tablicy, a po zakończeniu instrukcji odczytany z pamięci programu argument Adres punktu początkowego tablicy przekazywany jest przez wskaźnikowy rejestr danych (DPTR) lub licznik rozkazów (PC).
Na przykład wykonanie ciągu instrukcji w programie głównym:
MOV A.ffParametr ;A <= Parametr, Parametr=l lub 2 LCALLTablica .wywołanie podprogramu o nazwie Tablica
i podprogramie:
Tablica:
MOVC A.&A+PC RET
DB 10H DB 20H
;podprogram o nazwie Tablica ;Ac= (A+PC), A=1UH lub 20H ;povyrót z podprogramu Tablica ;wartość dla Parametru=l ;wartość dla Parametru=2
powoduje.że w akumulatorze znajduje się wartość 1011, jeśli Parametr* 1, lub wartość 20H. jeśli Parametr*2. Podanie jako parametru wartości zerowej powoduje, że w akumulatorze znajdzie się kod rozkazu RET, czyli wartość 22H.
Przykład 1:
Przykład 2:
adres
pamięci
kodu
programu:
0801H
0800H
07FFH
07FEH
07FDH
0E6H
0F8H
01H
"Ó1H
instrukcja:
MOV A.©R0 MOV R0.A
AJMP 1
adres
pamięd
kodu
programu:
0003
0002
0001
0000
0E8H
78H
64H
MOV A.R0
MOV A.#78H NOP
0801H 0800H 07FFH 07FEH 07FDH
0E8H
0F8H
01H
“OIH
instrukcja:
MOV A.@R0 MOV RO.A
AJMP 1 NCP
0003
0002
0001
0000
0E8H
78H
64H
MOV A.RO
MOVA.#78H
NOP
W drugim przypadku po pobraniu rozkazu AJMP 1 stan PC jest równy PC = 0800H, a po zmianie 11 najmniej znaczących bitów PC = 0801H.
stan licznika rozkazów (PC) przed zamianą = 0000 1000 (XXX) (XXK)B
Adr 11 «» _000 0000 0001B
stan licznika rozkazów (PC) po zamianie = 0000 1000 0000 0001B
Jako następna zosJanie wykonana instrukcja MOV A,@R0 o adresie 0801H.
Zadaniem instrukcji RET jest powrót z podprogramu do programu, z którego wystąpiło wywołanie. Rozkaz ten wpisuje do licznika rozkazów (PC) dwa bajty znajdujące się na szczyde stosu, a wskaźnik stosu (5P) jest dwukrotnie dekrementowany. W porównaniu z instrukcją CALL przesyłanie zawartości szczytu stosu do licznika rozkazów dokonywane jest w odwrotnej kolejności. Podobny charakter jak instrukcja RET ma rozkaz RETI. Głównym jej celem jest uaktywnienie wewnętrznego układu struktury przerwań.
Pełna listę rozkazów skoków i wywołań podprogramów wraz z komentarzami i przykładami przedstawiono w dalszej częśd opracowania.