Architektura Komputerów 2 – Laboratorium nr 6 – Jednostka zmiennoprzecinkowa (FPU)

Rejestry jednostki zmiennoprzecinkowej

Koprocesor dysponuje ośmioma 80-bitowymi rejestrami zmiennoprzecinkowymi i trzema 16-bitowymi rejestrami kontrolnymi (control word, status word i tag word). Rejestry zmiennoprzecinkowe połączone są w stos. Możemy wczytywać do nich wartości rozkazami fld (Fpu LoaD) oraz pobierać z nich wartości – fstp (FPU STore and Pop). Mamy do nich dostęp poprzez nazwę ST i numer rejestru – ST(n). Wartości zawsze wstawiane są do rejestru ST(0), a wszystkie pozostałe rejestry zmieniają wtedy swoją numerację – 0 przechodzi na 1, 1 na 2 itd. Analogicznie podczas pobierania wartości z tego “stosu”, pobierana jest wartość z rejestru ST(0), a pozostałe zmieniają numerację w przeciwnym kierunku.

Podstawowe rozkazy jednostki zmiennoprzecinkowej

Rozkaz Opis
fld REJESTR_ST Ładuje zawartość innego podanego rejestru ST do ST(0) i przesuwa numerację wszystkich rejestrów, włącznie z tym z którego pobierana jest wartość, w górę.
fldl ZMIENNA/ADRES Podobnie jak poprzednio jednak ładowany jest float lub double z pamięci określonej przez etykietę zmiennej lub adres w rejestrze (wtedy mnemonik rejestru należy umieścić w nawiasie).
fld1 Do ST(0) ładowana jest stała 1.0, a pozostałe rejestry są “przesuwane”.
fldz -||- 0.0 -||-
fldpi -||- liczba PI (3.1415926) -||-
fst REJESTR_ST Wartość z rejestru ST(0) jest umieszczana w innym rejestrze ST. Numeracja rejestrów nie ulega zmianie.
fstp REJESTR_ST lub nic Wartość z rejestru ST(0) jest kopiowana do innego podanego rejestru lub tracona, następnie wszystkie rejestry zmieniają swoją numerację (1->0, 2->1 itd.).
fstpl ZMIENNA/ADRES Wartość z rejestru ST(0) kopiowana jest do zmiennej lub do pamięci pod adres sprecyzowany w innym rejestrze ogólnego przeznaczenia podanym w nawiasie. Numeracja rejestrów zmienia się jak poprzednio.
fxch REJESTR_ST Zawartości rejestru ST(0) i innego podanego jako operand rozkazu są wymieniane.
fabs Oblicza wartość bezwzględną z liczby w ST(0) i zapisuje ją do ST(0).
fadd CEL, ŹRÓDŁO Dodaje zawartość ŹRÓDŁO do CEL i zapisuje wynik do CEL. ŹRÓDŁO i CEL to mnemoniki rejestrów ST.
faddl ZMIENNA/ADRES Dodaje do ST(0), liczbę z pamięci.
fsub CEL, ŹRÓDŁO Odejmuje zawartość ŹRÓDŁO od CEL i zapisuje wynik do CEL. ŹRÓDŁO i CEL to mnemoniki rejestrów ST.
fsubl ZMIENNA/ADRES Odejmuje liczbę z pamięci od ST(0).
fmul CEL, ŹRÓDŁO Mnoży zawartość CEL przez ŹRÓDŁO i zapisuje wynik do CEL. ŹRÓDŁO i CEL to mnemoniki rejestrów ST.
fmull ZMIENNA/ADRES Mnoży zawartość ST(0) przez liczbę z pamięci.
fdiv CEL, ŹRÓDŁO Dzieli zawartość CEL przez ŹRÓDŁO i zapisuje wynik do CEL. ŹRÓDŁO i CEL to mnemoniki rejestrów ST.
fdivl ZMIENNA/ADRES Dzieli zawartość ST(0) przez liczbę z pamięci.
fsqrt Oblicza pierwiastek z liczby zapisanej w ST(0) i zapisuje wynik do ST(0).

Rejestr kontrolny

