4052


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ń:

  1. 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:

0x01 graphic

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:

0x01 graphic

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.

  1. 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:

0x08 graphic

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:

0x01 graphic

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:

  1. 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:

0x01 graphic

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:

0x01 graphic

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ę.

  1. 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:

0x01 graphic

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:

0x01 graphic

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

  1. 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:

0x01 graphic

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:

0x01 graphic

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:

0x01 graphic

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:

0x08 graphic

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

  1. 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:

0x01 graphic

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:

0x08 graphic

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.

  1. 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:

0x01 graphic

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:

0x01 graphic

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



Wyszukiwarka