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

Autor: Karol Wierzchołowski, opracowano: 12.01.2002 r. Wszelkie prawa zastrzeżone.
Kontakt

Jeśli chcesz się z nami skontaktować napisz na adres: info(at)binboy.org lub odwiedź nasz profil na Facebooku!

O Nas

Serwis binboy.org to kopalnia wiedzy dla wszystkich z branży IT, w szczególności dla programistów i webmasterów. To duży zbiór kursów programowania, tutoriali, darmowych ebooków, setki kodów źródłowych itp.

Bądź w kontakcie

Panel użytkownika

Zaloguj się do panelu użytkownika.
Nie masz konta? Zarejestruj się!
Zapomniałeś hasła?