Opis instrukcji mikroprocesora Z80


Kody operacyjne instrukcji

Ten rozdział opisuje każdą z instrukcji mikroprocesora Z80, udostępniając dla nich tablicowe listingi kodów operacyjnych. W każdej z tych tablic kody operacyjne umieszczone w cieniowanych komórkach są identyczne z kodami dla mikroprocesora 8080A. Również dla każdej instrukcji podano mnemonik asemblerowy. Wszystkie kody operacyjne są podane w zapisie szesnastkowym. Kody jednobajtowe wymagają dwóch cyfr szesnastkowych, natomiast kody dwubajtowe wymagają czterech cyfr. Dla wygody tablica 4 przedstawia konwersję pomiędzy systemem szesnastkowym i dwójkowym.

 

Tablica 4. Konwersja szesnastkowo - dwójkowo - dziesiętna

Hex Bin Dec
0 0000 0
1 0001 1
2 0010 2
3 0011 3
4 0100 4
5 0101 5
6 0110 6
7 0111 7
8 1000 8
9 1001 9
A 1010 10
B 1011 11
C 1100 12
D 1101 13
E 1110 14
F 1111 15

 

Mnemoniki instrukcji mikroprocesora Z80 składają się z kodu operacyjnego oraz od zera do dwóch argumentów. Tam, gdzie argument jest implikowany, za kodem instrukcji nie jest umieszczany żaden argument. Instrukcje, zawierające tylko jeden argument logiczny, gdzie jeden z argumentów jest niezmienny (np. w instrukcji logicznego OR), są reprezentowane przez jeden mnemonik argumentu. Instrukcje, zawierające dwa zmienne argumenty, są reprezentowane przez dwa mnemoniki argumentów.

 

Przesłania i wymiana

Tablica 5 definiuje kody operacyjne dla wszystkich 8 bitowych instrukcji przesłań, zaimplementowanych w mikroprocesorze Z80. W tablicy tej również opisany jest rodzaj adresowania dla każdej instrukcji. Źródło danych znajduje się w górnym wierszu, a miejsce docelowe jest określone w lewej kolumnie. Na przykład, przesłanie rejestru B do rejestru C używa kodu operacyjnego 48H. Na wszystkich pozycjach kody operacyjne są podane w systemie szesnastkowym , a kod 48H (dwójkowo 01001000) jest pobierany przez mikroprocesor z pamięci zewnętrznej podczas okresu M1, dekodowany, a następnie mikroprocesor wykonuje automatycznie przesył danych pomiędzy wybranymi rejestrami.

Mnemonikiem asemblerowym dla całej tej grupy jest LD, za którym umieszcza się miejsce docelowe danych i źródło (LD dokąd, skąd). Możliwe jest kilka kombinacji trybów adresowania. Na przykład, źródło może stosować adresowanie rejestrowe, a miejsce docelowe może stosować adresowanie rejestrowe pośrednie, jak przy ładowaniu komórki pamięci wskazywanej parą HL przez zawartość rejestru D. Kodem operacyjnym takiej operacji jest 72H. Mnemonikiem natomiast dla tej instrukcji będzie LD (HL),D.

Nawiasy wokół HL oznaczają, że zawartość HL jest używana jako wskaźnik komórki pamięci. We wszystkich instrukcjach przesłania w asemblerze Z80 miejsce przeznaczenia jest zawsze wymieniane najpierw, za nim następuje źródło danych. Język asemblera Z80 został zdefiniowany w celu ułatwienia programowania. Każda instrukcja dokumentuje się sama, a programy napisane w języku asemblera Z80 są łatwe do analizy i poprawiania.

W tablicy 5 niektóre kody operacyjne, dostępne dla mikroprocesora Z80, używają dwóch bajtów. Ta cecha jest efektywnym sposobem wykorzystania pamięci, ponieważ w Z80 zaimplementowano instrukcje 8-, 16-, 24- i 32-bitowe. Często wykorzystywane instrukcje, takie jak arytmetyczne lub logiczne, są jedynie ośmiobitowe, co daje w wyniku lepsze wykorzystanie pamięci niż przy instrukcjach o stałym rozmiarze, np. 16 bitów.

 

