Sprawozdanie z ćwiczeń laboratoryjnych nr 2: Koprocesor arytmetyczny 1. Cel ćwiczenia: Opracowanie 3 programów z wykorzystaniem koprocesora arytmetycznego: * Obliczenie długości przeciwprostokątnej w trójkącie prostokątnym * Sprawdzenie warunku jedynki trygonometrycznej * Sprawdzenie wzoru: tan(3*a)=(3*tan(a)-(tan(a))^3/(1-3*(tan(a))^2) 2.. Programowanie koprocesora Dołączenie koprocesora - zwiększenie liczby rozkazów - specjalne rejestry z nimi związane. Rozkaz z przedrostkiem ESC ma postać 1101 1xxx - do wykonania przez koprocesor. Rozkazy zaczynają się od literki F. Koprocesor dedykowany do obliczeń matematycznych z dużą dokładnością. Procesor powiększył się o 8 rejestrów o długości 80 bitów: R0-R7 (lub R1-R8). Bity 0-63 przeznaczone na mantysę, 64-78 na cechę, 79 na znak. W rejestrze organizacyjnym „status register” są flagi dotyczące rejestrów R1-R8. 3-bitowe pole pokazuje który z rejestrów jest szczytem stosu. W koprocesorze jest wbudowanych wiele funkcji matematycznych, np. począwszy od koprocesora 387 jest funkcja sinus. Rozkaz koprocesora zajmuje wiele taktów, w tym czasie procesor może wykonywać inne rozkazy. Od 386 nie ma problemu z synchronizacją. Normalnie program nie może pracować na danych, których nie obrobił koprocesor - dotyczy języków wyższego rzędu - założenie że na przemian. W asemblerze można to wykorzystać. Gdy nie ma pewności to rozkaz WAIT wstrzymuje pracę procesora głównego. Lista rozkazów koprocesora obejmuje m.in. a) rozkazy transmisji danych: (przesłań) FBLD - załaduj liczbę w kodzie BCD FBSTP - odczyt z odpowiedniego rejestru SP i zapis do pamięci w kodzie BCD FLD - umieść na wierzchołku stosu argument zmiennoprzecinkowy FILD - jw. ale argument stałoprzecinkowy FST - zapisz wartość z wierzchołka stosu w argumencie zmiennoprzecinkowym FSTP - jw. ale ze zdjęciem ze stosu FIST - zapisz wartość z wierzchołka stosu w argumencie stałoprzecinkowym FSTP - jw. ale ze zdjęciem ze stosu b) Rozkazy operacji arytmetycznych FABS - oblicz wartość absolutną FADD - dodaj argumenty zmiennoprzecinkowe FIADD - jw. ale argumenty stałoprzecinkowe FMUL - mnożenie argumentów zmiennoprzecinkowych FIMUL - jw. ale argumentów. stałoprzecinkowych FDIV - dzielenie argumentu docelowego przez źródłowy FDIVR dzielenie argumentu źródłowego przez docelowy argument źródłowy na szczycie stosu, a docelowy poniżej lub ST(i) lub zmienna FCHS - zmień znak FPREM, FPREM1 - standaryzacja liczby - zmiana normy FSCALE - skalowanie FSQRT - pierwiastek kwadratowy FSUB, FSUBP, FISUB - odejmowanie FSUBR, FSUBPP, FISUBP - odejmowanie z zamianą miejsc wyniku c) Rozkazy porównania: FCOM, FCOMP, FCOMPP, FICOM, FICOMP FLST - testuj na zero Inne: FUCOM, FUCOMP, FUCOMPP, FXAM d) Rozkazy funkcji trygonometrycznych i wykładniczych F2XM1, FCOS (cos kąta), FPATAN (tangens kąta), FPTAN, FSIN (sin), FSINCOS (równocześnie sin i cos - do różnych rejestrów), FYL2X, FYL2XP1 (logarytmy) e) Rozkazy generujące stałe FLD1 - załaduj 1 na stos FLDZ - załaduj zero na stos FLDPI - załaduj PI na stos FLDL2E - załaduj log(2) przy podstawie 2 na stos FLDL2T - log z 10 przy podstawie 2 f) rozkazy sterujące koprocesorem INIT - inicjalizacja koprocesora g) Inne FFREE - zwolnij pozycję stosu REJESTR STANU KOPROCESORA ie - błąd operacji niedozwolonej de - błąd zdenormalizowanego argumentu ze - błąd dzielenia przez zero oe - błąd nadmiaru ue - błąd niedomiaru pe - błąd niedokładności wyniku st - wskaźnik wierzchołka stosu 3. Sprawozdanie z wykonania ćwiczeń Opracowano - pod kierunkiem prowadzącego zajęcia z laboratorium -3 programy, 2 całkowicie na laboratorium, trzecie dokończono w domu. Programy w asemblerze zaczynają się na literę F. Działamy w oparciu o stos 8-pozycyjny. Umieszczamy argumenty i uzyskujemy wynik Programy pisano pod edytorem, uruchmiano TASM z opcją /zi, następnie TLINK z opcją /v i testowano działanie przy pomocy programu TD (Turbo debugger). W opcji View włączono procesor numeryczny - pokazuje się stos (Empty ST(0) .. Empty ST(7)) oraz znaczniki błędów: ie, de, ze, oe, ue, pe, st. Program testowano krokowo F7 oglądają wyniki - Empty zamienia się na Valid z przypisanymi wartościami liczbowymi. Wykorzystywano Add Watch (Ctr F7) w celu oglądania wartości zmiennych. Wartości przypisywano zmiennym przy pomocy DQ - definiowanie słowa 4-bajtowego. Programy pisano jakby dla wersji COM, występuje tylko segment kodu (CODE) z dyrektywą ASSUME CS:CODE, DS:CODE, ORG 100H (przesuń początek o 100 bajtów), etykieta START:, polecenia koprocesora z literą F na początku, na końcu MOV AX,4C00H, INT 21H, definicje zmiennych i przypisanie im wartości, w końcu koniec segmentu kodu (CODE ENDS) i koniec programu END z etykietą skąd program ma być uruchomiony (END START). Program PROG1.ASM - obliczenie długości przeciwprostokątnej: c=sqrt(a^2+b^2) wykorzystano polecenia: FLD zmienna - załaduj zmienną na stos, FMUL ST, ST(0) - kwadrat argumentu ze szczytu stosu, wynik na szczycie, FADDP - dodaj argumenty zdjęte ze stosu, FSQRT - pierwiastek z wartości na szczycie stosu, FSTP zmienna - zapisz wynik zmiennoprzecinkowy w zmiennej (zmienna).. Program testowano przy użyciu TD metodą krokową F7. Program PROG2.ASM - sprawdzenie wzoru na jedynkę trygonometryczną: Wykorzystano dodatkowo funkcje FSIN (sin) i FCOS (cos) dla argumentu ze szczytu stosu. Program PROG3.ASM - sprawdzenie wzoru: Wykorzystano m.in. funkcje: FPTAN - tg, FDIVR, FSTP zmienna - podstaw pod zmienną ze zdjęciem ze stosu, FSUB - odejmowanie, FST zmienna - zapis do zmiennej, FLD1 załaduj 1 na stos. Musiano opróżniać stos metodą FSTP śmieć czy FFREE. 4. Wnioski: Zauważono wysoką dokładność obliczeń i doceniono rolę Turbo Debuggera do testowania programów i śledzenia kolejnego wykonywania rozkazów bez umieszczenia w programie rozkazów do wprowadzania danych (dane zaszyte w kodzie) i wyprowadzania wyników.