background image

WOJSKOWA AKADEMIA TECHNICZNA 

Architektura i organizacja komputerów II 

 
 
 
 
 
 

Sprawozdanie z pracy laboratoryjnej nr. 1 

 
 
 
 
 
 
 
 
 

 
 
 
 
 
 

Grupa: I1X7S1 
Wykonał: KOZICKI ADAM 
Nr 11 
Data: 2012-04-14

background image

I ROZKAZY PRZESŁAŃ 
 

1. 

Rozkaz LF  ładuje z pamięci liczbę typu float. 

 

a)  Kod programu: 

 
.data 
liczba: .float 99 
 
.text 
lf  f10, liczba 
 
trap 0 
 
 
 
 
 
 
 
 
Wartośc 99 została pomyślnie załadowana do rejestru f10. Widac to na załączonym wyżej 
obrazku. 
 

b)  Kod programu: 

.data 
wartosc: .word 300 
 
.text 
lf f10, wartosc 
 
trap 0 
 
Nie można załadować wartości typu word do rejestru typu float dlatego wynik tego programu 
to nadal liczba 0 w rejestrze f10 
 

2. 

Rozkaz LW  przesła jedno słowo (32 bity) z pamięci do rejestru. 

a)  Kod programu: 

 
.data 
liczba_1: .word 36 
 
.text 
lw r8, liczba_1 
 
trap 0

 

Zgodnie z planem nastąpiła zmiana awartości rejestru r8 na 36. Liczba 36 mieści się na 32 
bitach. 
 
 

background image

b)  Kod programu: 

 
.data 
liczba_2: .word 80 
 
.text 
lw r0, liczba_2

 

 
trap 0 
 
Wynik jest różny od spodziewanego. W rejestrze r0 nie zostanie zapisana wartość 80, 
ponieważ rejestr r0 zawiera stałą wartość 0, która nie ulega zmianie. 
 

II ROZAZY ARYTMETYCZNE I LOGICZNE 
 

1.  Rozkaz ADDI  dodaje do wartości rejestru liczbę podaną w rozkazie i 

zapisuje wynik w rejestrze.  

a)  Kod programu: 

 
.data 
wartosc: .word 19 
 
.text 
lw r4, wartosc 
addi r10, r4, 21 
 
trap 0

 

 
Po wykonaniu tego programu wartość 40 jest 
zgodnie z oczekiwaniami zapisana w rejestrze 
r10. Tak też się dzieje, ponieważ wartości 
wpisane są poprawnie i program może się 
wykonać poprawnie. Wynik programu 
dostrzegamy na załączonym obrazku. 
 

b)   Kod programu: 

.data 
liczba_10: .word 5 
 
.text 
lw r2, liczba_10 
addi r3, r2, liczba_10 
 
trap 0

 

 
Wbrew pozorom wynikiem tego programu nie będzie wartość 10 w rejestrze r3. Rozkaz 
ADDI w tym wypadku nie pobiera wartości komórki ‘liczba_10’, wykorzystuje za to adres tej 
komórki jako argument. Adres ten wynosi 1000h 

 

 

background image

2.  Rozkaz SUB  odejmuje wartość rejestru od drugiego i wynik zapisuje w 

rejestrze zapisanym jako pierwszy argument. 

a) 
Kod programu: 
 
.data 
Liczba_1: .word 80 
liczba_2: .word 40 
 
.text 
lw r7, liczba_1 
lw r8, liczba_2 
sub r9, r7, r8 
 
trap 0

 

 
Według przewidywań wynikiem programu jest zapisanie w rejestrze r9 wartości 40. Jest to 
poprawne, ponieważ rozkaz wykonał odejmowanie 80-40=40, co jest poprawne. 
 
b) 
Kod programu: 
 
.data 
Liczba1: .word -2147483647 
Liczba2: .word 2147483647 
.text 
lw r5, liczba1 
lw r6, liczba2 
sub r3, r5, r6 
 
trap 0

 

 
Tym razem w rejestrze r3 spodziewamy 
się wyniku: 
-4294967294, co jest naturalnym 
wynikiem działania -2147483647-
2147483647Jednak wartość w rejestrze 
r3 wynosi 2. Wartość ta wynika z braku 
odpowiedniej liczby bitów aby zapisać 
tak dużą ujemną liczbę. 
 
 
 
 

 
 
 
 
 
 

