Struktura stanowiska laboratoryjnego Na rysunku 1.1. pokazano strukturę stanowiska pomiarowego, na rysunku 1.2. najwaŝniejsze przyciski manipulacyjne na konsoli obserwacyjno- sterującej. Rys.1.1. Struktura stanowiska z mikroprocesorem 80486 Rys.1.2. Konsola obserwacyjno- sterująca 2
I Koprocesor Intela 1. Zapoznaj się z zapisem zmiennoprzecinkowym liczb, 2. W celu sprawdzenia zasad zapisu załaduj na wierzchołek stosu rejestrów koprocesora liczbę π a potem prześlij ją do pamięci w formacie 32- bitowym. a) µp startuje od lokacji FFFFFFF0 gdzie w nastawianej pamięci (16 bajtów) są umieszczone rozkazy: MOV SP, #1000 JMP (0000) : (0400) (k. oper BC) (k. oper EA) przesun. segment. Wartości odczytywane na wyświetlaczach to: adres dane 31 0 31 0 FF FF FF F0 FF FF FF F4 FF FF FF F8 FF FF FF FC EA 10 00 BC 04 00 00 00 dalsze wartości są bez znaczenia ZauwaŜ odwrotną kolejność bajtów!!! b) Począwszy od 4000h wpisz program: FLD, PI (D9, EB) FST, (5000h) (D9, 16, 00 50) JMP (EB FE)- skok do samego siebie Zapisujemy bajty kodu oczywiście w odwrotnej kolejności. W tym celu naleŝy przejąć magistralę przyciskiem BR3 na konsoli (rys1.2.), przy pomocy przycisku ADRES-DANA (rys.1.2.) ustawić adres 00004000h. Ponownie przyciskiem ADRES-DANA zmienić tryb edycji na- dane. Wpisać kolejne bajty programu zapisując je do pamięci przyciskiem WRITE (rys.1.2.). adres Dane 31 0 31 0 00 00 40 00 00 00 40 04 16 D9 EB D9 FE EB 50 00 3
W rozkazie FST występuje adres bezpośredni 5000h. Zapisywany w kolejności: młodszy bajt, starszy bajt za kodem operacyjnym. Stosując dalej tą adresację pamiętaj Ŝe: - mod = 00 - r/m = 110 - bajt s-i-b nie występuje (tryb rzeczywisty) Po wprowadzeniu kodu wyzeruj µp i przekrokuj. ZauwaŜ, Ŝe po odczycie kodu spod adresu 4004 µp mógłby juŝ wyprowadzić π pod lokacją 5000. JednakŜe ze względu na długą kolejkę µp wpierw odczyta sekwencyjnie 32 bajty (tj. 8 cykli magistrali). Liczbę naleŝy odczytywać w naturalnej kolejności 1. bit domyślny Znak S Wykładnik (exp) mantysa (fraction) Mantysa przyjmuje wartości od 1.0 do prawie 2 (1.1... 1) Posługując się powyŝszym schematem zamień liczbę wyniku na liczbę dziesiętną. Aby otrzymać wykładnik E naleŝy od pola exp odjąć tzw. Bazę B = 01111111 E = EXP B Wartość E moŝe być więc dodatnia lub ujemna. JeŜeli E=0 to mantysa jest wprost liczbą zmiennoprzecinkową E>0 to przesuwamy przecinek mantysy w prawo E<0 to w lewo. Po przesunięciu wagi kolejnych bitów za przecinkiem to: 1 1 1,,, itd. 2 4 8 Obliczenia π wykonaj z niedomiarem ograniczając się do kilku pierwszych liczb po przecinku. Wynik programu- stan linii danych przy zapisie do komórki 00000500h Postać binarna liczby zmiennoprzecinkowej 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 4
Postać binarna po zamianie 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 Liczba dziesiętna Zapis zmiennoprzecinkowy liczby E 1. Wartości zmiennoprzecinkowe liczb 1 i 2 (dokładność 32-bitowa). To odpowiednio: 2 (zmp) = 40000000 1 (zmp) = 3F800000 Otrzymane wartości wpisz odpowiednio do lokacji 5100h i 5200h. 2. Wyznacz zmiennoprzecinkową wartość liczby e Wśród instrukcji koprocesora nie ma ładowania takiej stałej do rejestru wierzchołka stosu. Wykorzystaj więc ładowanie stałej log 2 e (instrukcja FLD2E) a następnie wykorzystaj toŝsamość log e 2 2 = e Nie moŝna z niej skorzystać od razu, gdyŝ odnośna instrukcja (F2XH1) wymaga wykładnika w: w 1. NaleŜy więc wartość na wierzchołku stosu podzielić wpierw przez 2 (przez zawartość lokacji 5200h). PoniewaŜ rozkaz F2XH1 odejmuje jeszcze od wyniku 1, tj. 1 log2 e 2 2 1 trzeba do rezultatu na wierzchołku dodać zawartość lokacji 5100h. Otrzymana wartość 1 2 log 2 2 e = e wymaga ostatecznie podniesienia do kwadratu. Realizujemy je przez mnoŝenie rejestru wierzchołka przez siebie, wynik na tym samym miejscu (pamiętaj Ŝe pola tego rozkazu przyjmują wartości: d = 0, ST(i) = 000). Tak więc cała procedura to ciąg instrukcji: FINIT (inicjalizacja cp) 5
FLD2E FDIV (ST(0) by real, 32 argument) mod = 00, r/m = 110, s-i-b nieobecny, adres 5200h F2XM1 FADD - j.w., adres 5100h FMUL (ST(d) ST(0) x ST(i)) FST zapisz pod lokację 5300h JMP (EB, FE) Zapisz program w postaci heksadecymalnej w tabeli: Adres 00004000 00004004 00004008 0000400C 00004010 00004014 00004018 0000401C 00004020 Kod Zakoduj, wpisz od adresu 4000h, wpisz do pamięci przy pomocy konsoli obserwacyjno- sterującej. Przekrokuj obserwując czynności µp (kolejka), otrzymany wynik przelicz udowadniając poprawność podanej liczby e = 2,708281828... Zapisz w protokole zaliczeniowym: Wynik programu- stan linii danych przy zapisie do komórki 00000500h Postać binarna liczby zmiennoprzecinkowej 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 Postać binarna po zamianie 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 6
Liczba dziesiętna II 80486 pamięć podręczna (pp) 1. Organizacja 4-blokowa po 2kB razem 8kB. Tak wiec dół adresu wybiera miejsce w bloku. Miejsce to jest 4-krotnie powielone. Po aktywacji pp µp pobierając kod programu równocześnie kopiuje go w pp. Wybór linii odbywa się wg 11-tu linii najmłodszych bitów adresu (2kB). Do linii zostaje dopisane: góra adresu (21 bitów) oraz odczytywane bajty, ustawiony zostaje bit waŝności v. Widać więc, Ŝe gdy pojawi się kontakt o takich samych dolnych bitach adresowych dane i góra adresu zostają przyporządkowane do tej samej linii. Aby nie pojawił się efekt nadpisywania (zamazywania) tworzy się struktury wieloblokowe (tu 4 bloki). Tak więc bez obawy wypychania pp moŝe pomieścić w jednej linii 4 porcje informacji o takich samych dolnych adresach. Aby usprawnić przesyłanie danych przyjęto, ze najmniejszą porcją danych, na której operuje pp to 16 bajtów (ta porcjom operuje µp przy transferze blokowym magistrali). Organizacja linii w pp (jest ich 128) LRU V 0 Górny adres 0 V 16 bajtów Górny V 16B Górny V 16B Górny V adres 1 adres 2 adres 3 #0 #1 #2 #3 16B #0,#1,#2,#3 alternatywne linie w polu górny adres jest tez bit waŝności linii v Na blokach LRU zapisano informację o numerze linii najdawniej zapisanej przy konieczności zapisu pod ta lokację pp linia ta zostanie zamazana. 2. Wpisz program, który wprowadzi do pamięci zewnętrznej stan początkowy rej. CR sterującego m.in. pp (bity CD i NW). Następnie µp, pośrednio przez akumulator, wyzeruje te bity inicjując pp. Kolejną czynnością będzie skok do samego siebie. Zostanie on odczytany dalej z pp i µp wstrzyma wykonywanie cykli zewnętrznych (skok JMP będzie pobierany z pp). pref 66 MOV EAX,CR 66,0F,20,C0 pref 66 MOV (#7000),EAX 66,A3,00,70 pref 66 MOV EAX,#00000010 66,C7,C0,10,00,00,00 pref 66 MOV CR,EAX 66,0F,22,C0 NOP 90 JMP EB,FE /przedrostek 66 wymusza rozmiar 32 bitowy rejestrów gdyŝ w trybie rzeczywistym, w którym znajduje się µp jest dostęp tylko do 16 bitów rejestrów (AX a nie EAX) Program ten wpisz począwszy od lokacji #4000 pamiętając o odwrotnym początku bajtów. 7
Przekrokuj i zauwaŝ, Ŝe: - zapis pod 7000 jest dopiero po odczytaniu 32 bajtów kodu (kolejka) - sprawdź stan początkowy bitów CD i NW - zauwaŝ, Ŝe µp po ponownym pobraniu bajtów spod lokacji 4010,14,18,1C ( kolejność zaburzona ze względu na skok ) i odczytanie sąsiedniej* linii ( lokacje 4020,24,28,2C ) zaprzestaje współpracy z magistralą. Przekrokuj przy wyciśniętym KEN ( LED na czołówce CPU zgaszony ) co zauwaŝyłeś? 3. Aby sprawdzić, czy pp ma moŝność zapisania 4 instrukcji o takim samym dolnym adresie ( kwant 2kB )zmodyfikuj podany program umieszczając 4 skoki bezwarunkowe. 6kB JMP - adres 4014 JMP 2kB 4814 JMP 2kB 5014 JMP 2kB 5814 KO skoku bezwarunkowego to E9 zaś przesunięcie jest zawsze o 3 mniejsze poniewaŝ długość tego rozkazu wynosi 3 bajty. Adres 4014 XX,07,FD,E9 4814 07,FD,E9 5014 07,FD,E9 Przesunięcie względne o 6kB to E800. Po odjęciu 3 uzyskujemy E7FD. Tak więc pod lokacjom 5814 wpiszemy: 5814 XX,E7,FD,E9 5815 Przekrokuj i zaobserwuj, Ŝe µp po odczytaniu linii 4014, 10, 1C, 18 itd. dla kolejnych skoków uzupełni jeszcze linie sąsiednie tj. 4020, 24, 28, 2C itd. i rozpocznie pobieranie kodu wyłącznie z pp przestając sterować magistralą. 4. JeŜeli teraz dodamy jeden skok: 8kB JMP 0 JMP 1 JMP 2 JMP 3 JMP 4 2kB...to mimo, iŝ program wykonywany składa się tylko z 15 bajtów a obszar pp to 8kB, µp nie będzie mógł korzystać z pp. Uzupełnij i zmodyfikuj program: 5814 XX,07,FD,E9 (taki sam skok o 2kB) 6014 XX,DF,FD,E9 ( bo ostateczne przesunięcie o 2kB F800 8
4kB F000 6kB E800 8kB E000 a po odjęciu 3: DFFD ) *µp stara się umieścić w kolejce takŝe linię sąsiednią ( adres dolny kolejki ) ze względu na niemoŝliwość wystąpienia instrukcji na przełomie 16-bitowych porcji Intel nie posiada wyrównania binarnego adresów a rozkazy są o dowolnej długości: 1,2,3,4,5...-bajtowe ). Teraz µp czytając JMP 4 umieszcza go w pp na miejscu JMP 0 (najdawniej zapisanego). Wykonując JMP 4 czyta JMP 0. rozkaz ten dopiero co został usunięty z pp - µp umieszcza go ponownie zamazując najdawniej zapisany JMP 1. Rozkaz ten będzie musiał być odczytany z pamięci zewnętrznej po odczycie µp wpisze do pp zamazując tym razem JMP 2 itd. ZauwaŜ, ze µp teraz nie uzupełnia sąsiednich lokacji w pp (tj. Lokacji 4020, 24, 28, 2C itd.). Lista instrukcji mikroprocesora 80486 uŝywanych w ćwiczeniu 9
10
11
12