WOJSKOWA AKADEMIA TECHNICZNA
Architektura i organizacja komputerów II
+
Sprawozdanie z pracy laboratoryjnej
Nr1:
Przetwarzanie potokowe.
Architektura procesora DLX - formaty danych, formaty rozkazów.
Grupa: I1Y6S1
Autor: ŁUKASZ WIERZBOWSKI
Nr 7
Data: 2012-03-16I. Rozkazy przesłań:
LW
Zgodnie z założeniem rozkaz ten ma przesłać jedno słowo (32 bity) z pamięci do rejestru.
a)
Kod programu:
.data
Liczba_A: .word 50
.text
lw r1, liczba_A
trap 0
Spodziewany rezultat to zmiana zawartości rejestru r1 na 50.
Rezultat po wprowadzeniu kodu do komputera windlx:
Co faktycznie nastąpiło, po wykonaniu programu w rejestr r1 zawiera wartość 50.
b)
Kod programu:
.data
Liczba_A: .word 50
.text
lw r0, liczba_A
trap 0
Spodziewany rezultat to zapisanie w rejestrze r0 wartości 50.
Rezultat po wprowadzeniu kodu do komputera windlx:
W rejestrze r0 zamiast spodziewanej wartości 50 zostało 0. Sytuacja ta wynika z faktu, że w rejestrze r0 przechowywana jest stała wartość 0.
LF
Rozkaz ten ładuje z pamięci liczbę typu float
a)
Kod programu:
.data
Liczba_A: .float 12,4
.text
lf f13, liczba_A
trap 0
Spodziewamy się, że wartość 12,4 zostanie załadowana do rejestru f13.
Rezultat po wprowadzeniu kodu do komputera windlx:
Otrzymaliśmy oczekiwany rezultat.
b)
Kod programu:
.data
Liczba_A: .float 12,48888888888888888
.text
lf f13, liczba_A
trap 0
Oczekiwanym wynikiem jest zapisanie do rejestru r12 liczby 12,488888888888888888.
Rezultat po wprowadzeniu kodu do komputera windlx:
Nie można załadować takiej wartości jako typ float . Wynik tego programu to liczba 12,5 w rejestrze f13.
II. Rozkazy arytmetyczne i logiczne:
ADD
Rozkaz ten dodaje do wartości rejestru drugi rejestr i zapisuje wynik
w rejestrze.
a)
Kod programu:
.data
liczba_A: .word 15
liczba_B: .word 25
.text
lw r1, liczba_A
lw r2, liczba_B
add r3, r1,r2
trap 0
Spodziewana wartość po wykonaniu tego programu to wartość 40(bo 15+25=40) zapisana w rejestrze r3.
Rezultat po wprowadzeniu kodu do komputera windlx:
Wartość oczekiwana jest taka sama jak po wykonaniu programu.
b)
Kod programu:
.data
liczba_A: .word 2147483647
liczba_B: .word 1447899745
.text
lw r1, liczba_A
lw r2, liczba_B
add r3, r1,r2
trap 0
oczekiwany wynik to2147483647+1447899745 czyli liczba 3595383392 w rejestrze r3.
Rezultat po wprowadzeniu kodu do komputera windlx:
Wynik oczekiwany nie pokrywa się z wynikiem otrzymanym w komputerze Windlx. Sytuacja ta wynika z faktu, iż komputer nie dysponuje wystarczająca liczba bitów aby zapisać tak dużą liczbę.
DIV
Rozkaz ten dzieli wartość rejestru przez drugi rejestr i wynik zapisuje w rejestrze zapisanym jako pierwszy argument.
a)
Kod programu:
.data
liczba_A: .word 15
liczba_B: .word 3
.text
lw r1, liczba_A
lw r2, liczba_B
div r3, r1, r2
trap 0
Program ten wykonuje dzielenie. Oczekiwana wartością rejestru r3 powinna być liczba 3.(15/5=3)
Rezultat po wprowadzeniu kodu do komputera windlx:
Wynik oczekiwany równa się temu, który został otrzymany po wykonaniu programu.
b)
Kod programu:
.data
liczba_A: .word 15
liczba_B: .word 0
liczba_C: .word 12
.text
lw r1, liczba_A
lw r2, liczba_B
lw r3, liczba_C
div r3, r1, r2
trap 0
Znowu wykonujemy dzielenie tym razem przez zero więc spodziewać moglibyśmy się błędu oraz ostatecznej wartości rejestru r3 równej 12, ponieważ operacja dzielenia przez zero jest niedozwolona więc wartość rejestru powinna pozostać nie zmieniona.
Rezultat po wprowadzeniu kodu do komputera windlx:
Symulator zasygnalizował błędne działanie. Jednakże spodziewane pozostawienie rejestru r3 bez zmian nie zostało spełnione. Nowa wartość rejestru r3 to 0.
III. Rozkazy skoków
BNEZ
Rozkaz ten przyrównuje wartość pierwszego argumentu do 0, jeżeli ten warunek nie jest spełniony i pierwszy argument jest różny od zera to program ustawia licznik rozkazów na adres etykiety ustawionej jako drugi argument rozkazu BNEZ.
a)
Kod programu:
.data
liczba_A: .word 8
liczba_B: .word 12
liczba_C: .word 44
.text
lw r1, liczba_A
lw r2, liczba_B
lw r3, liczba_C
bnez r1, label
add r4, r1, r2
label:
trap 0
Rozkaz BNEZ powinien pominąć rozkaz add i zakończyć program.
Rezultat po wprowadzeniu kodu do komputera windlx:
Jak przewidywałem BNEZ pominął rozkaz add i wartość rejestru r4 nie została zmieniona.
b)
Kod programu:
.data
liczba_A: .word 0
liczba_B: .word 12
liczba_C: .word 44
.text
lw r1, liczba_A
lw r2, liczba_B
lw r3, liczba_C
bnez r1, label
add r4, r1, r2
label:
trap 0
W tej sytuacji spodziewaliśmy się wartości rejestru r4 równej zero. Jednakże rozkaz BNEZ jest nie efektywny bo wartość r1 jest równa 0.
Rezultat po wprowadzeniu kodu do komputera windlx:
Rejestr r4 przyjął wartość 12, ponieważ rozkaz BNEZ był nieefektywny i instrukcja add (0+12) została wykonana.
TRAP
Rozkaz ten powoduje przesłanie sterowania do systemu.
a)
Kod programu:
.data
.text
trap 0
Rezultat po wprowadzeniu kodu do komputera windlx:
Jest to najkrótszy z możliwych programów symulatora windlx. Program wykona się poprawnie po czym odda sterowanie do systemu.
b)
Kod programu:
.data
.text
trap 1.1477
Rezultat po wprowadzeniu kodu do komputera windlx:
Program pokaże błąd, ponieważ trap nie przyjmuje nigdy takiej wartości. Zakładam, że program będzie wykonywał się dopóki nie zabraknie mu pamięci.
IV. Rozkazy zmiennoprzecinkowe
SUBF
Rozkaz ten ma za zadanie odjąć od siebie dwie liczby typu float zapisane w rejestrach
i zapisać wynik w rejestrze będącym pierwszym argumentem rozkazu.
a)
Kod programu:
.data
liczba_A: .float 12.41
liczba_B: .float 25.45
.text
lf f1, liczba_A
lf f2, liczba_B
subf f3, f2, f1
trap 0
Spodziewanym wynikiem tego odejmowania będzie wartość 13,04 zapisana w rejestrze f3.
Rezultat po wprowadzeniu kodu do komputera windlx:
Otrzymany wynik po wykonaniu programu zgadza się z przewidywanym.
b)
Kod programu:
.data
liczba_A: .word 21
liczba_B: .float 48.22
.text
lw r1, liczba_A
lf f2, liczba_B
subf f3, f2, r1
trap 0
Spodziewany wynik w rejestrze f3 wynosi 27,22.
Rezultat po wprowadzeniu kodu do komputera windlx:
Działanie nie zostało w ogóle wykonane, ponieważ w rozkazie subf nie możemy użyć rejestru r1, ponieważ nie zawiera liczby typu float.
MULTF
Rozkaz ten mnoży wartości rejestrów i zapisuje ich wynik w trzecim rejestrze.
a)
Kod programu:
.data
liczba_A: .float 1.11
liczba_B: .float 12.55
.text
lf f1, liczba_A
lf f2, liczba_B
multf f3, f1, f2
trap 0
Po wykonaniu tego programu można się spodziewać wartości w rejestrze f3 równej 13,9035
Rezultat po wprowadzeniu kodu do komputera windlx:
Przewidywany wynik jest taki sam jak po wykonaniu programu
b)
Kod programu:
.data
liczba_A: .float 17.11
liczba_B: .float 12.55
.text
lf f1, liczba_A
lf f2, liczba_B
multf r1, f1, f2
trap 0
Po wykonaniu tego programu można się spodziewać wartości w rejestrze f3 równej 214,7305
Rezultat po wprowadzeniu kodu do komputera windlx:
Rozkaz nie został wykonany, ponieważ został użyty zły rejestr r1, który zawiera inny typ danych niż float.
Wnioski:
Przy podawaniu zmiennych trzeba uważać, aby nie przekroczyć danej wielkości liczby, ponieważ uzyskany wynik może odbiegać od tego, który przewidujemy uzyskać.
Rejestru r0 nie można używać do zapisu wyniku poszczególnych rozkazów.
Przy pisaniu rozkazów należy pamiętać o działaniach zabronionych.
Szczególną uwagę trzeba zwracać na rejestry, żeby nie doszło do pomyłki typu : subf r1,f1,f2 - przy takiej kombinacji rejestrów rozkaz nie zostanie wykonany.
13