Tablica 5. Grupa instrukcji przesłań 8 bitowych - LD

    Źródło
    Impl. Rejestrowe Rejestrowe pośrednie Indeksowane Rozszerzone Natychmiastowe
Przeznaczenie I R A B C D E H L (HL) (BC) (DE) (IX+d) (IY+d) (nn) n
Rejestrowe A ED
57
ED
5F
7F 78 79 7A 7B 7C 7D 7E 0A 1A FD
7E
d
DD
7E
d
FD
3A
nn
FD
2E
n
B     47 40 41 42 43 44 45 46     DD
46
d
FD
46
d
  DD
D5
n
C     4F 48 49 4A 4B 4C 4D 4E     DD
4E
d
FD
4E
d
  DD
DE
n
D     57 50 51 52 53 54 55 56     DD
56
d
FD
56
d
  DD
1B
n
E     5F 58 59 5A 5B 5C 5D 5E     DD
5E
d
FD
5E
d
  DD
1E
n
H     67 60 61 62 63 64 65 66     DD
66
d
FD
6E
d
  DD
2B
n
L     67 68 69 6A 6B 6C 6D 6E     DD
6E
d
FD
6E
d
  DD
36
n
Rejestrowe
pośrednie
(HL)     77 70 71 72 73 74 75             DD
78
n
(BC)     02                          
(DE)     12                          
Indeksowane (IX+d)     DD
77
d
DD
70
d
DD
71
d
DD
72
d
DD
73
d
DD
74
d
DD
75
d
            DD
36
d
n
(IY+d)     FD
77
d
FD
70
d
FD
71
d
FD
72
d
FD
73
d
FD
74
d
FD
75
d
            FD
36
d
n
Rozszerzone (nn)     32
nn
                         
Implikowane I     ED
47
                         
R     ED
4F
                         

 

Wszystkie instrukcje przesłań, wykorzystujące adresowanie indeksowe dla źródła lub dla miejsce docelowego, właściwie używają trzech bajtów pamięci, gdzie trzeci bajt jest przesunięciem d. Na przykład ładowanie rejestru E argumentem wskazywanym przez IX z przesunięciem +8 zapisuje się jako:

 

LD E, (IX + 8)

 

W pamięci instrukcja ta tworzy ciąg trzech bajtów:

 

Adres A DD }- kod operacyjny
A + 1 5E
A + 2 08 }- przesunięcie d

 

Dwie instrukcje z adresowaniem rozszerzonym są również 3 bajtowe. Na przykład instrukcja ładująca akumulator argumentem z komórki pamięci o adresie 6F32H jest zapisywana jako:

 

LD a, (6F32H)

 

a ciąg bajtów dla tej instrukcji jest następujący:

 

Adres A 3A }- kod operacyjny
A + 1 32 }- młodszy bajt adresu
A + 2 6F }- starszy bajt adresu

 

Zwróć uwagę, że młodszy bajt adresu zawsze jest pierwszym argumentem.

Instrukcje ładowania natychmiastowego dla 8 bitowych rejestrów ogólnego przeznaczenia są instrukcjami 2 bajtowymi. Instrukcję załadowania rejestru H liczbą 36H zapisujemy jako:

 

LD H, 36H

 

a jej ciąg bajtów jest następujący:

 

Adres A 26 }- kod operacyjny
A + 1 36 }- argument

 

Załadowanie komórki pamięci daną przy zastosowaniu adresowania indeksowanego dla komórki docelowej i adresowania natychmiastowego dla źródła danych, wymaga czterech bajtów. Na przykład:

 

LD (IX - 15), 21H

 

w pamięci wygląda jako:

 

Adres A DD }- kod operacyjny
A + 1 36
A + 2 F1 }- przesunięcie (-15 jako liczba U2)
A + 3 21 }- argument do umieszczenia w komórce pamięci

 

Zauważ, że w każdym trybie adresowania indeksowanego przesunięcie jest zawsze umieszczone bezpośrednio za kodem operacyjnym instrukcji.

