Serwis Edukacyjny w I-LO w Tarnowie ![]() Materiały dla uczniów liceum |
Wyjście Spis treści Wstecz Dalej Tłumaczenie: mgr Jerzy Wałaszek |
©2021 mgr Jerzy Wałaszek |
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.
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:
|
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.
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).
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.
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.
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 |
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
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).
![]() |
Zespół Przedmiotowy |
Materiały tylko do użytku dydaktycznego. Ich kopiowanie i powielanie jest dozwolone
pod warunkiem podania źródła oraz niepobierania za to pieniędzy.
Pytania proszę przesyłać na adres email: i-lo@eduinf.waw.pl
Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.
Informacje dodatkowe.