Wojskowa Akademia Techniczna
im. Jarosława Dąbrowskiego
Laboratorium
Architektury Systemów Komputerowych
Prowadzący mgr inż. Artur Miktus
Sprawozdanie z ćwiczenia laboratoryjnego
Wykonał: Arkadiusz Prymek
Grupa: I7X3S1
Treść zadania
1. na ocenę „dostatecznie”: zaprojektować (algorytm, opis) i zaimplementować program p1, który::
a. Wypisze komunikat „Uruchomiono program p1.” i przeniesie kursor do nowego wiersza.
b. Wypisze komunikat „Autorem programu jest ... z grupy …” (gdzie miejsca … należy wypełnić danymi autora programu) i przeniesie kursor do nowego wiersza.
c. Wypisze komunikat „Jesli chcesz zakonczyc prace tej czesci programu, nacisnij A spacja Z”. (Bez przenoszenia kursora do nowego wiersza).
Wczyta tekst z klawiatury. Jeśli wprowadzony tekst to znak „A Z” (i oczywiście Enter), program, zakończy się, jeśli naciśnięto inny klawisz (np. sam Enter) lub sekwencję klawiszy (np. Xx), powtórnie wypisze komunikat z punktu 1c.
Rozwiązanie:
Zadanie polegało na wypisaniu odpowiednich komunikatów które zostały
wyświetlone na ekran za pomocą rejestru r14 oraz trap 5.
Następnie należało sprawdzić poprawność wczytanego ciągu znaków. W pierwszej kolejności wczytujemy dane za pomocą trap 3, a następnie wczytujemy dane do r2. Z rejestru r2 znaki czytamy pierwszy znak za pomocą rozkazu lb r3,(r2), sprawdzamy czy ten znak to „A” jeżeli nie, to prosimy użytkownika o ponowne wpisanie ciągu znaków. Lecz jeżeli pierwszą literą jest „A” za pomocą addi r2,r2,2 przechodzimy do 3 znaku z ciągu i ładujemy go do r3 za pomocą rozkazu lb r3,(r2) a następnie porównujemy z kodem znaku „Z” jeżeli jest nie poprawny zaczynamy wczytywanie ciągu od początku. W Przeciwnym wypadku sprawdzamy czy kolejny znak to „Enter” jezelu tak kończymy prace programu, jeżeli nie zaczynamy wszystko od początku.
W programie pomineliśmy sprawdzanie drugiego znaku z ciągu ponieważ on mogłbyć dowolnym znakiem.
2. na ocenę „dobrze”: na podstawie biblioteki input.s zaprojektować (algorytm, opis) i zaimplementować dla komputera WinDLX moduł we_1.s, zawierający procedurę czytaj, która będzie wykonywać poprawne wczytywanie liczby całkowitej, ewentualnie poprzedzonej znakiem „+” lub „ - „. Zaprojektować (algorytm, opis) i zaimplementować program L6_1, który:
a. przy wykorzystaniu procedury czytaj wypisze komunikat „Pierwsza liczbe calkowita (może być ze znakiem) === „ i wczyta pierwszą z 5 liczb całkowitych jako danych wejściowych do programu.
b. Kolejno wypisze komunikat jak w punkcie 2b, po słowie „Podaj” zwiększając kolejno numer wczytywanej liczby całkowitej i wczyta przy wykorzystaniu procedury czytaj kolejne 3 liczby całkowite ze znakiem. Wczytane liczby mają być przechowane w zmiennych typu .word o nazwach licz1, licz2 ... licz5 (uwaga: nie w rejestrach GPR). Wartości liczb zostaną na zajęciach podane przez prowadzącego.
Student samodzielnie przygotuje pokaz uruchomienia programu z ustawieniem breakpointa tak, aby w okienku podglądu zawartości pamięci operacyjnej można było sprawdzić, czy wczytane liczby rzeczywiście są poprawnie wczytane, przekonwertowane i zapamiętane.
3. na ocenę „dobrze +” wykona to, co w punkcie 2, a ponadto
a. Wyszuka wśród wczytanych liczb liczbę najmniejszą min i największą max i , oraz wypisze te liczby z komunikatami: „Min wsrod wprowadzonych liczb bylo=”i odpowiednio „Max wsrod wprowadzonych liczb bylo=”
Rozwiązanie:
Zadanie polegało na wczytaniu 5 liczb za pomocą procedury „Czytaj” a następnie wyszukanie z tych liczb min i max.
Wczytywanie liczb polegało na wypisaniu komunikatu „Podaj ..... liczbe calkowita (może być ze znakiem) === „ a następnie wywoływana zostawała procedura czytaj z pliku we_1.s za pomocą skoku „jal” czyli jump and link, z adresem powrotu w R31.
Procedura „Czytaj”
W procedurze czytaj wywoływany jest trap3 do wczytania liczby,
Poźniej ładujemy ją do rejestru r20 gdzie nasza liczba będzie przechowywana.
Na samym początku sprawdzamy czy pierwszy znak to odpowiednio Enter, „-” lub „+” jeżeli enter to wychodzimy z procedury czytaj. Jeżeli jest to znak „-” lub „+” ustawiamy odpowiedni rejestr na „1” i dodajemy do r20 tą „1” aby przejść do kolejnego znaku. Następnie znowu sprawdzamy czy kolejny znak to Enter jeżeli nie przechodzimy do „wyłuskiwania” liczby gdyż znaki wczytujemy pojedyńczo a wiec odczytujemy kody ASCII.
Algorytm wyłuskiwania :
petla:
lbu r24,0(r20)
seqi r25,r24,10 ; sprawdza czy ENTER (LF)
bnez r25,koniec
subi r24,r24,48 ;odejmij '0'
multu r21,r21,r27 ; mnoz przez 10
add r21,r21,r24 ;dodaj wartość róznicy kodów ASCII
addi r20,r20,1 ;inkrementacja miejsca czytania znaku
j petla
Przykład liczby „1234LF”
Liczba kod ASCII
„0” = 48
„1” = 49
„2” = 50
„3” = 51
„4” = 51
Wczytujemy pierwszy znak czyli „1” w kodzie ASCII „49” musimy odjać od „0” czyli „48” następnie mnożymy przez 10, pobieramy kolejny znak i dodajemy do poprzedniego wyniku i tak, aż do napotkania Entera
Realizacja:
„1” 49-48=1 1x10=10
„2” 50-48=2 2+10=12 12*10=120
„3” 51-48=3 120+3=123 123*10=1230
„4” 52-48=4 1230+4=1234
Następnie sprawdzamy czy liczba była ze znakiem „-” jeżeli tak to odejmujemy tą liczbę od 0 a jeżeli nie wracamy do programy L6_1.s za pomocą
jr r31poniewaz w r31 zapisany był adres powrotu. Pobieramy tak kolejno 5 liczb i ostatnią wpisujemy do rejestrów r2 oraz r3 jako liczba min i max. Porównujemy z nią pierwszą liczbę czy jest mniejsza za pomocą rozkazu „slt” czyli Set least : czy mniejszy. Jeżeli tak to wpisujemy ją do rejestru r2 jako najmniejszą a jeżeli nie jest mniejsza sprawdzamy czy jest większa od max za pomocą rozkazu „sgt” Set greater czy wiekszy. Jeżeli tak wpisujemy tą liczbe jako maksimum jeżeli nie to wczytujemy kolejna liczbę i ją porównujemy z min i max. Gdy porównamy już wszystkie liczby zapisujemy wartoścu rejestrów r2 i r3 odpowiednio do zmiennych min i max. Wypisujemy liczby przez
addi r14,r0,wyswietlMinMax trap 5. w kolejności z jaką deklarowalismy zmienne min i max.
Forwading
Właczony forwarding
Wyłączony forwarding
Przy wyłączonym forwardingu cykli było 429, dzieki właczeniu forwardingu zostało liczba zmiejszyła się do 334 cykli.
429-334=95 cykli róznicy miedzy fowardingiem
Przy wyłączonym forwardingu hazardów typu RAW było 169, dzieki właczeniu forwardingu zostało 95 hazadrów danych typu RAW wyeliminowane zostało 74 hazadrdy danych typu RAW.
Patrząc na statystyki najwiecej czasu zajmuje mnozenie, oraz skoki, ponieważ hazardy danych w nich najtrudniej wyeliminować dlatego mimo, iż zostało wyeliminowane 74 hazardy to ilość cykli zmniejszyła się o 95.