Tablica 6 określa 16 bitowe operacje przesłań. Cecha rozszerzonego adresowania pokrywa wszystkie pary rejestrów. Operacje z adresowaniem pośrednim rejestrowym dotyczącym wskaźnika stosu to instrukcje zapisujące daną na stos i pobierające daną ze stosu. Posiadają one odpowiednio mnemoniki PUSH (zapis na stos) i POP (pobranie ze stosu). Różnią się od innych przesłań 16 bitowych tym, iż wskaźnik stosu SP jest automatycznie zmniejszany lub zwiększany przy zapisie lub odczycie każdego bajtu. Na przykład instrukcja PUSH  AF jest instrukcją jednobajtową o kodzie operacyjnym równym F5H. Podczas jej wykonywania generowany jest ten ciąg operacji:

 

Zmniejsz SP

LD (SP), A

Zmniejsz SP

LD (SP), F

 

Stos zewnętrzny ma teraz postać:

 

             
(SP) F ← Szczyt stosu
(SP+1) A  
* *  
* *  
     

 

Instrukcja POP wykonuje działanie dokładnie odwrotne do PUSH.  Wszystkie instrukcje PUSH i POP wykorzystują argument 16 bitowy, a starszy bajt jest zawsze umieszczany na stosie jako pierwszy i pobierany z niego jako ostatni:

 

PUSH BC  - najpierw na stos B, później C

PUSH DE  - najpierw na stos D, później E

PUSH HL  - najpierw na stos H, później L

POP HL   - najpierw ze stosu L, później H

 

Instrukcja wykorzystująca rozszerzone adresowanie natychmiastowe dla źródła wymaga dwóch bajtów danych umieszczonych za kodem operacyjnym. Na przykład:

 

LD DE, 0659H

 

w pamięci wygląda następująco:

 

Adres A 11 }- kod operacyjny
A + 1 59 }- młodszy bajt danej natychmiastowej
A + 2 06 }- starszy bajt danej natychmiastowej

 

We wszystkich trybach rozszerzonych adresowych i natychmiastowych młodszy bajt zawsze poprzedza starszy za kodem operacyjnym instrukcji.

 

Tablica 6. Grupa instrukcji przesłań 16 bitowych - LD, PUSH i POP

      Źródło
      Rejestr Roz. natychm. Roz. adr. Rej. pośr.
Przeznaczenie     AF BC DE HL SP IX IY nn (nn) (SP)
  Rejestrowe AF                   B1
BC               01
n
n
ED
4B
n
n
C1
DE               11
n
n
ED
5B
n
n
D1
HL               21
n
n
2A
n
n
E1
SP       F9   DD
F9
FD
F9
31
n
n
ED
7B
n
n
 
IX               DD
21
n
n
DD
2A
n
n
DD
E1
IY               FD
21
n
n
FD
2A
n
n
FD
E1
  Rozszerzone
adresowe
(nn)   ED
43
n
n
ED
53
n
n
22
n
n
ED
73
n
n
DD
22
n
n
FD
22
n
N
     
Instrukcje
PUSH
Rejestrowe
pośrednie
(SP) F6 C6 D6 E6   DD
E6
FD
E6
     
                        Instrukcje
POP

 

Tablica 7 wymienia 16 bitowe instrukcje wymiany, które zaimplementowano w mikroprocesorze Z80.  Kod operacyjny 08H pozwala programiście przełączać się pomiędzy dwoma parami rejestrów akumulatora i znaczników, natomiast kod D9H przełącza pomiędzy zestawem [podstawowym a zapasowym sześciu rejestrów ogólnego przeznaczenia. Te kody operacyjne maja rozmiar jednego bajtu w celu zminimalizowania czasu niezbędnego do wymiany, zatem zapasowe zestawy rejestrów mogą być używane w szybko reagujących procedurach przerwań.

 

Tablica 7. Instrukcje wymian - EX i EXX

    Adresowanie implikowane
    A'F BC', DE' i HL' HL IX IY
Implikowane AF 08        
BC
DE
HL
  D9      
DE     EB    
Rejestrowe
pośrednie
(SP)     E3 DD
E3
FD
E3

 

 


   I Liceum Ogólnokształcące   
im. Kazimierza Brodzińskiego
w Tarnowie

©2018 mgr Jerzy Wałaszek

Dokument ten rozpowszechniany jest zgodnie z zasadami licencji
GNU Free Documentation License.

Pytania proszę przesyłać na adres email: i-lo@eduinf.waw.pl

W artykułach serwisu są używane cookies. Jeśli nie chcesz ich otrzymywać,
zablokuj je w swojej przeglądarce.
Informacje dodatkowe