W rejestrze kontrolnym (control word) zapisane są ustawienia jednostki FPU. Przy pomocy rozkazu fstcw można zapisać jego zawartość do pamięci, a następnie instrukcją mov przenieść do rejestru ogólnego przeznaczenia. Poszczególne bity tego rejestru odpowiadają min. za sposób zaokrąglania wartości, czy dokładność obliczeń. Możemy je zmienić, a następnie zapisać do rejestru w analogiczny sposób, umieszczając jego zawartość w pamięci i rozkazem fldcw ładując ustawienia. Zostało to dokładniej przedstawione w zadaniu pierwszym i drugim, gdzie odczytywane i zmieniane są parametry pracy jednostki zmiennoprzecinkowej.

Zadanie pierwsze – Wyświetlanie i zmiana precyzji obliczeń

Kod C:

Kod Asemblerowy:

Zadanie drugie – Wyświetlanie i zmiana sposobu zaokrąglania

Kod C:

Kod Asemblerowy:

Szereg Taylora

Kolejnym zadaniem domowym był program przybliżający wartość funkcji sinus korzystając z rozwinięcia szeregu Taylora. Na zajęciach napisana została modyfikacja tego programu, tak aby przybliżana była wartość cosinusa. Oba programy są niemal identyczne.

Wartość funkcji sinus w zadanym punkcie przybliżana jest ze wzoru x -x3/3! +x6/6! ... +((-1)n * x2n-1)/(2n-1)!. Program nie liczy w każdym obiegu pętli kolejnych wyrazów ciągu, a jedynie je uzupełnia. Pierwszym wyrazem ciągu jest x – wartość kąta w radianach podana przez użytkownika. Następnym: poprzednia wartość ciągu * -x2 / (Y+1)(Y+2) gdzie (Y+1)(Y+2) to 2 kolejne “wyrazy” silni, przy założeniu że początkowo silnia jest równa 1.0. Dla drugiego wyrazu przyjmie ona wtedy wartość 1.0*2.0*3.0, co daje 3!. Przy obliczaniu wartości funkcji cosinus, początkowym wyrazem nie jest kąt podany przez użytkownika, a wartość 1.0. Silnie również zaczynamy liczyć od 0.0, tak aby dla pierwszego wyrazu przyjęła ona wartość 2!, a nie 3! (nie mnożymy wartości przez 0.0, pierwszym wyrazem jest (Y+1)(Y+2)).

Zadanie trzecie – Aproksymacja funkcji Sinus

Kod C:

Kod Asemblerowy:

Zadanie czwarte – Aproksymacja funkcji Cosinus

Kod C:

Kod Asemblerowy:

Specjalne podziękowania dla Mateusza Gniewkowskiego za pomoc w przygotowaniu tego wpisu :-)

6 myśli do „Architektura Komputerów 2 – Laboratorium nr 6 – Jednostka zmiennoprzecinkowa (FPU)”

  1. przepraszam ze tutaj komentuje, ale nie znalazlem innej drogi

    czy moglbys na nadajniki.olo.ovh zrobic jakas mozliwosc filtrowania po firmie? filtr pozytywny i negatywny (np. zeby mozna bylo odfiltrowac lokalna energetyke ktora ma wiekszosc infrastruktury w okolicach wiejskich i zostawic wszystko inne)

    1. niestety nie jest to możliwe, ale zapraszam na http://http://uke.kurylowicz.info/, to chyba to czego szukasz. moja mapa jest generowana w google fusion tables, jako warstwa mapy google. wykonałem to w ten sposób, ponieważ punktów jest na prawdę dużo, a chcę wyświetlić je wszystkie. jeśli miały by one być nanoszone na mapę w skrypcie js, co pozwoliło by na ich filtrowanie, załadowanie mapy po wejściu na stronę trwało by wieki.

    1. Proszę wyczyścić ciasteczka, tam zapisana jest zgoda. Coś musiało pójść nie tak. Czy mogę prosić o informacje jaki to telefon? Kopanie jest zablokowane na telefonach, a na komputerach nie powinno zużyć więcej jak 25% mocy CPU.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *