Ćwiczenie numer: 1
Temat: Badanie zachowania się mikroprocesora Z80
1. Cel ćwiczenia.
Zdobycie praktycznych umiejętności w wykorzystaniu różnych technik przekazywania informacji pomiędzy procesem wywołującym, a procesem wywoływanym.
2. Opis stanowiska badawczego.
Symulacje wykonywaliśmy przy pomocy programu metaasemblera C32.EXE i symulatora ekranowego SYMULATOR.EXE.
3. Realizacja ćwiczenia.
Naszym zadaniem było napisanie trzech programów.
a) program numer 1
Zadanie programu - wyznaczenie wartości n - tego wyrazu ciągu arytmetycznego o znanym a0, r i n. Parametry: A=a0; C=r; B=n. Wyniki: HL=an.
CPU "Z80.TBL" HOF "INT8"
ZAPIS: LD (HL),A
ADD A,C LD (HL),A DJNZ E1 RET
LD A,4H LD HL,40H
LD C,3H CALL ZAPIS
HALT END |
Program składa się z procedury i programu głównego. Program główny określa na jakich rejestrach będą wykonywane operacje oraz zawiera początkowe dane. Posiada również odwołanie do procedury ZAPIS - CALL ZAPIS.
Procedura ZAPIS rozpoczyna się od przeniesienia zawartości akumulatora do rejestru HL, który przechowuje dane w pamięci RAM począwszy od komórki o adresie 0040. Następnie przechodzimy do etykiety E1, zwiększamy adres rejestru HL o jeden (w tym miejscu program będzie zapisywał kolejne dane). Komendą ADD dodajemy rejestr C do akumulatora (a0 + r = a1). Wynik przenosimy z akumulatora do rejestru HL, które tym razem zapiszą się w pamięci RAM w komórce o adresie 0041. Komendą DJNZ przeskakujemy do początku etykiety E1 i zmniejszamy rejestr B o jeden. Procedura będzie wykonywała się aż rejestr B osiągnie wartość 0. Wtedy komenda RET kończy procedurę i tym samy cały program. Wynik obliczeń przechowywany jest w pamięci RAM i w naszym przypadku w komórce o adresie 0046.
Na początku każdej części programu widnieje komenda ORG. Służy ona do przypisywania miejsca w pamięci RAM, od którego będzie zapisywana dana część programu, np ORG 0H - dane będą zapisywane od pierwszej komórki pamięci RAM, natomiast jeżeli ORG 20H - od 20 komórki.
b) program numer 2
Zadanie programu - zliczanie elementów zgodnych ze wzorcem. Parametry: DE=wzorzec; B=N; IX=adres początkowy tablicy. Wyniki: C=poszukiwana ilość.
CPU "Z80.TBL" HOF "INT8"
L_ELE: EQU 6 ADRES_TAB: EQU 30H WZOR: EQU 30H
ZAPIS: LD A,(IX+0) INC IX
JP Z,A1 DJNZ ZAPIS JP KO A1: INC D DJNZ ZAPIS KO: RET
LD IX,ADRES_TAB LD C,WZOR CALL ZAPIS
HALT END |
|
Nasz program składa się z trzech części. W pierwszej zapisane są dane w postaci tablic i etykiet. W drugiej zapisana jest procedura, która wykonuje założenia programu. W trzeciej znajduje się program główny. Opis programu zaczniemy od części pierwszej. Program ma zliczać elementy zgodne ze wzorem, ze zbioru elementów. Naszym zbiorem elementów jest tablica 6 liczb. Zadeklarowaliśmy ją przy pomocy komendy DFB (wartości jednobajtowe). Następnie utworzyliśmy 3 etykiety: L_ELE, ADRES_TAB, WZOR, które zawierają kolejno liczbę elementów w tablicy, adres początkowy tablicy w pamięci RAM oraz wzór z którego program ma korzystać.
Kolejną częścią programu jest procedura.
Tabela 1 Opis poszczególnych komend procedury.
ZAPIS: LD A,(IX+0) INC IX CP C JP Z,A1 DJNZ ZAPIS JP KO A1: INC D DJNZ ZAPIS KO: RET |
załaduj zawartość rejestru IX do akumulatora; zwiększ adres komórki RAM rejestru IX o 1; porównaj zawartość akumulatora z rejestrem C; jeżeli flaga Z=1 skocz to etykiety A1, jeżeli Z=0 idź dalej; wróć do początku etykiety ZAPIS i zmniejsz rejestr B o jeden; skocz do etykiety KO; zwiększ rejestr D o jeden; wróć do początku etykiety ZAPIS i zmniejsz rejestr B o jeden; zakończ procedurę. |
Składa się ona z trzech etykiet. Pierwsza, ZAPIS, porównuje zawartość akumulatora do rejestru C i w razie równości (flaga Z=1) wykonuje skok do etykiety A1 gdzie następuje zwiększenie rejestru D o jeden i powrót do początku procedury. Jeżeli C jest różne od A procedura wykonuje się dotąd aż dojdzie do końca tabeli (rejestr B=0). Wtedy przy pomocy komendy JP KO wykonuje skok do etykiety KO gdzie procedura kończy się.
Program główny znajduje się na końcu algorytmu. Odbywa się w nim załadowanie do poszczególnych rejestrów kolejnych danych programu. I tak w rejestrze B mamy liczbę elementów tablicy, w IX początkowy adres tablicy, w C wzór. Również wywołuje się tu procedurę komendą CALL.
c) program numer 3
Zadanie programu - zliczanie elementów różnych od wzorca. Parametry: DE=wzorzec; B=N; IX=adres początkowy tablicy. Wyniki: C=poszukiwana ilość.
CPU "Z80.TBL" HOF "INT8"
L_ELE: EQU 5 ADRES_TAB: EQU 70H WZOR: EQU 2223H
ZAPIS: LD A,B ADD A,B LD B,A PROC: LD A,(IX+0) INC IX CP D JP NZ,A2 DEC B LD A,(IX+0)
JP NZ,A1 INC IX DJNZ PROC JP KO A1: INC C INC IX DJNZ PROC A2: INC C INC IX DEC B DJNZ PROC KO: RET
LD B,L_ELE
LD DE,WZOR CALL ZAPIS
HALT END |
Powyższy program składa się z tych samych części, które spełniają te same funkcje jak to miało miejsce w programie poprzednim. Opisze więc tylko procedurę, gdyż jest ona najbardziej rozbudowana, ze względu na operowanie na liczbach dwubajtowych.
Na początku chcę zaznaczyć, że tablicę dwubajtową zadeklarowałem komendą DWM, która przeznaczona jest dla liczb dwubajtowych i zapisuje je w pamięci w kolejności starszy / młodszy bajt. Procedura ZAPIS rozpoczyna się od wymnożenia rejestru B przez 2. Jest to konieczne ze względu na to, że w programie głównym deklarujemy ilość liczb dwubajtowych natomiast program operuje na pojedynczych bajtach. Jeżeli nie podwoilibyśmy rejestru B to program skończyłby obliczenia w połowie ilości liczb. Właściwa procedura rozpoczyna się od etykiety PROC. Program przenosi starszy bit liczby dwubajtowej z rejestru IX (z komórki o adresie 70H). Po zwiększeniu adresu IX następuje porównanie akumulatora z rejestrem D gdzie znajduje się starszy bit wzorca. Jeżeli bajty nie są sobie równie, co oznacza, że liczby są różne, przy pomocy komendy JP NZ,A2 przeskakujemy do etykiety A2, gdzie zwiększamy rejestr C o jeden oraz zwiększamy IX i pomniejszamy B. Dwie ostatnie operacje związane są z przejściem do porównywania kolejnej liczby (młodszy bit liczby pierwszej nie ma już sensu rozpatrywać). Komendą DJNZ PROC wracamy do początku procedury i zajmujemy się kolejną liczbą. Natomiast jeżeli wartość rejestru D jest taka sama co akumulatora obniżamy rejestr B o 1, ładujemy z rejestru IX wartość młodszego bitu liczby do akumulatora, porównujemy z rejestrem E gdzie znajduje się młodszy bit wzorca. Jeśli bity są różne przy pomocy komendy JP NZ,A1 przeskakujemy do etykiety A1. W innym przypadku stwierdzamy, że liczba jest równa wzorcowi, więc zwiększamy rejestr IX o jeden (przejście do kolejnej liczby) i komendą DJNZ PROC wracamy do początku procedury. Etykiety A1 i A2 różnią się jedynie inkrementacją rejestru B. Operacja ta jest konieczna w przypadku etykiety A2, ponieważ przeskakujemy do niej z pominięciem drugiego bitu liczby, więc musimy zmniejszyć licznik operacji o jeden.
- 1 -
dane
procedura
program główny
program główny
dane
procedura
procedura
program główny