Katedra Automatyki i Elektroniki
Sprawozdanie z zajęć laboratoryjnych
Technika mikroprocesorowa 2
TS1A520312
Ćwiczenie numer: 3
Temat: Metody programowania strukturalnego w odniesieniu do mikroprocesorów 8-bitowych.
Wykonujący ćwiczenie: Adam Cylko
Krzysztof Czajkowski
Krzysztof Hończar
Studia dzienne
Kierunek: Elektronika i Telekomunikacja
Specjalność: Aparatura Elektroniczna
Semestr V Grupa laboratoryjna: L01
Prowadzący ćwiczenie: dr inż. Łukasz Sajewski
...........................
OCENA
....................................
Data wykonania ćwiczenia
..............................................
Data i podpis prowadzącego
1. Cel ćwiczenia:
Zdobycie praktycznych umiejętności w wykorzystaniu różnych technik przekazywania informacji między procesem wywołującym, a procesem wywoływanym.
2. Metodyka badań:
2.1. Stanowisko badawcze
Ćwiczenie przeprowadzane jest w grupach przy stanowisku komputerowym. Wymagany jest komputer klasy Pentium z systemem operacyjnym Windows, wyposażony w kolorową kartę graficzną i takiż monitor. Na komputerze powinny być zainstalowane programy narzędziowe (program metaasemblera C32.EXE i symulatora ekranowego SYMULATOR.EXE).
3.2. Przebieg ćwiczenia
Ćwiczenie obejmuje:
1. Uruchomienie przygotowanych programów testowych w oparciu o symulator ekranowy Z80. Przykładowe zadania mogą dotyczyć:
· opóźnień generowanych programowo;
· arytmetyki (dodawanie, odejmowanie, porównywanie) liczb wielobajtowych ze znakiem lub bez znaku;
· algorytmów przetwarzania danych w jednowymiarowych tablicach (sortowanie, wyliczanie wartości średniej, wyszukiwanie maksimum i minimum, itp.).
2. Każdy zespół otrzymuje zależnie od decyzji prowadzącego przynajmniej 2 różne zadania, wymagające zastosowania różnych technik wymiany informacji z procedurą usługową.
Studenci dokonują porównania różnych metod wymiany informacji pomiędzy procedurą a programem wywołującym, ze zwróceniem uwagi na szybkość, uniwersalność i wielkość przekazywanej informacji.
Proces przygotowania programów wiąże się z:
· z użyciem edytora tekstu do przygotowania programu;
· asemblacją programu;
· uruchomieniem opcji symulacji i przetestowaniem poprawności pracy programu.
4. Realizacja ćwiczenia:
Do wykonania mieliśmy następujące zadania:
Zad 1 Wyznaczanie wartości n-tego wyrazu ciągu geometrycznego o znanych a0, q=2 i n. Parametry: A=a0 ; B=n. Wyniki: HL=an (dwubajtowy).
CPU "Z80.TBL" HOF "INT8"
ORG 60H PROG: LD (HL),A ETY: INC HL ADD A,A LD (HL),A DJNZ ETY RET
ORG 0H LD A,7 LD HL,80H LD B,4 CALL PROG
HALT END |
Dyrektywa wskazująca opis listy rozkazów procesora Określenie formatu pliku (*.HEX)
Adres początkowy procedury Przesłanie zawartości akumulatora do komórki o adresie (HL) Zwiększenie HL o jeden Dodanie zawartości akumulatora do akumulatora Przesłanie zawartości akumulatora do komórki o adresie (HL) Realizacja pętli programowej o nazwie ETY Return do programu głównego
Adres początkowy programu głównego Załadowanie wartości 7 do rejestru A (akumulatora) Zapisanie wartości 80H w rejestrze HL B=licznik pętli Wywołanie procedury PROG
Zatrzymanie mikroprocesora Koniec tekstu programu do asemblacji |
Zadaniem programu było wyznaczenie piątego wyrazu ciągu geometrycznego o zadanym a0=7 oraz q=2. Piąty wyraz ciągu powinien wynosić a4=112=70H.
W programie głównym następuje załadowanie do akumulatora wartość 7, czyli pierwszego wyrazu ciągu (a0), zapisanie wartości 80H w rejestrze HL, załadowanie do rejestru B wartości 4, czyli wartości licznika pętli. Później następuje wywołanie procedury o adresie 60H. W procedurze o nazwie PROG realizuje się przesłanie zawartości akumulatora (A=07) do komórki o adresie (HL) równym 80 i właśnie od 80 komórki pamięci będą lokowane kolejne wyrazy ciągu. W etykiecie o nazwie ETY następuje inkrementacja adresu rejestru HL. Potem zawartość akumulatora jest dodawana do zawartość akumulatora, a wynik tej operacji (A=07+07=0E) również znajduje się w akumulatorze. Dlatego przy pomocy komendy LD (HL),A realizuje się przesłanie zawartości akumulatora do komórki o adresie (HL) (równym po zwiększeniu o jeden 81) i tam zostaje umieszczony drugi wyraz ciągu, czyli a1=0E. Potem komenda DJNZ powoduje przeskok pętli do początku z równoczesnym zmniejszeniem zawartości rejestru B o jeden (B=03). Znów następuje inkrementacja adresu rejestru HL, dodanie zawartości akumulatora do zawartości akumulatora oraz przesłanie zawartości akumulatora do komórki o adresie (HL) zwiększonym o jeden w stosunku do poprzedniego, itd. W ostatnim kroku do komórki o adresie (HL) równym 84 zostanie wpisana wartość piątego wyrazu ciągu (a4=70), następuje wyzerowanie licznika pętli (B=00) oraz powrót do programu głównego, a następnie zakończenie całego programu.
Zad 2 Zliczenie w tablicy N liczb ilości elementów równemu podanemu wzorcowi.
CPU "Z80.TBL" HOF "INT8"
ORG 100H
TABL: DFB 11H,23H,11H,11H,30H,55H,6H ILOSC: EQU 7
PTAB: EQU 100H
WZORZEC: EQU 11H
ORG 50H
PRC: LD A,(IX+0)
INC IX CP D JP Z,ETY1 DJNZ PRC
JP END1 ETY1: INC C DJNZ PRC
END1: RET
ORG 0H LD B,ILOSC LD IX,PTAB LD D,WZORZEC CALL PRC
HALT END |
Dyrektywa wskazująca opis listy rozkazów procesora Określenie formatu pliku (*.HEX)
Określenie adresu od jakiego mają być alokowane w pamięci elementy tablicy (tutaj od adresu 100H) Zadeklarowanie tablicy wartości jednobajtowych Przypisanie identyfikatorowi ILOSC wartości 7 (ilości elementów w tablicy TABL) Przypisanie identyfikatorowi PTAB wartości 100H (początek tablicy od komórki o adresie 40H) Przypisanie identyfikatorowi WZORZEC wartości 11H (określenie wzorca) Organizacja pamięci od adresu 50H
Załadowanie do rejestru A (akumulatora) zawartości rejestru indeksowego Zwiększenie IX o jeden Komparacja zawartości rejestru D z zawartością rejestru A Rozkaz skoku do etykiety ETY1 w przypadku, gdy Z=1 Przeskok pętli do początku PRC z równoczesną dekrementacją rejestru B Rozkaz skoku do etykiety END1 Inkrementacja C Przeskok pętli do początku PRC z równoczesną dekrementacją rejestru B Return do programu głównego
Adres początkowy programu głównego Załadowanie do rejestru B zawartości stałej ILOSC Załadowanie do rejestru indeksowego IX zawartości stałej PTAB Załadowanie do rejestru D stałej WZORZEC Wywołanie procedury PRC
Zatrzymanie mikroprocesora Koniec tekstu programu do asemblacji |
Zadaniem programu było zliczenie ilości elementów zgodnych ze wzorcem (którym w naszym przypadku był 11H) spośród siedmiu elementów tablicy. Elementy tablicy TABL o wartościach odpowiednio 11H, 23H, 11H, 11H, 30H, 55H, 6H są zadeklarowane za pomocą rozkazu DFB. W programie głównym następuje załadowanie do rejestru B zawartości stałej ILOSC (B=07), która określa liczbę elementów w tablicy. Potem do rejestru indeksowego IX ładowana jest zawartość stałej PTAB (IX=0100), która określa adres początkowy tablicy. Później do rejestru D ładowana jest zawartość stałej WZORZEC (D=11) określająca wartość wzorca, którego ilość pojawiania się w tablicy jest szukana. Następuje wywołanie procedury o nazwie PRC o adresie początkowym 50H. W procedurze w etykiecie ZAP realizuje się porównanie zawartości rejestru D z zawartością akumulatora A - rozważane są trzy przypadki:
a) A<D CY=1 Z=0
b) A=D CY=0 Z=1
c) A>D CY=0 Z=0
Kiedy A<D lub A>D odbywa się wykonywanie procedury, aż do momentu, gdy wartość rejestru B się wyzeruje i następuje skok do etykiety o nazwie END1, w której następuje return do programu głównego. Natomiast w przypadku, gdy A=D odbywa się skok do etykiety ETY1, w której następuje inkrementacja rejestru C oraz następuje powrót do początku procedury. Wynik w postaci ilości elementów tablicy TABL zgodnych ze wzorcem jest przechowywany w rejestrze C (w naszym zadaniu C=03).
Zad 3 Zliczenie w tablicy N liczb ilości elementów równemu podanemu wzorcowi.
CPU "Z80.TBL" HOF "INT8"
ORG 100H
TABL: DWL 4321H,1AB4H,2341H,6969H ILOSC: EQU 4
WZORZEC: EQU 1AB4H
PTAB: EQU 100H
ORG 50H ZAP: LD A,B ADD A,A LD B,A PRC: LD A,(IX+0)
INC IX CP E JP NZ,ETYK DEC B LD A,(IX+0)
CP D JP NZ,ETY INC IX DJNZ PRC
JP END1 ETY: INC C INC IX DJNZ PRC
ETYK: INC C INC IX DEC B DJNZ PRC
END1: RET
ORG 0H LD B,ILOSC LD IX,PTAB LD DE,WZORZEC CALL ZAP
HALT END |
Dyrektywa wskazująca opis listy rozkazów procesora Określenie formatu pliku (*.HEX)
Określenie adresu od jakiego mają być alokowane w pamięci elementy tablicy (tutaj od adresu 40H) Zadeklarowanie tablicy wartości słów dwubajtowych Przypisanie identyfikatorowi ILOSC wartości 7 (ilości elementów w tablicy TABL) Przypisanie identyfikatorowi WZORZEC wartości 1AB4H (określenie wzorca) Przypisanie identyfikatorowi PTAB wartości 100H (początek tablicy od komórki o adresie 100H) Organizacja pamięci od adresu 50H Załadowanie do rejestru A zawartości rejestru B Dodanie zawartości akumulatora do akumulatora Załadowanie zawartości rejestru A do rejestru B Załadowanie do rejestru A (akumulatora) zawartości rejestru indeksowego Zwiększenie IX o jeden Komparacja zawartości rejestru E z zawartością rejestru A Rozkaz skoku do etykiety ETYK Zmniejszenie B o jeden Załadowanie do rejestru A (akumulatora) zawartości rejestru indeksowego Komparacja zawartości rejestru D z zawartością rejestru A Rozkaz skoku do etykiety ETY Zwiększenie IX o jeden Przeskok pętli do początku PRC z równoczesną dekrementacją rejestru B Rozkaz skoku do etykiety END1 Zwiększenie C o jeden Zwiększenie IX o jeden Przeskok pętli do początku PRC z równoczesną dekrementacją rejestru B
Zwiększenie C o jeden Zwiększenie IX o jeden Zmniejszenie B o jeden Przeskok pętli do początku PRC z równoczesną dekrementacją rejestru B Return do programu głównego
Adres początkowy programu głównego Załadowanie do rejestru B zawartości stałej ILOSC Załadowanie do rejestru indeksowego IX zawartości stałej PTAB Załadowanie do rejestru C stałej WZORZEC Wywołanie procedury ZAP
Zatrzymanie mikroprocesora Koniec tekstu programu do asemblacji |
Zadaniem trzeciego programu było zliczenie ilości liczb dwubajtowych różnych od wzorca (którym w naszym przypadku był 1AB4H) spośród czterech elementów tablicy. Elementy tablicy TABL o wartościach 4321H,1AB4H,2341H,6969H są zadeklarowane za pomocą rozkazu DWL. W programie głównym następuje załadowanie do rejestru B zawartości stałej ILOSC (B=04), która określa liczbę elementów w tablicy. Potem do rejestru indeksowego IX ładowana jest zawartość stałej PTAB (IX=0100), która określa adres początkowy tablicy. Później do rejestru DE ładowana jest zawartość stałej WZORZEC (DE=1AB4) określająca wartość wzorca.
Następuje wywołanie procedury o adresie początkowym 50H. Do akumulatora zostaje załadowana zawartość rejestru B, a następnie w akumulatorze odbywa się dodanie zawartości akumulatora do akumulatora, a później wynik dodawanie zostaje przesłany z akumulatora do rejestru B. Jest to niezbędna operacja, gdyż dyrektywa DWL służąca do zadeklarowania tablicy wartości słów dwubajtowych umieszcza wartości w pamięci w kolejności młodszy/starszy bajt i dlatego liczba zapisanych w pamięci komórek jest dwukrotnie większa
od ilości elementów w tablicy.
W procedurze w etykiecie PRC zawartość komórki o adresie (IX+0)=0100, czyli młodszy bajt liczby 4321H zostaje przesłana do akumulatora i realizuje się inkrementacja adresu indeksowego IX (w tym momencie IX=0101). Potem dokonuje się komparacji zawartości rejestru A z zawartością rejestru E. Możliwe są trzy wyniki porównania: A<E, A=E bądź A>E.
Kiedy A=E, to odbywa się skok do etykiety ETY, w której wykonywana jest dekrementacja rejestru B, a następnie załadowanie do akumulatora zawartości komórki o adresie (IX+0). Potem odbywa się komparacja zawartości rejestru D z zawartością akumulatora:
- W przypadku różnych wartości następuje skok do etykiety ETYK, w której wykonywana jest inkrementacja rejestru C oznaczająca znalezienie elementu w tablicy różnego od wzorca, a także następuje zwiększenie o jeden rejestru indeksowego IX. Komenda DJNZ powoduje przeskok pętli do początku z równoczesnym zmniejszeniem zawartości rejestru B o jeden;
- W przypadku równych wartości następuje skok do etykiety ETY, w której wykonywana jest inkrementacja rejestru indeksowego IX oraz przeskok do początku procedury z równoczesnym zmniejszeniem zawartości rejestru B o jeden.
Natomiast w przypadku, gdy A<E lub A>E to porównywane liczby są różne i odbywa się skok do etykiety ETYK, w której wykonywana jest inkrementacja rejestru C oznaczająca znalezienie elementu w tablicy różnego od wzorca, a także następuje zwiększenie o jeden rejestru indeksowego IX i dekrementacja rejestru B - zbędne jest porównywanie starszego bitu, gdyż i tak wiadomo, iż badane elementy są różne. Potem komenda DJNZ powoduje przeskok pętli do początku z równoczesnym zmniejszeniem zawartości rejestru B o jeden, itd.
Kiedy wartość rejestru B wyzeruje się, to następuje skok do etykiety o nazwie END1, w której odbywa się return do programu głównego. Wynik w postaci ilości elementów tablicy TABL różnych od wzorca jest przechowywany w rejestrze C (w naszym zadaniu C=03).
5. Wnioski:
Poprawność działania napisanych przez nas programów potwierdza otrzymanie wyników zgodnych z oczekiwanymi. Wykonane ćwiczenie pomogło nam w zapoznaniu się z metodami programowanie strukturalnego używanego w programowaniu mikroprocesorów 8-bitowych. W programowaniu strukturalnym istotny jest podział programu na funkcjonalne moduły i procedury, dzięki którym możliwe jest wykonanie elementarnych zadań.
1