Kurs programowania w asemblerze
Koprocesory
Koprocesor służy do wspomagania procesora w skomplikowanych obliczeniach. Wykonuje szybciej działanie 3.1234121 razy 5.12314424 niż procesor 3*5. Dzięki wykorzystaniu jego w swoich programach będą one działały znacznie szybciej i pewniej. Posiada własny stos, za pomocą którego komunikuje się z procesorem. Nie potrafi natomiast wykorzystywać jego rejestrów, przez co obsługa jest trochę bardziej skomplikowana. Wszystkie dane zapisane na stosie koprocesora zapisane są jago liczby rzeczywiste. Jeśli więc kładziemy na stos liczbę całkowitą musi ona być najpierw przekonwertowana, co zajmuje odpowiednią ilość czasu.
Stos koprocesora składa się z 8 poziomów ponumerowanych od 0 do 7. Szczyt stosu ma numer 0. Pola wskazuje się poprzez napisanie ich jako parametr np.:
ST(i) (ewentualnie bez nawiasów, np. ST0, ST1 itp)
Koprocesor umieszcza każdą nową daną na szczycie stosu (st0), przesuwając pozostałe o jedno pole w dół. Działa więc inaczej niż stos procesora. Ma to jednak dobre zastosowanie.
Zmienne rzeczywiste tworzy się za pomocą dyrektywy DD, DQ i DT. Liczbę zapisujemy używając kropki, nawet jeśli reszta wynosi 0, gdyż po niej kompilator rozpoznaje, że jest to liczba rzeczywista, czyli np.:
XDD 13.2 PI DD 3.13159
Wartości zapisuje się również w inny sposób. Każda taka liczba składa się z trzech pól: znak, wykładnik (potęga 10), mantysa, np:
-3.1415=-31415*10-4=31415e-4
Jeśli więc chcemy podzielić 10 przez 5 używając koprocesora, napiszemy:
.model tiny .code org 100h start: finit fild [x] ; 10 na stos fild [y] ; 5 na stos fdiv ; podziel 10/5 fist [x] ; wynik do X ret x DD 10 y DD 5 End start
Poniżej zamieściłem listę funkcji wykonywanych przez koprocesor arytmetyczny
| Mnemonik | Opis |
|---|---|
| FABS | Opis: Wartość bezwzględna |
| FADD | Opis: Dodaje liczby rzeczywiste: FADD komórka ; st=st+komórka FADD st,st(i) ; st=st+st(i) FADD st(i),st ; st(i)=st)i)+st |
| FADDP | Opis: Dodaje liczbę rzeczywistą i usuwa ją ze stosu: FADDP st(i),st ; st(i)=st(i)+st |
| FBLD | Opis: Ładuje liczbę dziesiętną upakowaną w kodzie BCD |
| FBSTP | Opis: Zapamiętuje liczbę dziesiętną upakowaną znajdującą się na szczycie stosu we wskazanej, jako parametr komórce pamięci i usuwa ją ze stosu. |
| FCHS | Opis: Zmienia znak liczby |
| FCLEX FNCLEX |
Opis: Zeruje znacznik odstępstwa |
| FCOM | Opis: Porównuje liczby rzeczywiste |
| FCOMP | Opis: Porównuje liczby rzeczywiste i usuwa wierzchołek stosu |
| FCOMPP | Opis: Porównuje liczby rzeczywiste i usuwa je ze stosu |
| FCOS | Opis: Cosinus ST(0) |
| FDECSTP | Opis: Zmniejsza wskaźnik stosu |
| FDISI FNIDISI |
Opis: Wyłącza przerwania |
| FDIV | Opis: Dzieli liczby rzeczywiste: FDIV komórka ; st=st/komórk FDIV st(i),st ; st(i)=st(i)/st FDIV st,st(i) ; st=st/st(i) |
| FDIVP | Opis: Dzieli liczbę rzeczywistą i usuwa ze stosu |
| FDIVR | Opis: Dzieli odwrotnie liczby rzeczywiste |
| FDIVRP | Opis: Dzieli odwrotnie liczby rzeczywiste i usuwa je ze stosu |
| FENI FNEI |
Opis: Zezwala na przerwania |
| FREE | Opis: Zwalnia rejestr |
| FIADD | Opis: Dodaje liczby całkowite |
| FICOM | Opis: Porównuje liczby całkowite |
| FIDIV | Opis: Dzieli liczby całkowite |
| FIDIVR | Opis: Dzieli odwrotnie liczby całkowite |
| FILD | Opis: Ładuje liczbę całkowitą |
| FIMUL | Opis: Mnoży liczbę całkowitą |
| FINCSTP | Opis: Zwiększa wskaźnik stosu |
| FINIT FININIT |
Opis: Inicjuje procesor. Używaj tej instrukcji tylko na początku programu. Wykonuje ona coś w rodzaju "zresetowania" koprocesora. |
| FIST | Opis: Zapamiętuje liczbę całkowitą znajdującą się na szczycie stosu we wskazanej, jako parametr komórce pamięci. Nie zmienia zawartości stosu. |
| FISTP | Opis: Zapamiętuje liczbę całkowitą znajdującą się na szczycie stosu we wskazanej, jako parametr komórce pamięci i usuwa ją ze stosu. |
| FISUB | Opis: Odejmuje liczby całkowite |
| FISUBR | Opis: Odejmuje odwrotnie liczby całkowite |
| FLD | Opis: Ładuje liczbę rzeczywistą na szczyt stosu. Można również ładować na szczyt stosu wartość innego pola stosu, np.: FLD liczba ; załadowanie liczby FLD ST(0) ; powielenie szczytu stosu |
| FLDCW | Opis: Ładuje słowo kontrolne |
| FLDENV | Opis: Ładuje środowisko |
| FLDLG2 | Opis: Ładuje logarytm dziesiętny z 2 na szczyt stosu |
| FLDLN2 | Ładuje logarytm naturalny z 2 na szczyt stosu |
| FLD2E | Ładuje logarytm dwójkowy z liczby e na szczyt stosu |
| FLDL2T | Opis: Ładuje logarytm dwójkowy z 10 na szczyt stosu |
| FLDPI | Opis: Ładuje liczbę Pi na szczyt stosu |
| FLDZ | Opis: Ładuje liczbę 0.0 na szczyt stosu |
| FLD1 | Opis: Ładuje liczbę 1.0 na szczyt stosu |
| FMUL | Opis: Mnoży liczby rzeczywiste: FMUL komórka ; st=st*komórk FMUL st(i),st ; st(i)=st(i)(st FMUL st,st(i) ; st=st*st(i) |
| FMULP | Opis: mnoży liczby rzeczywiste i usuwa je ze stosu |
| FNOP | Opis: Instrukcja pusta |
| FPATAN | Opis: częściowy Arcus Tangens |
| FPREM | Opis: Częściowa reszta |
| FPREM1 | Opis: Częściowa reszta |
| FPTAN | Opis: Częściowy tangens |
| FRNDINT | Opis: Zaokrągla do liczby całkowitej |
| FRSTOR | Opis: Ładuje zapamiętany stan |
| FSAVE FNSAVE |
Opis: Zapamiętuje stan |
| FSCALE | Opis: Skaluje |
| FSETPM | Opis: Przejdź w tryb wirtualny |
| FSIN | Opis: Sinus ST(0) |
| FSINCOS | Opis: Sinus i Cosinus ST(0) |
| FSQRT | Opis: Pierwiastek kwadratowy |
| FST | Opis: Zapamiętuje liczbę rzeczywistą znajdującą się na szczycie stosu we wskazanej, jako parametr komórce pamięci. Nie zmienia zawartości stosu. |
| FSTCW FNSTCW |
Opis: Zapamiętuje słowo kontrolne |
| FSTENV FNSTENV |
Opis: Zapamiętuje środowisko |
| FSTP | Opis: Zapamiętuje liczbę rzeczywistą znajdującą się na szczycie stosu we wskazanej , jako parametr komórce pamięci i usuwa ją ze stosu. |
| FSTSW FNSTSW |
Opis: Zapamiętuje słowo stanu |
| FSTSW
AX FNSTSW AX |
Opis: Zapamiętuje słowo stanu do AX |
| FSUB | Opis: Odejmuje liczby rzeczywiste: FSUB komórka ; st=st-komórk FSUB st(i),st ; st(i)=st(i)-st FSUB st,st(i) ; st=st-st(i) |
| FSUBP | Opis: Odejmuje liczbę rzeczywistą i usuwa ją ze stosu: FSUBP st(i),st ; st(i)=st(i)-st |
| FSUBR | Opis: Odejmuje odwrotnie liczby rzeczywiste: FSUBR komórka ; st=st-komórk FSUBR st(i),st ; st(i)=st(i)-st FSUBR st,st(i) ; st=st-st(i) |
| FSUBRP | Opis: Odejmuje odwrotnie liczbę rzeczywistą i usuwa ją ze stosu |
| FTST | Opis: Sprawdza, czy wierzchołek stosu=0.0 |
| FUCOM | Opis: Porównuje |
| FUCOMP | Opis: Porównuje i usuwa ze stosu |
| FUCOMPP | Opis: Porównuje i usuwa dwukrotnie ze stosu |
| FWAIT | Opis: CPU czeka, gdy 80x87 jest zajęty |
| FXAM | Opis: Sprawdza wierzchołek stosu |
| FXCH | Opis: Wymienia wskazany jako parametr rejestry ze szczytem stosu. |
| FXTRACT | Opis: Rozdziela cechę i mantysę |
| FYL2X | Opis: Y*logarytm dwójkowy z X |
| FYL2XP1 | Opis: Y*logarytm z (X+1) |
| F2XM1 | Opis: 2X-1 |
