Zestaw instrukcji mikroprocesora Z80


Język asemblera Z80

Język asemblera pozwala użytkownikowi pisać program bez troszczenia się o adresy komórek pamięci lub formaty instrukcji maszynowych. Wykorzystuje on adresy symboliczne do odwoływania się do komórek w pamięci oraz kody mnemoniczne (kody operacyjne oraz argumenty) do reprezentowania instrukcji. Etykiety (symbole) są przypisywane określonym instrukcjom w programie źródłowym, które później można używać jako punkty wejścia dla dalszych instrukcji. Argumenty występujące za instrukcjami przedstawiają komórki pamięci, rejestry lub wartości stałe. Język asemblera zawiera również dyrektywy asemblera, które zastępują instrukcje maszynowe. Na przykład, pseudoinstrukcją jest polecenie, które nie zostaje przetłumaczone na instrukcję maszynową, lecz raczej jest interpretowane jako dyrektywa sterująca procesem asemblacji.

Program napisany w języku asemblera nazywany jest programem źródłowym, który składa się z symbolicznych poleceń tworzących wiersze. Każdy wiersz może składać się z od jednego do czterech elementów: pola etykiety, pola operacji, pola argumentów oraz pola komentarza. Program źródłowy jest przetwarzany przez asembler w celu otrzymania programu w języku maszynowym (programu wynikowego), który może zostać bezpośrednio wykonany przez mikroprocesor Z80.

Firma ZiLOG udostępnia kilka asemblerów, które różnią się oferowanymi własnościami. Dostępne są asemblery o kodzie absolutnym i przemieszczalnym. Absolutny asembler zawarty jest w oprogramowaniu podstawowego poziomu pracującego w 16KB-owej przestrzeni pamięci, natomiast asembler przemieszczalny jest częścią środowiska RIO, pracującego w przestrzeni 32KB-wej.

 

Znaczniki stanu mikroprocesora Z80

