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.