| STATYSTYKI |
Od 06.09.2000
|
Optymalizacja: 1024x768, IE5 |
|
| Koprocesor |
Koprocesor to jednostka operująca na liczbach zmiennoprzecinkowych przeznaczona specjalnie do szybkich i dokładnych obliczeń matematycznych.
Stos
Koprocesor korzysta w obliczeniach z specjalnego stosu do którego przesyłamy dane przeznaczone
do obliczeń, stos ten składa się z ośmiu "rejestrów" 80 bitowych (10 bajtowych):
ST(0) - wierzchołek stosu
ST(1)
ST(2)
ST(3)
ST(4)
ST(5)
ST(6)
ST(7)
Typy danych
Podczas obliczeń wykorzystujących koprocesor musimy wykorzystywać określone typy danych:
Liczby całkowite:
| Nazwa | Deklaracja | Typ |
| word integer | dw | 16-bitowa liczba ze znakiem |
| short integer | dd | 32-bitowa liczba ze znakiem |
| long integer | dq | 64-bitowa liczba ze znakiem |
| packed-decimal | dt | jest to 18 cyfrowa liczba w kodzie BCD |
Liczby rzeczywiste:
Ich zapis podobny jest do typu double z C++, a więc liczba jest przedstawiona w postaci:
LeX
Gdzie L jest liczbą którą mnożymy przez 10 do potęgi X - e oznacza, że mamy do czynienia z typem rzeczywistym.
Oto mały przykład:
| 3e2 | = 300 |
| 2.5e5 | = 250000 |
| 1.34e-3 | = 0.00134 |
Typ rzeczywisty można deklarować również z wykorzystaniem kropki:
| 3e2 | = 300.0 |
| 2.5e5 | = 250000.0 |
| 1.34e-3 | = 0.00134 |
A oto określone typy liczb rzeczywistych:
| Nazwa | Deklaracja | Typ |
| short real (single) | dd | 32 bitowa liczba zmiennoprzecinkowa |
| long real | dq | 64 bitowa liczba zmiennoprzecinkowa |
| temp real | dt | 80 bitowa liczba zmiennoprzecinkowa |
Jak widzimy deklaracje liczb całkowitych i rzeczywistych są podobne, dlatego też należy zwrócić szczególną uwagę na zapis deklaracji:
| numer1 dd 10 | - deklaracja liczby całkowitej |
| numer2 dd 10.0 | - deklaracja liczby rzeczywistej |
Dodatkowe rejestry
Koprocesor posiada także dwa rejestry dodatkowe w których określa tryb pracy koprocesora oraz jego stan:
Rejestr kontrolny:
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 - bit
Ja opiszę tylko 4 bity :
| 7 | - włączenie, wyłączenie przerwań wywoływanych w przypadku błędów: |
| 0 - wyłączenie |
| 1 - włączenie przerwań |
| 10,11 | - zaokrąglanie liczby (dla instrukcji FRNDINT): |
| 00 - do najbliższej liczby |
| 01 - w dół |
| 10 - w gore |
| 11 - obcięcie |
| 12 | - rodzaj nieskończoności |
| 0 - nie rozróżnia |
| 1 - rozróżnia (dodatnia i ujemna) |
Rejestr stanu:
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 - bit
Bity błędów (ustawiony = wystąpił błąd):
0 - niewłaściwa operacja
1 - zdenormalizowany argument
2 - dzielenie przez zero
3 - przepełnienie
4 - niedopełnienie
5 - precyzja
Bity flag warunkowych:
8,9 - flagi warunkowe (tak jak w procesorze) ich ustawienie określa nam wynik
10,14 - porównania
Instrukcje
Koprocesor podobnie jak procesor posiada własne instrukcje:
FINIT - inicjacja koprocesora
FSTSW - kopiuje rejestr stanu do określonej komórki lub rejestru
np.
| ... | |
| FSTSW AX | ;kopiuje rejestr stanu do AX |
| ... | |
FSTCW - to samo dla rejestru kontrolnego
FLDCW - wstawianie określonej komórki lub rejestru do rejestru kontrolnego koprocesora
np.
| ... | |
| FLDCW AX | ;kopiuje AX do rejestru kontrolnego |
| ... | |
Instrukcje ładujące dane:
FILD - instrukcja lądująca liczby całkowite na wierzchołek stosu - ST(0)
FBLD - instrukcja lądująca liczby w kodzie BCD
FLD - instrukcja ta ładuje liczby rzeczywiste na wierzchołek stosu
np.
| ... | |
| liczba dq 3.454345 | ;liczba rzeczywista |
| ... | |
| FLD liczba | ;ST(0)=liczba |
| ... | |
Instrukcje zdejmujące dane:
FST - kopiuje zawartość wierzchołka (liczba rzeczywista) stosu w podane miejsce
FSTP - przenosi zawartość wierzchołka stosu (liczba rzeczywista) w podane miejsce
FIST - ładuje liczby całkowite we wskazane miejsce
FISTP - przenosi liczby całkowite we wskazane miejsce
FBST - ładuje liczby całkowite (w kodzie BCD) we wskazane miejsce
FBSTP - przenosi liczby całkowite (w kodzie BCD) we wskazane miejsce
np.
| ... | |
| liczba dq ? | ;deklaracja zmiennej |
| ... | |
| FST liczba | ;liczba=ST(0) |
| ... | |
Podstawowe działania matematyczne:
Dodawanie:
FADD - dodaje dwie liczby rzeczywiste, może mieć 2 argumenty
FIADD - dodaje dwie liczby całkowite (dwu- lub cztero- bajtowe),do jej użycia potrzebny jest jeden argument
FADDP - w przeciwieństwie do poprzednich wymaga dwóch argumentów i po wykonaniu działania zdejmuje ze stosu drugi z nich
np.
| ... | |
| liczba dw 123 | ;liczba całkowita |
| liczba2 dq 2.4435345 | ;liczba rzeczywista |
|
| FIADD liczba | ;ST(0)=ST(0)+liczba |
| FADD liczba2 | ;ST(0)=ST(0)+liczba2 |
| FADD ST(0),ST(1) | ;ST(0)=ST(0)+ST(1) |
| FADDP ST(0),ST(3) | ;ST(0)=ST(0)+ST(3),zdjęcie ST(3) |
| ... | |
Odejmowanie:
FSUB - odejmuje liczby rzeczywiste, dozwolone 1 lub 2 argumenty
FISUB - odejmuje liczby całkowite (16 lub 32 bitowych), wymaga jednego argumentu (odjemnika)
FISUBR - to samo co wyżej lecz odjemna i odjemnik zmieniają się miejscami
FSUBP - odejmuje liczby rzeczywiste następnie zdejmując ze stosu drugi argument
FSUBR - to samo co FSUB tylko zamienia kolejność odjemnej i odjemnika
FSUBRP - to co wyżej, w dodatku zdejmuje drugi argument
np.
| ... | |
| liczba dw 124 | ;deklaracja liczby całkowitej |
| liczba2 dq 24.254 | ;deklaracja liczby rzeczywistej |
| ... | |
| FISUB liczba | ;ST(0)=ST(0)-liczba |
| FISUBR liczba | ;ST(0)=liczba-ST(0) |
| FSUB liczba2 | ;ST(0)=ST(0)-liczba2 |
| FSUBRP ST(0),ST(1) | ;ST(0)=ST(1)-ST(0),zdejmuje ST(1) |
| ... | |
Dzielenie:
FDIV - dzieli liczby zmiennoprzecinkowe (wymaga 1-2 argumentów obydwa musza mieć co najmniej 4 bajty)
FIDIV - dzieli 16-32 bitowe liczby całkowite, wymaga jednego argumentu
FIDIVR - to samo ale dzieli w odwrotnej kolejności
FDIVR - to co FDIV tylko w odwrotnej kolejności
FDIVP - to co FDIV ale usuwa ST(0) i przenosi pozostałe rejestry
FDIVRP - dzieli liczby rzeczywiste w odwrotnej kolejności, usuwa ST(0) i przemieszcza w górę pozostałe rejestry
np.
| ... | |
| liczba dw 234 | ;liczba całkowita |
| liczba2 dq 12.465 | ;liczba rzeczywista |
| ... | |
| FDIV liczba2 | ;ST(0)=ST(0)/liczba2 |
| FDIV ST(0),ST(1) | ;ST(0)=ST(0)/ST(1) |
| FIDIV liczba | ;ST(0)=ST(0)/liczba |
| FDIVRP ST(0),ST(1) | ;st(0)=ST(1)/ST(0) i usuwa st(1) |
| ... | |
Mnożenie:
FMUL - mnoży dwie liczby zmiennoprzecinkowe (4-8 bajtowe), dozwolone dwa argumenty
FIMUL - mnoży dwie liczby całkowite (2-4 bajtowe), wymaga jednego argumentu
FMULP - to samo co FMUL lecz zdejmuje ze stosu rejestr ST(0) (musimy podać dwa argumenty)
np.
| ... | |
| liczba dw 156 | |
| liczba2 dq 1.4354 | |
| ... | |
| FMUL ST(0),liczba2 | ;ST(0)=ST(0)*liczba |
| FIMUL ST(0),liczba | ;ST(0)=ST(0)*liczba |
| FMULP ST(1),ST(0) | ;ST(1)=ST(1)*ST(0),usuwa ST(0) |
| ... | |
Koprocesor posiada także inne instrukcje matematyczne - ja opisze 7 podstawowych:
FSIN - instrukcja ta pobiera wielkość konta (w radianach) z wierzchołka stosu ST(0) a następnieoblicza jego sinus i zwraca wynik w tym samym rejestrze
FCOS - to samo dla cosinusa
FPTAN - oblicza tangens na podstawie argumentu dostarczonego w ST(0), wynik zwracany jest jako ułamek w rejestrach:
ST(0) - mianownik
ST(1) - licznik
FSINCOS - funkcja ta oblicza jednocześnie sinus i cosinus kata z wierzchołka stosu zwracającodpowiednio:
ST(0) - cosinus kata
ST(1) - sinus kata
FCHS - zmienia znak liczby na wierzchołku stosu
FABS - oblicza wartość bezwzględną liczby na wierzchołku stosu
FSQRT - wyznacza pierwiastek drugiego stopnia z liczby na wierzchołku
np.
| ... | |
| kat dd 1.5 | ;deklaracja wielkości kata w radianach |
| ... | ;oblicza tangens kata |
| FPTAN | |
| FDIV ST(1),ST(0) | ;wykonuje dzielenie licznik/mianownik |
| ... | |
A oto 5 bardzo przydatne instrukcje:
FFREE - czyści podany jako parametr rejestr
FXCHG - zamienia miejscami ST(0) i podany jako parametr rejestr stosu
FINCSTP - przesuwa wszystkie rejestry koprocesora w stronę ST(0)
FDECSTP - to zamo lecz w odwrotną stronę
FRNDINT - zaokrągla wartość w ST(0) do liczby całkowitej
W skład instrukcji koprocesora również wchodzą instrukcje porównujące:
Instrukcje te dzielą się na :
- porównujące liczby rzeczywiste:
FCOM - porównuje ST(0) i argument, jeżeli nie podamy argumentu to porówna z ST(1)
FCOMP - to samo ale usuwa ST(0)
FCOMPP - porównuje ST(0) i ST(1) i usuwa obydwa
FTST - porównuje ST(0) z 0.0
FUCOM - porównuje ST(0) i ST(1)
FUCOMP - porównuje ST(0) i ST(1), usuwa ST(0)
FUCOMPP - porównuje ST(0) i ST(1), usuwa ST(0) i ST(1)
- porównujące liczby całkowite:
FICOM - porównuje ST(0) z argumentem
FICOMP - porównuje ST(0) z argumentem, usuwa ST(0)
np.
| ... | |
| liczba dd 345.54 | ;liczba rzeczywista |
| liczba2 dd 124.76 | ;liczba rzeczywista |
| ... | |
| FLD liczba | ;ładuje liczba do ST(0) |
| FCOM liczba2 | ;porównuje ST(0) z liczba2 |
| FSTSW AX | ;kopiuje rejestr stanu koprocesora do AX |
| SAHF | ;kopiuje AX do rejestru flagowego procesora |
| JZ skok | ;skacz jeżeli równe |
| ... | |
| skok: | ;etykieta skoku (miejsce dokąd zostanie wykonany skok) |
| ... | |
Pamiętajmy, iż koprocesor nie posiada funkcji które reagowałyby po porównaniu
dlatego też należy skopiować rejestr statusu do AX (lub komórki pamięci),
a następnie skopiować flagi warunkowe do rejestru znaczników koprocesora,
w ten sposób otrzymamy ustawione znaczniki operacji porównania.
©Copyright by FiXER 2001
<<
|
|