Rejestr znaczników (F i F' - ang. Flags) udostępniają użytkownikowi informację o stanie mikroprocesora Z80 w dowolnie wybranym czasie. Pozycja bitowa w rejestrze F dla każdego ze znaczników jest przedstawiona poniżej:

 

7 6 5 4 3 2 1 0
S Z X H X P/V N C

 

Symbol     Nazwa pola
    C Znacznik przeniesienia
    N Dodawanie/odejmowanie
    P/V Znacznik parzystości/nadmiaru
    H Znacznik przeniesienia połówkowego
    Z Znacznik zera
    S Znacznik znaku
    X Nie używane

 

Każdy z dwóch rejestrów znaczników zawiera 6 bitów informacji stanu, które są ustawiane lub kasowane przez instrukcje mikroprocesora. (Bity 3 i 5 nie są używane.) Cztery z tych bitów (C, P/V, Z i S) można testować w instrukcjach warunkowych skoków, wywołań i powrotów z podprogramów. Dwa znaczniki nie mogą być testowane (H i N) i używa się ich przy arytmetyce BCD.

 

C - Znacznik przeniesienia

Znacznik przeniesienia (C - ang. Carry Flag) jest ustawiany lub zerowany w zależności od rodzaju wykonywanej operacji. Znacznik ten jest ustawiany na 1 przez instrukcję ADD generującą przeniesienie oraz instrukcję SUB generującą pożyczkę. Na zero ustawiają go instrukcja ADD bez przeniesienia i SUB bez pożyczki. To zapamiętane przeniesienie/pożyczka ułatwia tworzenie procedur arytmetycznych działających w rozszerzonej precyzji. Również instrukcja DAA ustawia znacznik przeniesienia, jeśli spełnione są warunki wykonania poprawki dziesiętnej.

Dla instrukcji RLA, RRA, RLS i RRS bit przeniesienia jest używany jako połączenie pomiędzy najmniej znaczącym bajtem (LSB) a najbardziej znaczącym bajtem (MSB) w dowolnym rejestrze lub komórce pamięci. Podczas instrukcji RRCA, RRC, SRA i SRL przeniesienie zawiera ostatnią wartość wyprowadzoną z bitu 0 dowolnego rejestru lub komórki pamięci.

Przy instrukcjach logicznych AND, OR i XOR znacznik przeniesienia jest zerowany.

Znacznik przeniesienia można również ustawić instrukcją SCF (ang. Set Carry Flag - ustaw znacznik przeniesienia) oraz zmienić na wartość odwrotną instrukcją CCF (ang. Compliment Carry Flag - zaneguj znacznik przeniesienia).

 

N - Znacznik dodawania/odejmowania

Znacznik dodawania/odejmowania jest wykorzystywany przez instrukcję DAA (Decimal Adjust Accumulator - popraw dziesiętnie akumulator) do rozróżniania pomiędzy instrukcjami ADD i SUB. Dla instrukcji ADD znacznik N jest zerowany. Dla instrukcji SUB jest ustawiany na 1.

 

P/V - Znacznik parzystości/przepełnienia

Ten znacznik przyjmuje określony stan w zależności od wykonywanej operacji.

Dla operacji arytmetycznych znacznik P/V oznacza stan przepełnienia, gdy wynik w akumulatorze jest większy od maksymalnej możliwej liczby dodatniej (+127) lub jest mniejszy od najmniejszej możliwej liczby ujemnej (-128). Stan przepełnienia jest ustalany poprzez badanie bitów znaku argumentów.

Dla dodawania argumenty o różnych znakach nigdy nie powodują przepełnienia. Gdy dodajemy argumenty o takich samych znakach, a wynik posiada znak przeciwny, ustawiany jest znacznik przepełnienia. Na przykład:

 

+120 = 0111 1000   Czynnik
+105 = 0110 1001   Czynnik
+225 = 1110 0001 = (-95) Suma

 

Te dwie liczby dodane do siebie dają wynik przekraczający +127 i dwa dodatnie argumenty dały w wyniku ujemną sumę (-95 w kodzie U2), co jest nieprawidłowe. Dlatego zostanie ustawiony znacznik przepełnienia.

Dla odejmowania przepełnienie może się pojawić przy argumentach o różnych znakach. Argumenty o tych samych znakach nigdy nie powodują przepełnienia. Na przykład:

 

+127 = 0111 1111   Odjemna
( - )    -64 = 1100 0000   Odjemnik
+191 = 1011 1111 = (-65) Różnica

 

Znak odjemnej zmienił się z dodatniego na ujemny, dając niepoprawną różnicę w kodzie U2. Zostaje ustawiony znacznik nadmiaru.

Inną metodą stwierdzenia nadmiaru jest obserwowanie przeniesienia do i poza bit znaku. Jeśli wystąpiło przeniesienie do bitu znaku, a nie pojawiło się przeniesienie poza ten bit, lub jeśli nie było przeniesienia do bitu znaku a jest przeniesienie poza ten bit, to powstał nadmiar.

Znacznik ten jest również używany przy operacjach logicznych oraz instrukcjach obrotów do wskazywania parzystości wyniku. Bity o wartości 1 w bajcie wynikowym są zliczane. Jeśli ich suma jest nieparzysta, sygnalizowana jest nieparzystość (znacznik P ma wartość 0). Jeśli suma jest parzysta, sygnalizowana jest parzystość (znacznik P przyjmuje wartość 1).

Przy instrukcjach poszukiwań (CPI, CPIR, CPD, CPDR) oraz przesyłu blokowego (LDI, LDIR, LDD, LDDR) znacznik P/V monitoruje stan rejestru zliczania bajtów (BC). Jeśli licznik bajtów zostanie zmniejszony do 0, znacznik ten jest zerowany, inaczej ma wartość 1.

Podczas instrukcji LD A,I i LD A,R znacznik P/V jest ustawiany wartością przerzutnika zezwolenia na przerwania (IFF2 - Interrupt Enable Flip-Flop) w celu zapisu go w pamięci lub testowania.

Przy odczycie bajtu z urządzenia we/wy za pomocą instrukcji IN r,(C) znacznik P/V jest ustawiany zgodnie ze stanem parzystości odczytanych danych.

 

H - Znacznik przeniesienia połówkowego

Znacznik przeniesienia połówkowego (H - ang. Half Carry Flag) jest ustawiany na 1 lub zerowany w zależności od stanu przeniesienia lub pożyczki pomiędzy bitami 3 i 4 przy 8-bitowej operacji arytmetycznej. Znacznik ten wykorzystuje instrukcja DAA do korekcji wyniku po dodawaniu lub odejmowaniu spakowanych liczb w kodzie BCD. Znacznik H jest zmieniany zgodnie z poniższą tabelką:

 

Znacznik H Dodawanie Odejmowanie
1 Pojawia się przeniesienie z bitu 3 na bit 4 Występuje pożyczka z bitu 4
0 Brak przeniesienia z bitu 3 na bit 4 Nie ma pożyczki z bitu 4

 

Z - Znacznik zera

Znacznik zera (Z - ang. Zero Flag) jest ustawiany na 1 lub zerowany, jeśli wynik tworzony przez określone instrukcje wynosi zero.

Dla 8-bitowych instrukcji arytmetycznych i logicznych znacznik Z jest ustawiany na 1, jeśli wynikowy bajt w akumulatorze ma wartość 0. Jeśli bajt ten nie jest równy zero, znacznik Z zostaje wyzerowany.

Dla instrukcji porównań (poszukiwań) znacznik Z jest ustawiany na 1, jeśli wartość akumulatora jest równa wartości w komórce pamięci wskazywanej przez zawartość pary rejestrów HL.

Gdy testowany jest bit w rejestrze lub w komórce pamięci, znacznik Z zawiera zanegowany stan tego bitu.

Przy odczycie lub zapisie bajtu pomiędzy komórką pamięci a urządzeniem we/wy (INI, IND, OUTI, OUTD), jeśli wynik zmniejszenia rejestru B jest równy 0, znacznik Z otrzymuje wartość 1, inaczej znacznik Z jest zerowany. Również przy odczycie bajtu z urządzeń we/wy za pomocą IN r,(C) znacznik Z jest ustawiany na 1, aby wskazać odczyt bajtu o wartości 0.

 

S- Znacznik znaku

Znacznik znaku (S - ang. Sign Flag) przechowuje stan najbardziej znaczącego bitu akumulatora (bit 7), Gdy mikroprocesor Z80 wykonuje instrukcje arytmetyczne na liczbach ze znakiem, notacja U2 wykorzystywana jest do przedstawiania i przetwarzania informacji liczbowej. Liczba dodatnia jest rozpoznawana przez stan zero bitu 7. Przy liczbie ujemnej bit 7 ma wartość 1. Dwójkowy odpowiednik wielkości liczby pozytywnej jest przechowywany w bitach 0 do 6, co daje całkowity zakres od 0 do 127. Liczba ujemna jest reprezentowana przez zapis uzupełnieniowy do 2 odpowiednika liczby dodatniej. Całkowity zakres dla liczb ujemnych wynosi od -1 do -128 (jeśli chcesz się dowiedzieć więcej na temat kodów liczbowych, zapraszam do artykułu o binarnym kodowaniu liczb).

Przy odczycie bajtu z urządzenia we/wy do rejestru przy pomocy instrukcji IN r,(C) znacznik S wskazuje albo dane dodatnie (S=0), albo ujemne (S=1).

 



List do administratora Serwisu Edukacyjnego Nauczycieli I LO

Twój email: (jeśli chcesz otrzymać odpowiedź)
Temat:
Uwaga: ← tutaj wpisz wyraz  ilo , inaczej list zostanie zignorowany

Poniżej wpisz swoje uwagi lub pytania dotyczące tego rozdziału (max. 2048 znaków).

Liczba znaków do wykorzystania: 2048

 

W związku z dużą liczbą listów do naszego serwisu edukacyjnego nie będziemy udzielać odpowiedzi na prośby rozwiązywania zadań, pisania programów zaliczeniowych, przesyłania materiałów czy też tłumaczenia zagadnień szeroko opisywanych w podręcznikach.



   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.