background image

III Rozkazy skoków 

1.  Rozkaz TRAP  powoduje przesłanie sterowania do systemu. 

a)  Kod programu: 

 
.data 
 
.text 
 
trap 0

 

 
Program wykonał się poprawnie i poprawnie zadziałał rozkaz TRAP, zakańczając 
wykonywanie się programu.  
 

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ł dopóki nie skończy się pamięć systemie. 
 

2.  Rozkaz BEQZ  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 
liczba1: .word 0 
liczba2: .word 28 
liczba3: .word 15 
 
.text 
lw r3, liczba1 
lw r4, liczba2 
lw r5, liczba3 
beqz r3, omin 
addi r5, r3, r4 
omin: 
 
trap 0

 

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 r3 wynosi 0. Rezultat 
oczekiwany pokrył się więc z rezultatem osiągniętym. 
 
 

background image

b)  Kod programu: 

 
.data 
liczba1: .word 6 
liczba2: .word 23 
liczba3: .word 9 
 
.text 
lw r2, liczba1 
lw r4, liczba2 
lw r6, liczba3 
beqz r2, omin 
addi r8, r2, r4 
omin: 
 
trap 0

 

 
Spodziewany wynik jest taki, że rejestr r8 pozostanie równy 0. Jednak rozkaz skoku BEQZ 
jest nieefektywny co jest spowodowane wartością niezerową w rejestrze r2. A więc rezultat 
jest inny od wartości oczekiwanej i w rejestrze r8 zapisana została wartość 29, co jest zgodne 
z wynikiem dodawania 6 i 23. 
 

IV. Rozkazy zmiennoprzecinkowe 

1.  Rozkaz ADDF  dodaje do siebie dwie liczby typu float zapisane w 

rejestrach i zapisuje wynik będący pierwszym argumentem rozkazu. 

a)  Kod programu: 

 
.data 
liczba1: .float 22.22 
liczba2: .float 33.33 
 
.text 
lf f1, liczba1 
lf f2, liczba2 
addf f3, f2, f1 
 
trap 0

 

 
Program ten da nam w wyniku wartość 55.55 zapisaną w rejestrze f3, ponieważ jest to dobry 
wynik dodawania 22.22 + 33.33. Oczekiwana wartość pokryła się z rezultatem. 
 

b)  Kod programu: 

 
.data 
Liczba1: .word 56 
Liczba2: .float 23.23 
 
.text 
lw r8, liczba1 
lf f9, liczba2 
addf f10, f9, r8 

background image

 
trap 0

 

 
Tym razem spodziewalibyśmy się wartości 79,23 w rejestrze f10. 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ść f10 pozostanie 0. 
 

2.  Rozkaz LTF   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 
liczba1: .float 22.22 
liczba2: .float 33.33 
 
.text 
lf f1, liczba1 
lf f2, liczba2 
ltf f2, f1 
 
trap 0

 

 
Program ten porównuje liczbę 22.22 i 33.33 Pierwsza jest mniejsza od drugiej więc 
spodziewamy się ustawienie rejestru FPSR na 1. Co też następuje. A więc mamy wynik 
zgodny z oczekiwaniami. 
 

b)  Kod programu: 

 
.data 
Liczba1: .float 89.99 
liczba2: .float 23.54 
 
.text 
lf f1, liczba1 
lf f2, liczba2 
ltf f3, f1 
 
trap 0

 

 
Ten program także działa zgodnie z oczekiwaniami ponieważ liczba 89.99 jest większa od 
liczby 23.54. A więc rejestr FPSR równa się 0. 

 

Wnioski: 

Gdy piszemy programy musimy pamiętać o możliwości przekroczenia liczby mieszczącej się 
w danym rejestrze co może prowadzić do złych wyników albo do nie otrzymania ich wcale. 
Należy także podawać właściwe argumenty do rozkazów, ponieważ grozi to nie wykonaniem 
się rozkazu. Trzeba również podawac właściwe formaty zmiennych.. 
 

background image