ASK - sprawozdanie 1
Transkrypt
ASK - sprawozdanie 1
PP > WE > Stacjonarne I st. Informatyka > Sem. 1 Architektura systemów komputerowych Laboratorium I-22 > Moczulski Adrian Ćwiczenie 1-2 Rok ak. 2012/13 Sem. letni 2013-04-17 Zadania Napisać program spełniający następujące założenia: 1. Program przekształca M[a, a+15] w M[b, b+15], gdzie M[x, y] oznacza zawartość obszaru pamięci od adresu x do adresu y. 2. Przekształcenie określone jest za pomocą wyrażeń (zamieszczonych poniżej) dla: a) i = 0, 1, ... , 15 , jeżeli w wyrażeniu występuje indeks i , b) i = 0, 1, ... , 7 , jeżeli w wyrażeniu występuje indeks 2i . 3. Jeżeli wyrażenie odwołuje się do komórki spoza obszaru M[a, a+15], to należy przyjąć, że B[a+1] = B[a+15] , B[a+16] = B[a] , 4. Program nie powinien zmieniać zawartości żadnej komórki spoza obszaru M[b, b+15]. 5. Przy wykonywaniu operacji arytmetycznych słowa B, H, L, D powinny być traktowane jako liczby całkowite bez znaku w naturalnym kodzie binarnym (NKB). Polecenie: H[b+i] <-- H[a+i] L[b+i] <-- min(L[a+i], L[a+i-1]) ustawienie początkowego adresu 1 ;org 8000 2 3 4 mvi d,0fh; mvi c,0; mvi b, 90; 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 petla: mvi b,90; ldax b; ani f0h; mov e,a; ldax b; ani 0fh; mov h,a; dcr c; ldax b; ani 0fh; cmp h; jc zapisz mov a,h; add e; 20 21 kontynuacja: inr c; 801A& 0C 22 23 mvi b,91; stax b; 801B & 06 801D& 02 8000& 8002& 8004& 8006& 8008& 8009& 800B & 800C & 800D& 800F& 8010& 8011& 8012& 8014& 8015& 8018& 8019& 16 0E 06 06 0A E6 5F 0A E6 67 0D 0A E6 BC DA 7C 83 ustawienie ilości kroków ustawienie początkowego adresu danych (młodsza część) ustawienie początkowego adresu danych (starsza część) etykieta pętli wpisanie starszej części adresu danych do odczytu wczytanie danych do akumulatora wyłuskanie starszej części bitu do akumulatora przeniesienie starszej części bitu do rejestru e ponowne wczytanie danych do akumulatora wyłuskanie młodszej części bitu przeniesienie młodszej części do rejestru h zmniejszenie wartości rejestru, by odwołać się do poprzedniej komórki wczytanie wartości z poprzedniej komórki do akumulatora wyłuskanie młodszej częsci bitu z akumulatora i zapisanie go w akumulatorze porównanie zawartości akumulatora (młodszej części bitu) z wartością zapisaną w rej. H jeśli wartość akumulatora jest mniejsza, niż zapamiętana wa rejestrze, zapisujemy jeśli nie, to wczytujemy wartość rejestru do akumulatora dodajemy wartość starszej części bitu i formujemy słowo B etykieta kontynuacji programu po skoku warunkowym zwiększenie wartości rej. C by nie wpływać poprzednim zmniejszeniem na pętle zmiana starszego bitu adresu do zapisywania zapis danych 24 25 inr c; dcr d; 801E& 0C 801F& 15 zwiększenie młodszej części adresu zmniejszenie wartości rejestru odp. za obsługę pętli 26 27 jz koniec; jmp petla; 8020& 8023& CA C3 warunkowe zakończenie pętli i programu jeżeli pętla jeszcze się nie kończy, to przechodzimy do początku pętli 28 29 30 zapisz: add e; jmp kontynuacja; 8026& 8027& 83 C3 etykieta zapisu danych w przypadku, gdy w aku. była przechowywana mniejsza wartość dodanie starszej części bajtu przejście do normalnego cyklu wykonywania programu 31 32 koniec: hlt 802A& 76 etykieta zakończenia programu instrukcja poprawnego zatrzymania Metoda rozwiązania Rozwiązanie problemu jest dość złożone i przebiega w kliku etapach. Pierwszym etapem jest przygotowanie rejestrów sterujących pętlą, a także odpowiednie zaplanowanie inkrementacji i dekrementacji wartości określonych rejestrów sterujących. Wartości tych rejestrów mogą zostać wykorzystane także, jako część adresu komórki pamięci, z której pobieramy, lub do której zapisujemy dane. Do tej części trzeba przyłączyć także starszy bit, który należy przygotować. Tak przygotowana para rejestrów umożliwia nam prostą obsługę pętli, a także adresowanie aktualnie przetwarzanej komórki pamięci. Wczytane z pamięci dane, należy odpowiednio przetworzyć - oddzielić starszą część bajtu, od młodszej. Można to zrobić wykonując iloczyn binarny wartości przechowywanej w pamięci, oraz odpowiedniej maski np. 1111 0000 - pozwala otrzymać najstarsze bity, odwrotna maska pozwala na wyłuskanie najmłodszych bitów. Wyodrębnione dwuetapowo wartości należy następnie przechować w wolnych rejestrach. Kolejnym etapem jest odwołanie się do poprzedniej komórki pamięci, pobranie wartości, wyodrębnienie najmłodszych bitów, a następnie porównanie otrzymanej wartości z wartością poprzednio wyznaczoną, która jest przechowywana w rejestrze tymczasowym. Zależnie od wyniku porównania, działanie programu może potoczyć się dwutorowo - w zależności, która wartość jest mniejsza, ona zostanie użyta jako młodsza część bajtu. W tym celu jedna z tych wartości zostaje wpisana do akumulatora, do którego dodana zostaje starsza część bajtu. Cały wynik, przepisywany jest z akumulatora do odpowiedniej, wynikowej komórki pamięci. Na bieżąco modyfikowane są również zmienne sterujące działaniem pętli. W razie osiągnięcia zera, podczas dekrementacji wartości rejestru sterującego, ustawiona zostaje flaga zera. W takim przypadku program wykonuje instrukcje skoku warunkowego i kończy swoje działanie. By całą procedurę uczynić bardziej przejrzystą, w programie wykorzystane zostały etykiety, ułatwiające zorientowanie się w kodzie. Całość działa w sposób prosty i niesamowicie efektywny.