WOJSKOWA AKADEMIA TECHNICZNA
Architektura i organizacja komputerów II
Sprawozdanie z pracy laboratoryjnej
Nr1
Grupa: I0X3S1
Autor: Karolina Dembek
Nr 19
Data: 2011-04-15I. 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
liczba1: .word 45
.text
lw r1, liczba1
trap 0
Spodziewany rezultat to zmiana zawartości rejestru r1 na 45.
Co faktycznie nastąpiło, po wykonaniu programu w rejestr r1 zawiera wartość 45. Liczba 45 mieści się na 32 bitach a więc nie było przeszkód w wykonywaniu rozkazu.
b)
Kod programu:
.data
liczba1: .word 27
.text
lw r0, liczba1
trap 0
Spodziewany rezultat to zapisanie w rejestrze r0 wartości 27.
Jednak to nie nastąpiło ponieważ rejestr r0 zawiera stałą wartość 0, która nie ulegnie zmianie. Otrzymany rezultat to więc wartość 0 w rejestrze 0.
LF
Rozkaz ten ładuje z pamięci liczbę typu float
a)
Kod programu:
.data
liczba: .float 123
.text
lf f1, liczba
trap 0
Spodziewamy się, że wartość 123 zostanie załadowana do rejestru f1. Co też się dzieje.
W tym wypadku wartość oczekiwana pokryła się z wartością otrzymaną.
b)
Kod programu:
.data
liczba: .word 450
.text
lf f1, liczba
trap 0
Znowu oczekiwanym wynikiem jest zapisanie do rejestru f1 liczby 450. Tym razem jednak tak się nie dzieje. Nie można bowiem załadować wartości typu word do rejestru typu float. Wynik tego programu to nadal liczba 0 w rejestrze f1.
II. Rozkazy arytmetyczne i logiczne:
ADDI
Rozkaz ten dodaje do wartości rejestru liczbę podana w rozkazie i zapisuje wynik
w rejestrze.
a)
Kod programu:
.data
liczba: .word 10
.text
lw r1, liczba
addi r2, r1, 10
trap 0
Spodziewana wartość po wykonaniu tego programu to wartość 20 zapisana w rejestrze r2. Tak też się dzieje, ponieważ wartości wpisane są poprawnie i program może się wykonać poprawnie. Wartość oczekiwana zgadza się z wartością otrzymaną.
b)
Kod programu:
.data
liczba: .word 5
.text
lw r1, liczba
addi r2, r1, liczba
trap 0
Teraz spodziewalibyśmy się, że wynikiem tego programu będzie wartość 10 w rejestrze r2. Jednak nie jest to prawdą. Rozkaz ADDI w tym wypadku nie pobiera wartości komórki `liczba', wykorzystuje za to adres tej komórki jako argument. Adres ten wynosi 1000h (4096d). A więc wynikiem tego rozkazu będzie wartość 4196 w rejestrze r2. Spowodowane to jest tym, że rozkaz ADDI służy do dodawania do rejestru liczby natychmiastowej podanej
w argumencie rozkazu a nie liczby zapisanej w pamieci czy rejestrze.
SUB
Rozkaz ten odejmuje wartość rejestru od drugiego i wynik zapisuje w rejestrze zapisanym jako pierwszy argument.
a)
Kod programu:
.data
liczba_A: .word 100
liczba_B: .word 40
.text
lw r1, liczba_A
lw r2, liczba_B
sub r3, r1, r2
trap 0
Program ten wykonuje odejmowanie i jakby można się spodziewać ostatecznie w rejestrze r3 pojawi się liczba 60. Co oczywiście jest prawdą jako, że równanie 100-40 daje wynik 60,
a w programie nie ma błędów.
b)
Kod programu:
.data
liczba_A: .word -2147483647
liczba_B: .word 2147483647
.text
lw r1, liczba_A
lw r2, liczba_B
sub r3, r1, r2
trap 0
Znowu wykonujemy odejmowanie tym razem spodziewać byśmy się mogli wartości:
-4294967294, co jest naturalnym wynikiem działania -2147483647-2147483647. Jednak ku naszemu zdziwieniu wartość w rejestrze r3 wynosi 2. Wartość ta wynika z braku odpowiedniej liczby bitów aby zapisać tak dużą ujemną liczbę.
III. Rozkazy skoków
BEQZ
Rozkaz ten przyrównuje wartość pierwszego argumentu do 0, jeżeli ten warunek jest spełniony i pierwszy argument rozkazu równy jest zero to program ustawia licznik rozkazów na adres etykiety ustawionej jako drugi argument rozkazu BEQZ.
a)
Kod programu:
.data
liczba_A: .word 0
liczba_B: .word 35
liczba_C: .word 11
.text
lw r1, liczba_A
lw r2, liczba_B
lw r3, liczba_C
beqz r1, zakladka
addi r4, r1, r2
zakladka:
trap 0
Zgodnie z tym co ustawiliśmy rozkaz BEQZ ma nam pominąć rozkaz ADDI i zakończyć program tylko po wczytaniu danych do rejestru. Tak też się stało ponieważ wartość rejestru r1 wynosi 0. Rezultat oczekiwany pokrył się więc z rezultatem osiągniętym.
b)
Kod programu:
.data
liczba_A: .word 12
liczba_B: .word 35
liczba_C: .word 11
.text
lw r1, liczba_A
lw r2, liczba_B
lw r3, liczba_C
beqz r1, zakladka
addi r4, r1, r2
zakladka:
trap 0
Teraz znowu spodziewalibyśmy się, że rejestr r4 pozostanie równy 0. Jednak jest to mylne ponieważ tym razem rozkaz skoku BEQZ jest nieefektywny co jest spowodowane wartością niezerową w rejestrze r1. A więc rezultat jest inny od wartości oczekiwanej i w rejestrze r4 zapisana została wartość 47, co jest zgodne z wynikiem dodawania 35 i 12.
TRAP
Rozkaz ten powoduje przesłanie sterowania do systemu.
a)
Kod programu:
.data
.text
trap 0
Jak mogliśmy się spodziewać program wykonał się poprawnie i poprawnie zadziałał rozkaz trap, zakańczając wykonywanie się programu. Rezultat spodziewany jest więc zgodny
z otrzymanym.
b)
Kod programu:
.data
.text
trap 87.666
W programie tym wystąpi błąd ponieważ trap nie przyjmuje takich wartości i odrzuca je. Program ten będzie się więc wykonywał w nieskończoność a raczej dopóki nie skończy się pamięć systemie.
IV. Rozkazy zmiennoprzecinkowe
ADDF
Rozkaz ten ma za zadanie dodać do 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 11.11
liczba_B: .float 55.55
.text
lf f1, liczba_A
lf f2, liczba_B
addf f3, f2, f1
trap 0
Spodziewamy się, że program ten da nam w wyniku wartość 66.66 zapisaną w rejestrze f3, ponieważ jest to dobry wynik dodawania 11.11 i 55.55. I tym razem oczekiwana wartość pokryła się z rezultatem.
b)
Kod programu:
.data
liczba_A: .word 11
liczba_B: .float 55.55
.text
lw r1, liczba_A
lf f2, liczba_B
addf f3, f2, r1
trap 0
Tym razem spodziewalibyśmy się wartości 66.55 w rejestrze f3. To nie jest prawda, gdyż rozkaz ADDF nie przetwarza argumentów nie będących w formacie float a więc i zapisanch w rejestrach r. Rozkaz ten zwróci błąd i wartość f3 pozostanie 0.
LTF
Rozkaz ten porównuje wartości rejestrów podanych do rozkazu jako argumenty. Sprawdza czy pierwszy jest mniejszy od drugiego. Jeżeli tak to ustawia rejestr FPSR na 1.
a)
Kod programu:
.data
liczba_A: .float 11.11
liczba_B: .float 55.55
.text
lf f1, liczba_A
lf f2, liczba_B
ltf f3, f1
trap 0
Program ten jak można się spodziewać porównuje liczbę 11.11 i 55.55, ponieważ pierwsza jest mniejsza od drugiej to spodziewamy się ustawienie rejestru FPSR na 1. Co też następuje. A więc mamy wynik zgodny z oczekiwaniami.
b)
Kod programu:
.data
liczba_A: .float 99.99
liczba_B: .float 55.55
.text
lf f1, liczba_A
lf f2, liczba_B
ltf f3, f1
trap 0
Ten program także działa zgodnie z oczekiwaniami ponieważ liczba 99.99 jest większa od liczby 55.55. A więc rejestr FPSR równa się 0.
Wnionski:
Pisząc programy trzeba pamiętać o możliwości przekroczenia liczby mieszczącej się w danym rejestrze co może prowadzić do przekłamań w wynikach albo do nie otrzymania ich wcale. Należy również zwracać uwagę aby podawać właściwe argumenty do rozkazów ponieważ to grozi nie wykonaniem się rozkazu wcale. A także właściwym formacie zmiennych.
2