Technika Mikroprocesorowa, TM3


0x01 graphic

Ćwiczenie numer: 1

Temat: Badanie zachowania się mikroprocesora Z80

0x01 graphic

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"

0x08 graphic
ORG 20H

ZAPIS: LD (HL),A

0x08 graphic
E1: INC HL

ADD A,C

LD (HL),A

DJNZ E1

RET

0x08 graphic
ORG 0H

LD A,4H

LD HL,40H

0x08 graphic
LD B,6H

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"

0x08 graphic
ORG 30H

0x08 graphic
TAB: DFB 10H, 20H, 30H, 40H, 30H, 50H

L_ELE: EQU 6

ADRES_TAB: EQU 30H

WZOR: EQU 30H

0x08 graphic
ORG 20H

ZAPIS: LD A,(IX+0)

INC IX

0x08 graphic
CP C

JP Z,A1

DJNZ ZAPIS

JP KO

A1: INC D

DJNZ ZAPIS

KO: RET

0x08 graphic
ORG 0H

0x08 graphic
LD B,L_ELE

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"

0x08 graphic
ORG 70H

0x08 graphic
TAB: DWM 2223H, 2213H, 2123H, 2223H, 6723H

L_ELE: EQU 5

ADRES_TAB: EQU 70H

WZOR: EQU 2223H

0x08 graphic
ORG 30H

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)

0x08 graphic
CP E

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

0x08 graphic
ORG 0H

LD B,L_ELE

0x08 graphic
LD IX,ADRES_TAB

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



Wyszukiwarka